从/向用户空间切换到内核空间时如何使用4gb(VM)地址空间

时间:2011-05-24 05:30:40

标签: process kernel virtual-address-space address-space

我看了很多关于如何将进程地址空间划分为进程/内核的在线线程/教程

例: 我有一些Helloworld计划 因为我调用了printf(反过来它会使写入系统调用进入内核空间)

我怀疑内核使用的Helloworld程序堆栈。 你能告诉我整个执行情况如何......

./ helloworld - > printf() - >写系统调用 - >显示驱动程序 - >从写回来 - >回到helloworld

谢谢, Amarender

2 个答案:

答案 0 :(得分:0)

这个问题的详细答案取决于具体的内核和架构。但是,一般的答案是,当用户空间想要调用内核时,它会执行一个陷阱指令,这会导致CPU更改权限级别并开始执行内核代码。作为权限级别更改的一部分,CPU也将切换到内核堆栈。内核完成后,它将执行一个从陷阱返回的序列,恢复用户空间堆栈并从中断处继续执行。

答案 1 :(得分:0)

简而言之:当进行写入系统调用时,会生成int $80陷阱。处理程序将当前进程寄存器保存在内核堆栈中(存在于内核地址空间中)。然后更改段寄存器中的CPL以启用内核页表的使用。然后内核查找其系统调用表并找到所需例程的相应地址。然后执行跳转到例程,该例程又可以调用设备驱动程序代码。 完成工作后,内核通过恢复段寄存器中的寄存器内容和CPL返回用户模式。

相关问题