2013-03-17 1 views
0

내 OS/161 코드에서 새 시스템 호출을 추가하려고하는데 프로토 타입을 추가 할 위치를 찾는 데 문제가 있습니다. 필자는 커널 공간과 사용자 공간에 추가해야한다고 생각하지만, 프로토 타입을 넣을 파일이 정확히 무엇인지 잘 모르겠습니다. OS/161에서 샘플 시스템 호출을 추가하는 방법을 설명하는 안내서가 있습니다. ?OS/161에서 새 시스템 호출을 추가하는 방법은 무엇입니까?

테스트로 사용자가 해당 프로그램을 실행하면 "1"이 인쇄되는 기능인 printone()을 추가하려고합니다.

+1

[이 OS/161] (http://www.eecs.harvard.edu/~syrah/os161/)은 무엇입니까? –

+0

'printone()'시스템 호출은 어디로 쓰이게 될까요? 파일 기술자를 제공 할 것인가 아니면 콘솔에 쓸 것인지, 또는 무엇을 할 것인가? –

+0

OS/161을 가르치는 O/S를위한 monicker로 사용하는 대학이 2 개 이상있는 것 같습니다. –

답변

1

다른 시스템 호출 번호를 추가하십시오. SYS_print1callno.h 또는 SYS_forkSYS_read과 같은 상수가 정의 된 곳에서 정의하십시오.

전화 할 기능을 선택하는 데 사용되는 위치를 찾으십시오. 전화 번호는 mips_syscall()이어야합니다. 비록이 버전의 소스 코드에서 을 호출하는 데 단지 SYS_reboot이 사용 된 이유는 확실하지 않습니다. 이 소스 코드 참조가 불완전한 것 같습니다. 코멘트가 제안 :

00049 mips_syscall(struct trapframe *tf) 
00050 { 
... 
00070   switch (callno) { 
00071    case SYS_reboot: 
00072     err = sys_reboot(tf->tf_a0); 
00073     break; 
00074 
00075    /* Add stuff here */ 
00076 
00077    default: 
00078     kprintf("Unknown syscall %d\n", callno); 
00079     err = ENOSYS; 
00080     break; 
00081   } 
... 
00108 } 

이 유사하여 case SYS_print1:을 추가하고 전용 함수의 기능을 구현, sys_print1()을 말한다.

커널 측에 맞아야합니다.

print1()에 대한 사용자 모드 프로토 타입은 read() 등과 함께 unistd.h과 같이 선언 할 수 있습니다.

read()의 사용자 모드 구현이 어셈블리 파일에있을 수 있습니다. 그리고 결국 그것은 MIPS syscall 명령을 C에서 직접 사용할 수 없기 때문에 합리적입니다. 비슷한 방식으로 print1()을 구현해야합니다 (해당 레지스터에 SYS_print1로드하고 syscall 실행).