시스템 호출에서 인자 전달 문제 (기본 예제 문제)
커널 공부중에 있습니다.
시스템 호출을 등록하고 다음의 인자 전달을 위한 예제를 수행중인데
예제와 다른 결과 때문에 더이상 진행을 못하고 있습니다.
아래의 코드는 "리눅스 매니아를 위한 커널 프로그래밍" 책의 4장의 그림 4.15 / 4.16의 내용입니다.
단순히 user 영역에서 x, y 인자값을 전달하여 새로운 System call에서 곱셈 연산후 result를 user 영역에
뿌려주는 코드입니다.
하지만 결과는 user 영역에 아래와 같이
==========================================
[Hello] x = 2 y = 5 result = 0
==========================================
/var/log/message를 통해 본 커널 메시지는
user영역에서 넘겨준 x, y 인자에 어떤값을 넣던 상관없이 항상 아래와 같이
==========================================
[Null] x = 294 y = 123 result = 36162
==========================================
현재 셋팅 상태는 Sulinux 1.0 에 커널버전 2.6.10
어째서 일까요? 커널 버전? 전혀 감을 못잡고 있습니다. 조언 부탁드려요.
-------------------------------
System Call
-------------------------------
int sys_showmult(int x, int y, int *res, char * hello)
{
int error, compute;
error = verify_area(VERIFY_WRITE, res, sizeof(int));
if(error)
return error;
printk("[%s] x = %d y = %d mult = %d \n", hello, x, y, x*y);
compute = x*y;
put_user(compute, res);
return 0;
}
-------------------------------
User Program
-------------------------------
_syscall4(int, showmult, int, x, int, y, int *, result, char *, hello);
int main()
{
int mult_ret = 0;
int x = 2;
int y = 5;
char hello[] = "Hello";
showmult(x,y,&mult_ret,hello);
printf("[%s] %d * %d = %d \n", hello, x, y, mult_ret);
return (0);
}
asmlinkage를 써보시기 바랍니다.
int sys_showmult(int x, int y, int *res, char * hello)
대신
asmlinkage int sys_showmult(int x, int y, int __user *res, char __user *hello)
로 적어주시기 바랍니다. asmlinkage를 생략하면 최적화 과정에서 register로 인자를 받아들일 수도 있습니다.
hello에 대해서도 copy_from_user() 함수로 처리해 주셔야 할 것 같습니다.
결과값인 compute도 copy_to_user() 함수로 처리해 주시는 편이 좋을 것 같네요.
(복사할 변수의 크기가 지정되지 않는게 좀 찜찜합니다)
그럼...
아~ asmlinkage에 그런 기능이~
asmlinkage에 그런 기능이 있는지 몰랐네요.
주어 들은 지식으로 어셈블리에 적용가능하게 하려는 정도로 asmlinkage가 사용되는 줄만 알고
생략하고 있었는데요. ^^
허접한 글 읽어주시고, 멋진 대답 감사합니다.
댓글 달기