0

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

例如:我有一些 Helloworld 程序,我以 printf 的形式调用(反过来它会进行写入系统调用以进入内核空间)

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

./helloworld -> printf() -> 写系统调用 -> 显示驱动 -> 从写返回 -> 返回 helloworld

谢谢,阿玛伦德

4

2 回答 2

0

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

于 2011-06-02T19:12:21.447 回答
0

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

于 2011-05-27T11:52:26.557 回答