单片内核的驱动程序可以在环 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 的上下文切换,需要一个完整的中断。
要考虑的另一个缺点是,因为许多其他架构只有主管和用户模式(或等效模式),您编写的任何平台架构管理代码运行的级别元素都必须同时具备:
如果您计划构建一个为不同架构构建的系统,这可能会导致一些困难。
关于x86 - 将 x86 驱动程序代码放在环 1 和 2 而不是 0 中是否有优势?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25787507/