写点什么

《操作系统实战 45 讲》笔记 2——内存管理

作者:袁世超
  • 2023-08-22
    北京
  • 本文字数:1002 字

    阅读完需:约 3 分钟

16 | 划分土地(上):如何划分与组织内存?


在之前的几讲内存的分配都是按照 kmachbsp.mb_nextwtpadr 顺序分配。

面对之后的 MMU 分页模型,这里就需要一个新的数据结构来组织内存空间。


17 | 划分土地(中):如何实现内存页面初始化?


在 13 讲构建了 phymmarge_t 数组形式的内存视图,在 virtualbox 测试环境下运行的信息为:

可用内存: 639 + 1047488 = 1048127KB

预留区域: 1 + 64 + 4 + 4 + 256 = 329KB

硬件使用: 64K

与 1024MB 的理论值少了 56KB为什么?


msadsc_t 结构体大小为 40,msadsc_t 结构实例变量本身占用 1048127 / 4 * 40 = 10481270B,约 10MB。


一个疑问:

在标记内存页属于哪个内存区的 merlove_setallmarflgs_onmemarea 方法中,判断条件是内存页的物理地址与内存区的逻辑地址,按照上面的得出的内存视图,没有一个内存页属于 MA_TYPE_PROC。(为什么?

  1. 在 find_continumsa_inbafhlst 方法中,MA_TYPE_PROC 用的是 dm_onemsalst,而不是前讲重点介绍的 dm_mdmlielst[MDIVMER_ARR_LMAX],所以这部分也不会涉及,就不深究了。

  2. 另外在 12 讲建立 MMU 页表数据时将物理地址开始的 0 ~ 0x400000000 直接线性映射给了虚拟地址 0xffff800000000000 ~ 0xffff800400000000,所以这样判断好像也没有问题。


19 | 土地不能浪费:如何管理内存对象?


内存页的粒度比较粗,在构建一个细粒度的内存对象数据结构。

一个疑问:

msomdc_t 中表示扩展内存页的 mc_lst 为什么要用个数组呢?从目前来看好像没有必要。


20 | 土地需求扩大与保障:如何表示虚拟内存?



21 | 土地需求扩大与保障:如何分配和释放虚拟内存?


在第 12 讲建立的 MMU 页表是 2MB,这不影响再建立 4KB 的页表,因为这就是个映射关系表,换一下 CR3 寄存器就是新的映射关系。

mmadrsdsc_t 中的 mmudsc_t 就是每个进程的页表:

typedef struct MMUDSC{        spinlock_t mud_lock;        u64_t mud_stus;        u64_t mud_flag;        tdirearr_t *mud_tdirearr; // 顶级页目录项数组        cr3s_t mud_cr3;        list_h_t mud_tdirhead; //挂载 顶级页目录项 的物理内存页        list_h_t mud_sdirhead; //挂载 页目录指针项 的物理内存页        list_h_t mud_idirhead; //挂载 页目录项 的物理内存页        list_h_t mud_mdirhead; //挂载 页表项 的物理内存页        uint_t mud_tdirmsanr;        uint_t mud_sdirmsanr;        uint_t mud_idirmsanr;        uint_t mud_mdirmsanr;} mmudsc_t;
复制代码


发布于: 刚刚阅读数: 3
用户头像

袁世超

关注

还未添加个人签名 2017-11-30 加入

还未添加个人简介

评论

发布
暂无评论
《操作系统实战 45 讲》笔记2——内存管理_操作系统_袁世超_InfoQ写作社区