1

당신의 도움이 필요해, xinu (os)가 인터럽트 128을 인수하고 send (pid, msg)를 호출하는 대신 SYS_CALL을 제어하도록 작동하도록 변경하고 싶습니다. 나는 sys_call (SEND, pid, msg);를 호출 할 것이다. in initiali.creveruping 인터럽트 128 0x80 in xinu

mapinit (INT80VEC, active80, INT80VEC);

및 헤더에

은 내가

#ifndef hw4 
#define hw4 256 //prevent rerun of the header file 

#define INT80VEC 0x80 
extern enum cmd{CHPRIO, GETPID, GETPRIO, KILL, RECEIVE, 
      RECVCLR, RESUME, SCOUNT, SCREATE, SDELETE, 
      SEND, SENDF, SENDN, SIGNAL, SIGNALN, SLEEP, 
      SLEEPT, SRESET, SUSPEND, WAIT, PCOUNT, PCREATE,last}; 
//last is just to find out how many arguments we have in the enum expression 

extern SYSCALL sys_call(int sys_call_no, int parm1, int parm2); 
extern int active80(); 

#endif 

했다 만든 내가 만든 C 파일은 내가 가지고 :

#include <kernel.h> 
#include <conf.h> 
#include "my.h" 



SYSCALL sys_call(int sys_call_no, int parm1, int parm2){ 

int ps; 
int temp; 
disable(ps); 
if(sys_call_no<0 ||sys_call_no>=last){ 
     restore(ps); 
     return SYSERR; 
} 
asm{ mov ax,sys_call_no 
     mov bx,parm1 
     mov cx,parm2 
     int 80h 
     mov temp,ax 
} 
restore(ps); 
return temp; 
} 

INTPROC active80(){ 
int sys_call_no, parm1,parm2; 
asm{ mov sys_call_no,ax 
     mov parm1,bx 
     mov parm2,cx 
} 
switch (sys_call_no) { 
case CHPRIO: 
    chprio(parm1,parm2); 
    break; 
case GETPID: 
    getpid(); 
    break; 
case GETPRIO: 
    getprio(parm1); 
    break; 
case KILL: 
    kill(parm1); 
    break; 
case RECEIVE: 
    receive(); 
    break; 
case RECVCLR: 
    recvclr(); 
    break; 
case RESUME: 
    resume(parm1); 
    break; 
case SCOUNT: 
    scount(parm1); 
    break; 
case SCREATE: 
    screate(parm1); 
    break; 
case SDELETE: 
    sdelete(parm1); 
    break; 
case SEND: 
    send(parm1, parm2); 
    break; 
case SENDF: 
    sendf(parm1, parm2); 
    break; 
case SENDN: 
    sendn(parm1, parm2); 
    break; 
case SIGNAL: 
    signal(parm1); 
    break; 
case SIGNALN: 
    signaln(parm1,parm2); 
    break; 
case SLEEP: 
    sleep(parm1); 
    break; 
case SLEEPT: 
    sleept(parm1); 
    break; 
case SRESET: 
    sreset(parm1,parm2); 
    break; 
case SUSPEND: 
    suspend(parm1); 
    break; 
case WAIT: 
    wait(parm1); 
    break; 
case PCOUNT: 
    pcount(parm1); 
    break; 
case PCREATE: 
    pcreate(parm1); 
    break; 
} 
return OK; 
} 

뭔가 ... 어떤 아이디어를 작동하지 않습니다? 미리 감사드립니다.

답변

0

진지하게 파고 나서 많은 자료를 읽은 후에 답은 입니다. 모든 proc에는 자체 레지스터와 스택이 있으므로 procs 배열을 만들고 proctab에서 pregs를 가져 와서 SP를 가져 와서 초기화하십시오 그것과 함께 배열, 그것을 처리하는 전역 변수를 만드는 것이 가능합니다. 레지스터가 가장 빠른 솔루션이기 때문에 훨씬 느리지 만 여전히 작동합니다.

0

maprestore 함수를 사용하여 이전 ISR을 복원해야합니다.