作者回复: 1. 第一个问题,linux内核引入了vm_area_struct结构,通过软件的办法做了很多权限管理的事情,这个可以代替段的权限管理的部分工作;另外,每个页也有读写权限管理,所以硬件本身的页管理机制也代替了一些段的权限管理机制。 2. IDT是全局的,你已经理解了。GDT也是全局的。linux会使用GDT来区分内核代码段和内核数据段。每个进程单独的确实也有这种结构,叫做局部(local)表述符表,LDT才是和单个进程相关的表,其中的描述符的结构与全局描述符是完全一样的。由于它的结构和GDT非常像,我故意略去了。 3. 段选择子我没有展开讲它的结构,实际上,段选择子的第三位为0就表示要在GDT中找描述符,为1就在LDT中查找。所以你只要理解GDT就足够了。但既然你考虑到这里了,我就单独回答一下这个问题。 你思考得很深入,点赞!
作者回复: 好问题。gdt和idt都是由操作系统设置的。所以我们可以理解成是在内核空间里。但这仍然不准确。最准确的说法是由于gdtr和idtr里存的是物理地址,相当于操作系统从物理地址里扣了一块给gdt和idt。这块物理地址以后就不参与分配了。
作者回复: 32位linux先动的手,intel一看,你们写os的不按套路出牌啊,所以就干脆在设计64位cpu的时候把这块电路给扣了。
作者回复: Good,这是很重要的一方面。是x86的设计哲学,但也给x86架构带来了巨大的包袱。
作者回复: 不需要。java程序员的成长建议先学java类库,把算法和数据结构吃透是收益最大的。
作者回复: OK,请继续关注,我们一定能讲清楚内存屏障是干嘛的。
作者回复: 你的理解是对的。cpu的设计者是希望大家还继续使用段机制的,但是linux不按套路出牌,弱化了段的作用。linux主要使用页管理,所以,是的,后来的程序员不再使用逻辑地址了。
作者回复: 你说得非常对!看了我们的前导课就会明白,x86和arm的寄存器都不一样,所以这个内嵌汇编只能在x86上运行。汇编是不能跨平台的。不过你倒是可以尝试修改一下哦,这就是跨架构移植了:)
作者回复: good。带着思考去阅读收获才能更大
作者回复: 不是。它们都是内存管理的一种思路,既可以用于物理内存也可以用于虚拟内存。你可以这样理解虚拟内存:它和物理内存一样,也是一段地址空间,只是它还需要通过页表进行一次映射而已。对内存的管理,本质上就是对一段地址区间进行管理。再想想?