Linux 커널 4.x에서 시스템 호출을 추가하는 방법

Linux 커널 4.x에서 시스템 호출을 추가하는 방법

Linux 커널 4.1.6을 사용하여 시스템 호출을 추가하려고 하는데 내가 찾을 수 있는 모든 문서는 이전 버전에 대한 것입니다. 최신 커널에서 어떻게 수행되는지 아는 사람이나 좋은 참고 자료가 있는 사람이 있습니까?

다음 3단계가 필요합니다.

  1. 시스템 호출 테이블에 추가되었습니다. 나는 그들이 이제 Entry.S 대신 Arch/x86/syscalls/syscall_64.tbl을 사용한다는 것을 알았습니다. 그래서 거기에 뭔가를 넣어두었어요.

  2. asm/unistd.h 파일에 추가합니다. 이제 unistd.h 파일이 자동으로 생성되므로 수동으로 업데이트할 필요가 없나요? 따라서 파일이 존재하지 않으므로 이 단계에서는 아무 작업도 수행하지 않습니다. https://stackoverflow.com/questions/10988759/arch-x86-include-asm-unistd-h-vs-include-asm-generic-unistd-h

  3. 시스템 호출을 커널로 컴파일합니다. 커널 2.6 기반 책(Robert Love의 Linux Kernel Development Book)에서 제안한 대로 실제 시스템 호출 코드를 kernel/sys.c에 추가했습니다. 커널을 다시 재컴파일했습니다.

그런 다음 책에서 제안한 대로 클라이언트 프로그램을 작성했지만 이를 컴파일하려고 하면 알 수 없는 유형 이름 "helloworld"가 표시되었습니다. 내 프로그램은 책에 있는 프로그램과 다르지만 구조는 동일합니다.

#include <stdio.h>

#define __NR_helloworld 323 
__syscall0(long, helloworld)

int main()
{
    printf("I will now call helloworld syscall:\n");
    helloworld();

    return 0;
}

인터넷(및 이용 가능한 서적)에는 이러한 정보가 심각하게 부족한 것 같습니다. 또는 Google이 생각하는 것만큼 똑똑하지 않습니다. 어쨌든 어떤 도움이라도 주시면 감사하겠습니다.

감사해요. ~~

답변1

~에 따르면_시스템 호출(2)_syscall0이 매크로 에 대한 매뉴얼 페이지는 더 이상 사용되지 않으며 필수일 수 있습니다 #include <linux/unistd.h>. 실제로 Linux 4.x에는 이 매크로가 없습니다.

그러나 설치할 수 있습니다musl-libc 라이브러리그리고 그 _syscall기능을 활용해보세요.

간단히 간접 참조를 사용할 수 있습니다시스템 호출(2)사용자 코드에서. 따라서 테스트 프로그램은 다음과 같습니다.

#define _GNU_SOURCE         /* See feature_test_macros(7) */
#include <unistd.h>
#include <sys/syscall.h> 
#include <stdio.h>
#define __NR_helloworld 323
static inline long mysys_helloworld(void) { return syscall(__NR_helloworld,NULL); }

int main (int argc, char**argv) {  
   printf("will do the helloworld syscall\n");
   if (mysys_helloworld()) perror("helloworld");
   return 0;
}

위 코드는 테스트되지 않았습니다!

답변2

강사가 사람들이 인터넷에서 잘라내어 붙여넣는 것이 아니라 소스 코드를 읽기를 원한다고 가정하면 이는 틀림없이 잘 설계된 과제입니다. (즉, Linux 커널 코드는 읽기가 쉽지 않습니다. 일반적으로 무슨 일이 일어나고 있는지 이해하려면 세 가지 수준의 매크로를 추적해야 하기 때문에 etag 사용 방법을 알고 있어야 합니다.)

관련 정보