【问题标题】:revectoring interrupt 128 0x80 in xinu在xinu中重新向量中断128 0x80
【发布时间】:2026-02-10 17:10:01
【问题描述】:

我需要你的帮助,我想改变 xinu (os) 的工作方式,以便它将接管中断 128 并控制 SYS_CALL,例如,而不是调用 send(pid, msg) 我将调用 sys_call(发送,PID,味精);。 在 initiali.c 我添加了

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;
}

有些东西不工作......有什么想法吗? 提前谢谢!

【问题讨论】:

    标签: c assembly operating-system system-calls interrupt-handling


    【解决方案1】:

    您必须使用maprestore 函数恢复您的旧isr。

    【讨论】:

      【解决方案2】:

      在认真挖掘并阅读了大量材料之后,答案是: 任何 proc 都有自己的寄存器和堆栈,所以一种方法是创建一个 procs 数组并从 proctab 中的 pregs 中获取它们的 SP 并用它初始化数组,另一种可能是创建处理它的全局变量,不管怎样较慢,因为寄存器是最快的解决方案,但它仍然可以工作

      【讨论】: