x86 - 将 x86 驱动程序代码放在环 1 和 2 而不是 0 中是否有优势?

标签 x86 drivers

单片内核的驱动程序可以在环 0、1 或 2 中(对于微内核,它们将在环 3 - 用户环中)。

将驱动程序代码与内核一起放在环 0 中或“稍微少”的特权环 1 和 2 中是否有任何优点/缺点?

环 1 和环 2 仍然可以访问主管页面,但它们不能运行一些特殊的特权指令(如果这样做,它们将引发一般保护错误 - 就像环 3)

最佳答案

使用环 1 和环 2 的最明显优势是架构分离,可以保护内核免受故障设备驱动程序的影响。理论上,当外环中的驱动程序发生灾难性故障时,正确编写的内核将允许正常故障。在 ring 0 中运行驱动程序可能允许它在失败时关闭整个内核。

将驱动程序移动到环 1 和 2 的一个缺点是与内核和驱动程序之间不断需要环转换相关的性能开销。当然,在微内核系统中,this is necessary and could be sufficiently fast depending on your needs .通过适当的优化,将内核与其服务分离可能会对性能造成很小的影响。话虽如此,英特尔 SYSENTER/SYSEXIT (和等效的 AMD SYSCALL/SYSRET )用于快速上下文切换的指令仅允许环 0 和 3 之间的转换;为了执行进入或退出环 1 或 2 的上下文切换,需要一个完整的中断。

要考虑的另一个缺点是,因为许多其他架构只有主管和用户模式(或等效模式),您编写的任何平台架构管理代码运行的级别元素都必须同时具备:

  • 根据平台是否有环 1 和/或环 2 和
  • 的写法不同
  • 根据平台对代码具有的权限级别做出不同的决定。

  • 如果您计划构建一个为不同架构构建的系统,这可能会导致一些困难。

    关于x86 - 将 x86 驱动程序代码放在环 1 和 2 而不是 0 中是否有优势?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25787507/

    相关文章:

    java - Neo4j java 多 session

    64-bit - 在x64系统中从NSIS安装程序安装驱动程序

    x86 - 为什么 CISC 处理器更难流水线化?某些指令 "more complex"与其他指令相比有何意义?

    c - exit() 的系统调用实现

    x86 - 装配中出现奇怪的段错误

    c++ - Broadcom ADSL 调制解调器的驱动程序

    c++ - 鼠标过滤器驱动程序的问题

    windows - 使用 Win32 API 访问 PCI 配置空间

    visual-studio - 32 位 MASM 模式与 64 位有何不同?

    assembly - JMP 对堆栈和帧指针执行什么操作?