问题描述
阅读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年代以来一直保持相对稳定。