2017-02-15 7 views
2

구현 방법을 이해하기 위해 XV6 (documentation available here 및 Github here)에서 간단한 시스템 호출을 작성하려고합니다. 나는 user.h에서 22 XV6에서 UNIX 시스템 호출을 이해하려고 시도합니다.

  • int hello (void);
  • 으로 함수 프로토 타입을 선언, 다음 단계

    syscall.c에서
    1. 을 사용 extern int sys_hello(void)을 선언 syscall.h에서
    2. 는, 전화 번호 등 SYS_hello 정의 static int (*syscalls[])(void) 배열에 [SYS_hello] sys_hello을 추가 한 usys.SSYSCALL(hello)을 매크로에 추가했습니다.
    3. , 단순히 Makefilehello() 시스템 호출

    4. 추가 hello.c를 호출 hello.c 만든 바닥

      int sys_hello(void) 
      { 
          cprintf ("Hello World System Call\n"); 
          return 0; 
      } 
      
    5. 의 기능 sys_hello(void)을 추가하고 예상대로 작동 코드

    을 달렸다.

    지금 내 질문에 syscall.c의 배열이 명령의 색인과 syscall.h 파일의 시스템 호출 번호가 일치하는 것 같습니다. 그러나 hello 위치를 두 번째 자리로 이동하면 syscall.c를 사용하고 syscall.h의 시스템 명령 번호를 22로 유지 시키려면 이전과 같이 시스템 명령이 작동합니다. 어디에서 나는 그것이 깨질 것이라고 예상했다. 배열 syscall.c가 syscall.h 시스템 호출 번호에 어떻게 매핑되는지 이해하도록 도와 줄 수 있습니까?

    저는이 질문이 어리석은 것처럼 보이면 제게 XV6와 C에 상당히 익숙하지 않아 제발 화를 내지 않으려합니다. 당신이 값을 할당하는 인덱스에 지정할 수있는 github.com/AdityaSingh/XV6

  • 답변

    2

    콜의 배열은 syscall.c는 designated initialization 구문을 사용합니다 있습니다 : 그 도움이된다면 여기

    는 XV6 저장소의 내 포크에 Github에서의 링크입니다 . 1로 정의
    static int (*syscalls[])(void) = { 
        [SYS_fork] sys_fork, 
    } 
    

    SYS_fork

    sys_fork을 할당하는 인덱스를 지정한다. 따라서 요소의 순서는이 구문을 사용하여 중요하지 않습니다.