Linux 커널 4.1.6을 사용하여 시스템 호출을 추가하려고 하는데 내가 찾을 수 있는 모든 문서는 이전 버전에 대한 것입니다. 최신 커널에서 어떻게 수행되는지 아는 사람이나 좋은 참고 자료가 있는 사람이 있습니까?
다음 3단계가 필요합니다.
시스템 호출 테이블에 추가되었습니다. 나는 그들이 이제 Entry.S 대신 Arch/x86/syscalls/syscall_64.tbl을 사용한다는 것을 알았습니다. 그래서 거기에 뭔가를 넣어두었어요.
asm/unistd.h 파일에 추가합니다. 이제 unistd.h 파일이 자동으로 생성되므로 수동으로 업데이트할 필요가 없나요? 따라서 파일이 존재하지 않으므로 이 단계에서는 아무 작업도 수행하지 않습니다. https://stackoverflow.com/questions/10988759/arch-x86-include-asm-unistd-h-vs-include-asm-generic-unistd-h
시스템 호출을 커널로 컴파일합니다. 커널 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 사용 방법을 알고 있어야 합니다.)