시스템 호출을 추가하려는 아키텍처 또는 모든 아키텍처에 대한 시스템 호출을 추가하려는 경우에 따라 다릅니다. ARM에 대한 시스템 호출을 추가하는 한 가지 방법을 설명하겠습니다.
- syscall의 이름을 선택하십시오. 예 :
mysyscall
.
시스템 콜 번호를 선택하십시오.arch/arm/include/asm/unistd.h
에는 각 시스템 호출에 지정된 번호 (__NR__SYSCALL_BASE+<number>
)가 할당 된 방식을 기록해 두십시오. 시스템 콜용 미사용 번호를 선택하십시오. 우리가 그런 추가 콜 번호 (223)를 선택할 수 있습니다 :
#define __NR_mysyscall (__NR_SYSCALL_BASE+223
인덱스 (223)가 헤더 파일에있을 것입니다 경우. 그러면 ARM 아키텍처의 syscall에 223이라는 숫자가 할당됩니다.
아키텍처 특정 시스템 호출 테이블을 수정하십시오.
CALL(sys_mysyscall)
이 함수의 프로토 타입을 추가 linux/arch/arm/kernel/calls.S
년에 223 콜에 해당하는 라인을 변경합니다. 아키텍처가 아닌 시스템 호출을 추가하려고한다고 가정합니다. include/linux/syscalls.h
를하고 콜의 프로토 타입을 추가합니다 : 파일을 편집 arch/arm/kernel/sys_arm.c
을 :
asmlinkage long sys_mysyscall(struct dummy_struct *buf);
당신이이 파일을 제외하고 다음을 수행 ARM을 위해 특별히 추가하고 싶어합니다.
syscall을 어딘가에 구현하십시오. 언제든지 파일을 만드십시오. 예를 들어 kernel/
디렉토리에 있습니다. 당신은 적어도이 필요합니다 :
#include <linux/syscalls.h>
...
SYSCALL_DEFINE1(mysyscall, struct dummy_struct __user *, buf)
{
/* Implement your syscall */
}
참고 매크로, SYSCALL_DEFINE1
을. 끝의 숫자는 시스템 콜이 갖는 입력 매개 변수의 수와 일치해야합니다. 이 경우 시스템 호출에는 1 개의 매개 변수 만 있으므로 SYSCALL_DEFINE1
을 사용하십시오. 두 개의 매개 변수가있는 경우 SYSCALL_DEFINE2
등을 사용하십시오.
개체 파일 (.o)을 넣은 디렉토리의 Makefile에 추가하는 것을 잊지 마십시오.
- 새 커널을 컴파일하고 테스트하십시오. C 라이브러리를 수정하지 않아서
mysyscall()
으로 시스템 호출을 호출 할 수 없습니다.
struct dummy_struct *buf = calloc(1, sizeof(buf));
int res = syscall(223, buf);
이이 ARM에 대한 것을주의 마 : 당신은 첫 번째 인수로 시스템 호출 번호를 취하는 syscall()
기능을 사용해야합니다. 이 프로세스는 다른 아키텍처와 매우 유사합니다.
편집는 : 커널 /의 메이크에 콜 파일을 추가하는 것을 잊지 마십시오.
안녕하세요, OS X에서 커널에 이미 구현되어있는 특정 시스템 호출을 다루는 비슷한 질문이 있습니다. 그러나 구현과 호출은 입력 인수에서 다르게 보인다. 아마도 당신은 여기를 볼 수 있습니다 : http://stackoverflow.com/questions/37656016/osx-setgid-system-call-which-api-is-the-correct-one – Zohar81