• 慢动作
    2021-10-27
    没有段以后,代码权限是以什么为单位管理的?GDT是每个进程单独一份,IDT是系统独一份?

    作者回复: 1. 第一个问题,linux内核引入了vm_area_struct结构,通过软件的办法做了很多权限管理的事情,这个可以代替段的权限管理的部分工作;另外,每个页也有读写权限管理,所以硬件本身的页管理机制也代替了一些段的权限管理机制。 2. IDT是全局的,你已经理解了。GDT也是全局的。linux会使用GDT来区分内核代码段和内核数据段。每个进程单独的确实也有这种结构,叫做局部(local)表述符表,LDT才是和单个进程相关的表,其中的描述符的结构与全局描述符是完全一样的。由于它的结构和GDT非常像,我故意略去了。 3. 段选择子我没有展开讲它的结构,实际上,段选择子的第三位为0就表示要在GDT中找描述符,为1就在LDT中查找。所以你只要理解GDT就足够了。但既然你考虑到这里了,我就单独回答一下这个问题。 你思考得很深入,点赞!

    共 3 条评论
    18
  • 郑童文
    2021-10-27
    请问老师,IDT是储存在操作系统的内核内存空间的吗?GDT是存在进程的用户内存空间还是内核内存空间呢? 谢谢!

    作者回复: 好问题。gdt和idt都是由操作系统设置的。所以我们可以理解成是在内核空间里。但这仍然不准确。最准确的说法是由于gdtr和idtr里存的是物理地址,相当于操作系统从物理地址里扣了一块给gdt和idt。这块物理地址以后就不参与分配了。

    共 5 条评论
    6
  • Yun
    2022-02-14
    “实际上 64 位 CPU 的段式管理和 32 位的结构非常相似,惟一的区别是段描述符的段基址和段长度字段都被废弃了,也就是说不管你将段基址设置成什么,都会被 CPU 自动识别为 0”。 这句话里的“CPU自动识别为0”?记得是Linux内核将段基地址都设置为0,然后是的Linux本质上抛弃了段式管理,所以想请教一下,这里是CPU将段基址设置为0还是Linux内核来设置?或者说32位和64位还不一样?,谢谢

    作者回复: 32位linux先动的手,intel一看,你们写os的不按套路出牌啊,所以就干脆在设计64位cpu的时候把这块电路给扣了。

    
    5
  • 送过快递的码农
    2021-10-27
    保留段寄存器是不是为了向下兼容实模式啊?因为64位地址总线够大了,不需要段了。但是为了保证向下兼容性,段不做删除?纯属瞎猜

    作者回复: Good,这是很重要的一方面。是x86的设计哲学,但也给x86架构带来了巨大的包袱。

    
    4
  • 『SIGNIFICANT』
    2021-12-06
    java程序员一般不会接触到coredump这样的文件分析,一般也就是JVM调优,内存信息dump下来用工具查看,还有必要深入了解这些么

    作者回复: 不需要。java程序员的成长建议先学java类库,把算法和数据结构吃透是收益最大的。

    共 4 条评论
    2
  • .
    2021-11-15
    两顿饭钱买到很多知识,期待后面内存模型那块。以前看文章说理解x86内存模式是强类型,所以有部分标准内存屏障是不存在,我一脸懵了好多年。

    作者回复: OK,请继续关注,我们一定能讲清楚内存屏障是干嘛的。

    
    2
  • keepgoing
    2021-11-03
    老师,能理解为之后的i386中主要用段式管理(也就是GDT)来管理段类型的区分,比如代码段/数据段,用页式管理(所以GDT中的描述子G值一般都为1)来管理真正的物理内存和虚拟内存的映射吗? 如果这样来说的话,我理解段式管理主要来作类型的区分,在i386中程序员自己会去用逻辑地址寻址的场景是否会比较少,主要是什么场景会用到逻辑寻址呢。 初学小白,听了老师的课比较好奇,如有冒犯或理解不对的地方请老师多多包涵

    作者回复: 你的理解是对的。cpu的设计者是希望大家还继续使用段机制的,但是linux不按套路出牌,弱化了段的作用。linux主要使用页管理,所以,是的,后来的程序员不再使用逻辑地址了。

    共 4 条评论
    2
  • coder
    2021-10-27
    老师给的例子在x86上可以跑通,arm上不行

    作者回复: 你说得非常对!看了我们的前导课就会明白,x86和arm的寄存器都不一样,所以这个内嵌汇编只能在x86上运行。汇编是不能跨平台的。不过你倒是可以尝试修改一下哦,这就是跨架构移植了:)

    
    2
  • =
    2022-01-10
    内存碎片以前理解时,只考虑到了段式内存管理会有段间的内存碎片,一直没有考虑到页式内存管理的页内部的内存碎片问题。 海老师的这篇文章,从“16位CPU演化到32位CPU后内存管理的变化”的角度讲起,帮助我更好地理解了全局段描述符的问题,之前看x86CPU的GDT等知识,不知其所以然,但是今天从内存管理的角度来看,很清晰!

    作者回复: good。带着思考去阅读收获才能更大

    
    1
  • 乘风
    2022-01-07
    段式管理和页式管理都是针对的物理内存是吧,很虚拟内存没关系

    作者回复: 不是。它们都是内存管理的一种思路,既可以用于物理内存也可以用于虚拟内存。你可以这样理解虚拟内存:它和物理内存一样,也是一段地址空间,只是它还需要通过页表进行一次映射而已。对内存的管理,本质上就是对一段地址区间进行管理。再想想?

    
    1