2015-01-24 5 views
0

흥미롭게도 웹에서 간단한 예를 찾을 수 없었습니다. 간단한 예를 들려 주시겠습니까? 예제를 분석하여 다음을 이해하려고합니다.간단한 시스템 호출 구현 예?

⦁ Typically, 
⦁ a number associated with each system call 
⦁ Number used as an index to a table: System Call table 
⦁ Table keeps addresses of system calls (routines) 
⦁ System call runs and returns 
⦁ Caller does not know system call implementation 
⦁ Just knows interface 

답변

3

시스템 호출을 추가하려는 아키텍처 또는 모든 아키텍처에 대한 시스템 호출을 추가하려는 경우에 따라 다릅니다. ARM에 대한 시스템 호출을 추가하는 한 가지 방법을 설명하겠습니다.

  1. syscall의 이름을 선택하십시오. 예 : mysyscall.
  2. 시스템 콜 번호를 선택하십시오.arch/arm/include/asm/unistd.h에는 각 시스템 호출에 지정된 번호 (__NR__SYSCALL_BASE+<number>)가 할당 된 방식을 기록해 두십시오. 시스템 콜용 미사용 번호를 선택하십시오. 우리가 그런 추가 콜 번호 (223)를 선택할 수 있습니다 :

    #define __NR_mysyscall (__NR_SYSCALL_BASE+223

    인덱스 (223)가 헤더 파일에있을 것입니다 경우. 그러면 ARM 아키텍처의 syscall에 223이라는 숫자가 할당됩니다.

  3. 아키텍처 특정 시스템 호출 테이블을 수정하십시오.

    CALL(sys_mysyscall)

  4. 이 함수의 프로토 타입을 추가 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을 위해 특별히 추가하고 싶어합니다.

  5. 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에 추가하는 것을 잊지 마십시오.

  1. 새 커널을 컴파일하고 테스트하십시오. C 라이브러리를 수정하지 않아서 mysyscall()으로 시스템 호출을 호출 할 수 없습니다.
struct dummy_struct *buf = calloc(1, sizeof(buf)); 
int res = syscall(223, buf); 

이이 ARM에 대한 것을주의 마 : 당신은 첫 번째 인수로 시스템 호출 번호를 취하는 syscall() 기능을 사용해야합니다. 이 프로세스는 다른 아키텍처와 매우 유사합니다.

편집는 : 커널 /의 메이크에 콜 파일을 추가하는 것을 잊지 마십시오.

+0

안녕하세요, OS X에서 커널에 이미 구현되어있는 특정 시스템 호출을 다루는 비슷한 질문이 있습니다. 그러나 구현과 호출은 입력 인수에서 다르게 보인다. 아마도 당신은 여기를 볼 수 있습니다 : http://stackoverflow.com/questions/37656016/osx-setgid-system-call-which-api-is-the-correct-one – Zohar81