使用 trap table 的目的是什么

What is the purpose of using trap table

阅读 OSTEP 时我有一个问题。问题是陷阱如何知道 OS 中的 运行 代码?我知道这是一个糟糕的想法,因为这意味着用户可以在内核中做任何事情。但是我不清楚书中给出的例子“想象跳入代码以访问文件,但只是在权限检查之后”有人可以解释一下吗?还有如果一个程序可以不使用陷阱table直接发出系统调用会发生什么?谢谢!

A​​ trap table系统调用处理程序 通常使用的陷阱来调用请求的操作服务例程。它是一个受内核保护的 table,因此不能在任意地址执行。相反,它将 映射 一个请求的服务(通常是一个小数字,搜索 /usr/include 寻找 syscall.h)到提供该服务的函数。

应用程序执行一些操作,例如:

_open:
mov   $_SYS_OPEN, %r0
syscall
jmp-on-carry seterrno
ret

在系统调用运算符上调用的内核代码位执行如下操作:

int n;
if ((n = Proc->reg[0]) < 0 || n >= _N_SYSCALLS) {
    return seterror(Proc, ENOSYS);
} else {
    return (*sys_call_table[n])(Proc);
}

具体细节因您合作的 os 而异,但总体思路是相同的,并且自 1970 年代以来一直保持相对稳定。