【问题标题】: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 来返回到用户模式。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-10-22
        • 1970-01-01
        • 1970-01-01
        • 2016-06-26
        • 2016-06-02
        • 2019-07-03
        • 2014-08-02
        • 1970-01-01
        相关资源
        最近更新 更多