问题描述
|
如果有关进程地址空间如何划分为进程/内核的在线线程/教程,我进行了很多研究
例如:
我有一些Helloworld程序
在这种情况下,我有调用作为printf(反过来,它使写入系统调用进入内核空间)
我怀疑内核如何使用Helloworld程序堆栈。
你能告诉我整个执行如何进行...
./helloworld-> printf()->写入系统调用->显示驱动程序->从写入返回->返回helloworld
谢谢,
mar
解决方法
该问题的详细答案取决于特定的内核和体系结构。但是,通常的答案是,当用户空间要调用内核时,它会执行陷阱指令,从而使CPU更改特权级别并开始执行内核代码。作为特权级别更改的一部分,CPU还将切换到内核堆栈。完成内核后,它将执行从陷阱返回的序列,该序列将还原用户空间堆栈并从中断的位置继续执行。
,简而言之:进行写系统调用时,将生成“ 0”陷阱。处理程序将当前进程寄存器保存在内核堆栈中(存在于内核地址空间中)。然后更改段寄存器中的CPL以启用内核页表的使用。然后内核查找其系统调用表,并找到所需例程的适当地址。然后执行跳到例程,该例程又可以调用设备驱动程序代码。
完成工作后,内核通过恢复段寄存器中的寄存器内容和CPL返回到用户模式。