2014-11-15 3 views
3

Linux 커널 모듈 내부에서 시스템 호출을 호출하는 데 어려움이 있습니다. 시스템 호출은 표준 C 사용자 공간 프로그램에서 테스트를 거쳤으며 제대로 작동하지만 커널 모듈을 컴파일하고 실행하는 것처럼 보이지 않습니다. 내 사용자 프로그램에서Linux 커널 모듈에서 Linux 시스템 호출을 사용하는 방법

다음 코드 및 시스템 호출 작품을 포함한다 :

#include <linux/unistd.h> 
#define __NR_sys_mycall 343 

extern long int _syscall(long int_sysno,...)__THROW; 

//and then a simple call is done as such 
long value = syscall(__NR_sys_mycall); 

printf("The value is %ld\n",value); 

을하지만 내 리눅스 커널 모듈에서 같은 일을하려고 할 때 하나가 오류라는 에러의 무리를 얻을 : 암시 함수의 'syscall'선언 (_syscall 정의를 포함하지 않은 경우) 또는 구문에 대한 긴 오류 목록 ... 이렇게 가정하면 시스템 호출을 호출하기 위해 커널 공간 버전이 필요합니다. 나는 옳은가 틀린가?

//My LKM code 
#include <linux/module.h> 
#include <linux/unistd.h> 
#define __NR_sys_mycall 343 

static int start_init(void) 
{ 
    long value = syscall(__NR_sys_mycall); 
    printk("The value is %ld\n",value); 

    return 0; 
} 

static void finish_exit(void) 
{ 
     printk("Done!\n"); 
} 

module_init(start_init); 
module_exit(finish_exit); 
+4

왜 커널 모듈에서 시스템 호출을 사용하려고합니까? 커널 모듈에서 시스템 호출을 사용하는 시간의 99.95 %는 수행하려는 작업을 수행하는 잘못된 방법입니다. – tangrs

+0

kmalloc을 반복적으로 사용하고 Linux 메모리 할당 자 중 하나의 재 작업으로 인한 평균 조각화를 측정해야합니다. 시스템 호출은 결과 정보를 제공하고 LKM은 kmalloc을 사용할 수있게합니다 ... 오히려 요구 사항입니다 ... 그래서 할당하고 나서 바로 시스템 호출을 호출하고 싶습니다. – dimlee

+3

커널에서 사용자 공간으로 정보를 내보내는 것 : * sysfs *가 필요한 것을 위해 만들어진 것 같습니다. 문자 장치 드라이버를 작성할 수도 있습니다. * procfs *와 * netlink *도 있습니다. 완전히 새로운 시스템 호출을 작성하는 것은 아마도 당신이하려는 일을하는 가장 정확한 방법 일 것입니다. – tangrs

답변

4

직접 sys_mycall를 호출 할 수 있습니다.

#include <linux/module.h> 
#include <linux/unistd.h> 


static int start_init(void) 
{ 
    long value = sys_mycall (pass_arguments) 
    printk("The value is %ld\n",value); 

    return 0; 
} 

static void finish_exit(void) 
{ 
     printk("Done!\n"); 
} 

module_init(start_init); 
module_exit(finish_exit); 
3

시스템 호출의 대부분은 asmlinkage를 사용하는데 이는 레지스터가 아닌 스택에서 인수를 찾는 것을 의미합니다. 시스템 호출을 호출 할 때 스택에 인수를 전달해야합니다.

또한 많은 시스템 호출이 copy_from_user를 사용합니다. 커널 주소를 시스템 호출에 전달하면 실패합니다.

+0

에 1을 더한 copy_from_user는 커널 주소 버그를 얻습니다. – RootPhoenix

+0

syscall 인수가 항상 스택에 전달되는 것은 아닙니다. 커널뿐만 아니라 아키텍처에 따라 다릅니다. 예를 들어, [x86-64에서 UNIX 및 Linux 시스템 호출에 대한 호출 규칙은 무엇입니까?] (http://stackoverflow.com/questions/2535989/what-are-the-calling-conventions-for-unix-linux -system-calls-on-x86-64) – jrodatus