pun*_*ess 16 operating-system kernel
在我的操作系统类中,我被问到从用户切换到内核模式是否具有特权.这不是特定于操作系统的.起初我想是的,但它似乎是一个很大的Catch 22.我提到了我的教科书:
硬件允许特权指令仅在内核模式下执行....
切换到内核模式的指令是特权指令的示例.
Gagne,Greg; Abraham Silberschatz; Peter B. Galvin(2010-01-26).操作系统概念(第22页).Wiley Higher Ed.Kindle版.
所以我们从用户模式开始.要切换到内核模式,需要特权指令.必须在内核模式下执行特权指令,因此我们必须切换到内核模式以启用切换到内核模式.
我认为系统不允许用户直接切换到内核模式,但是当用户试图执行另一个特权指令时,它由内核完成.那是对的吗?
Phi*_*ipp 32
在用户模式下,您不能只切换到内核模式.用户和内核之间的交互是通过系统调用完成的.每个系统调用都提供一个定义的服务.用户发送服务名称(通常是数字)和所需参数.这是一个真实世界的例子.这是x86 AT&T风格的汇编程序.
它将系统调用名称移动到EAX寄存器中,指向CPU的EBX寄存器中的参数的指针,然后发出软件中断号42.中断处理将切换到内核模式.在中断描述符表(IDT)中查找中断号,并调用在那里注册的函数syscall处理程序.此处理程序在内核模式下执行.返回用户模式后,代码会将EAX的内容移动到变量ret中.
pok_ret_t pok_do_syscall (pok_syscall_id_t syscall_id, pok_syscall_args_t* args)
{
pok_ret_t ret;
uint32_t args_addr;
uint32_t id;
args_addr = (uint32_t) args;
id = (uint32_t) syscall_id;
asm volatile ( "movl %1,%%eax \n\t"
"movl %2,%%ebx \n\t"
"int $42 \n\t"
"movl %%eax, %0 \n\t"
:"=g"(ret)
:"g"(id), "g"(args_addr)
: "%eax" , "%ebx"
);
return ret;
}
Run Code Online (Sandbox Code Playgroud)
该OS开发维基是一个很好的点,以了解更多关于这一点.
所以你不只是切换到内核,但你可以要求内核为你做一些事情.然后内核会告诉你它是否已经完成.