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);
왜 커널 모듈에서 시스템 호출을 사용하려고합니까? 커널 모듈에서 시스템 호출을 사용하는 시간의 99.95 %는 수행하려는 작업을 수행하는 잘못된 방법입니다. – tangrs
kmalloc을 반복적으로 사용하고 Linux 메모리 할당 자 중 하나의 재 작업으로 인한 평균 조각화를 측정해야합니다. 시스템 호출은 결과 정보를 제공하고 LKM은 kmalloc을 사용할 수있게합니다 ... 오히려 요구 사항입니다 ... 그래서 할당하고 나서 바로 시스템 호출을 호출하고 싶습니다. – dimlee
커널에서 사용자 공간으로 정보를 내보내는 것 : * sysfs *가 필요한 것을 위해 만들어진 것 같습니다. 문자 장치 드라이버를 작성할 수도 있습니다. * procfs *와 * netlink *도 있습니다. 완전히 새로운 시스템 호출을 작성하는 것은 아마도 당신이하려는 일을하는 가장 정확한 방법 일 것입니다. – tangrs