• neohope
    置顶
    2021-06-14
    memarea_t ,进行内存区,解决功能分区的问题 -> memdivmer_t ,进行内存分割合并管理 -> bafhlst_t,以2的n次方对内存页面进行分组 ->msadsc_t,解决单一页面管理问题 用2的N次方寻址主要有几方面原有: 1、内存对齐,提升CPU寻址速度 2、内存分配时,根据需求大小快速定位至少从哪一部分开始 3、内存分配时,并发加锁,分组可以提升效率 4、内存分配回收时,很多计算也更简单

    作者回复: 你好,总结的相当到位

    共 3 条评论
    43
  • 嗣树
    2021-06-25
    neohope 老哥学习榜样,我做点补充吧。 之所以是 0-52 是因为 64 - 12 = 52,64位地址,12是页大小 而选用 2 的幂次可以把算术运算都转化为位操作,位操作是要比算术运算快的。应用层可能为了可读性而不去使用位操作,但是在内核中只要是需要性能都会往这方面靠,所以往往会浪费点空间凑个整。1024凑整没毛病嗷😂 内存管理也是绝对的高频操作,这样差别还是很可观的。

    作者回复: 是的

    共 2 条评论
    19
  • pedro
    2021-06-14
    对于思考题,原文中: 依次类推,dm_mdmlielst 数组挂载连续 msadsc_t 结构的数量等于用 1 左移其数组下标,如数组下标为 3,那结果就是 8(1<<3)个连续的 msadsc_t 结构。 因此页面数统统都是 2 的倍数,8 是 2^3,这个地方我百思不得其解,页面数为什么是 2 的倍数,在 tmalloc 中,分配的对象大小都是 2 的倍数,原因是为了减少内存碎片和对齐,虽然这与本文的问题不搭边,但是可以拿来套。 因此我猜测,由于页的大小是 2 的倍数,因此页的个数也要是 2 的倍数,这样就能实现页内存对齐,减少内存分配时的碎片。

    作者回复: 是的,这么操作 同时也是为了降低内存碎片

    
    10
  • 太阳
    2021-08-23
    文中说 “很多时候,内核使用内存需要大的、且连续的物理内存空间” 还有 “但是第一个 msadsc_t 结构与最后一个 msadsc_t 结构,它们之间的内存物理地址是连续的。”,为什么需要物理内存连续,既然可以通过MMU进行地址转换,是否可以只是虚拟内存连续,物理内存随意?内存管理的时候虚拟内存和物理内存分别怎么操作?

    作者回复: 你说的对,原则上我们确实只需保证虚拟地址连续,然后通过MMU映射就好了,但是很多物设备也要访问物理内存,但是它们地址并不经过MMU,这类设备有DMA,网卡,AHCI等等,所以有些情况就需要连续的物理内存空间

    
    3
  • thomas
    2021-06-21
    typedef struct s_BAFHLST 这个命名是什么的缩写? 比如msadsc_t 这个命名就有做说明 内存空间地址描述符(memory space address descriptor)

    作者回复: block alloc free head list

    共 3 条评论
    2
  • Zhendicai
    2021-06-19
    思考题应该是因为 dm_mdmlielst最后一个元素的下标是51也就是2^51, 2^51 x 2^12=2^63, 就是说这时只需要两个bafhlst_t就能够表示完整的地址空间, 再多的话就超过了64位地址空间了。如果dm_mdmlielst再加一个元素的话 那就只需要一个bafhlst_t就能表示完整地址空间 但是没啥意义了 应该是这样的吧

    作者回复: 对的,是这样的

    共 2 条评论
    2
  • PAWCOOK
    2022-02-11
    请问在二级引导器中建立内核MMU的页表数据时使用的是长模式下的 2MB 分页方式,而本节内存管理使用的却是4KB,这样是不是冲突了呢

    作者回复: 后面会改掉的

    
    1
  • PAWCOOK
    2021-11-27
    请问结构memdivmer_t有什么作用呢?我们可不可以直接将这个结构里面的内容放到memarea_t 中去

    作者回复: 可以啊

    
    1
  • Mike_Han
    2021-07-08
    这是原文中的内容,我想请教个问题, "需要注意的是,我们并不在意其中第一个 msadsc_t 结构对应的内存物理地址从哪里开始,但是第一个 msadsc_t 结构与最后一个 msadsc_t 结构,它们之间的内存物理地址是连续的。" 怎么做到"第一个 msadsc_t 结构与最后一个 msadsc_t 结构,它们之间的内存物理地址是连续的" ,怎么做到连续的?

    作者回复: 由代码控制的

    
    1
  • Fan
    2021-06-27
    思考题: 我们为什么要以 2 的(0~52)次方为页面数来组织页面呢? 应该是 内存分配时,根据需求大小快速定位至少从哪一部分开始

    作者回复: 嗯嗯 猜对了

    
    1