Lab2 新增的细节

entry.S

新增加了这个入口函数
bootloader 加载完成后 将执行 kern_entry 而非lab1 中的kern_init

defs.h##

使用了 ({})宏定义的方式,并且执行了一行定义的语句,
首先 将a转换成size_t 然后在转换回去

define ROUNDDOWN(a,n) ({

size_t __a=(size_t)(a);
(typeof(a)) (__a-__a %(n));

})

define ROUNDUP(a, n) ({

        size_t __n = (size_t)(n);                               
        (typeof(a))(ROUNDDOWN((size_t)(a) + __n - 1, __n));     
    })

ROUNDUP 有相似的定义

pmm.h##

PADDR () / / 接受虚拟地址,返回实际地址
就是接受地址后 减了一个 KERNBASE 返回

pa2page 以及引出的页机制宏##

接受物理地址 ,返回对应page 条目的信息
应该是目前传入的 物理地址就是逻辑地址? 取出

内存分配细节##

alloc_page() -> alloc_page(1)

alloc_page(int) ->alloc_pages(int) (pmm.c )

alloc_pages :
local_intr_save(intr_flag) 保存寄存器状态值
page=pmm_manager-alloc_pages()
local_intr_restore(intrflag) 回复寄存器状态值
return page

寄存器的状态值 是否改变还取决于 readeflags & FL_IF 的值 FL_IF 被值1才会进行 中断屏蔽 FL_IF interrupte flag

原文地址:https://www.cnblogs.com/sfzyk/p/9028719.html