4gbVM如何在从/到用户空间切换到内核空间时使用地址空间

问题描述

| 如果有关进程地址空间如何划分为进程/内核的在线线程/教程,我进行了很多研究 例如: 我有一些Helloworld程序 在这种情况下,我有调用作为printf(反过来,它使写入系统调用进入内核空间) 我怀疑内核如何使用Helloworld程序堆栈。 你能告诉我整个执行如何进行... ./helloworld-> printf()->写入系统调用->显示驱动程序->从写入返回->返回helloworld 谢谢, mar     

解决方法

该问题的详细答案取决于特定的内核和体系结构。但是,通常的答案是,当用户空间要调用内核时,它会执行陷阱指令,从而使CPU更改特权级别并开始执行内核代码。作为特权级别更改的一部分,CPU还将切换到内核堆栈。完成内核后,它将执行从陷阱返回的序列,该序列将还原用户空间堆栈并从中断的位置继续执行。     ,简而言之:进行写系统调用时,将生成“ 0”陷阱。处理程序将当前进程寄存器保存在内核堆栈中(存在于内核地址空间中)。然后更改段寄存器中的CPL以启用内核页表的使用。然后内核查找其系统调用表,并找到所需例程的适当地址。然后执行跳到例程,该例程又可以调用设备驱动程序代码。 完成工作后,内核通过恢复段寄存器中的寄存器内容和CPL返回到用户模式。