당신의 도움이 필요해, 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;
}
뭔가 ... 어떤 아이디어를 작동하지 않습니다? 미리 감사드립니다.