【问题标题】:How 4gb(VM) Address space used while swithcing from/to user space to kernel space在从/到用户空间到内核空间切换时如何使用 4gb(VM) 地址空间
【发布时间】:2011-05-24 05:30:40
【问题描述】:
我看了很多关于如何将进程地址空间划分为进程/内核的在线线程/教程
例如:
我有一些 Helloworld 程序
因为我调用了 printf(反过来它使 write 系统调用进入内核空间)
我怀疑内核如何使用 Helloworld 程序堆栈。
你能告诉我整个执行过程是如何进行的吗...
./helloworld -> printf() -> 写系统调用 -> 显示驱动 -> 从写返回 -> 返回 helloworld
谢谢,
Amarender
【问题讨论】:
标签:
process
kernel
virtual-address-space
address-space
【解决方案1】:
这个问题的详细答案取决于具体的内核和架构。然而,一般的答案是,当用户空间想要调用内核时,它会执行一条陷阱指令,这会导致 CPU 更改特权级别并开始执行内核代码。作为特权级别更改的一部分,CPU 也将切换到内核堆栈。内核完成后,它将执行一个从陷阱返回的序列,该序列恢复用户空间堆栈并从中断处恢复执行。
【解决方案2】:
简而言之:写入系统调用时,会生成int $80 陷阱。处理程序将当前进程寄存器保存在内核堆栈上(存在于内核地址空间中)。然后更改段寄存器中的 CPL 以启用内核页表的使用。然后内核查找它的系统调用表并找到所需例程的适当地址。然后执行跳转到可以调用设备驱动程序代码的例程。
完成工作后,内核通过恢复段寄存器中的寄存器内容和 CPL 来返回到用户模式。