使用陷阱表的目的是什么

问题描述

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

解决方法

陷阱表系统调用处理程序通常用来调用所请求的操作服务例程的表。它是一个受内核保护的表,因此不能在任意地址执行。而是映射到请求的服务(通常是一个很小的数目,在/ usr / include中搜索syscall.h)到提供该服务的函数。

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

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

在syscall运算符上调用的内核中的某些代码执行以下操作:

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

具体细节因您使用的操作系统而异,但总体思路是相同的,自1970年代以来一直保持相对稳定。