我正在阅读关于x86保护模式的工作,因为我已经看到了平面内存模型和分段内存模型。
如果linux内核使用的是平面内存模型,那么它如何保护非特权应用程序对关键数据的访问?
答案 0 :(得分:2)
Linux通常不使用。在x86上,Linux为用户空间进程和内核提供了单独的页表。用户空间页表不包含内核内存的映射,这使得用户空间进程无法直接访问内核内存。
从技术上讲,"虚拟地址"在通过页表从线性地址重新映射到物理地址之前,在x86上首先通过分段(并从逻辑地址转换为线性地址)。除非在特殊情况下,分段不会在64位模式下更改生成的物理地址(分段仅用于存储当前权限级别等特征,并强制执行SMEP等功能)。
一个众所周知的"不寻常的案例"是x86上大多数编译器实现的线程本地存储,它使用FS和GS段来定义每个逻辑处理器偏移到地址空间。其他段不能具有非零基数,因此不能通过分段移位地址。