- 【背景】探测计算机系统中的物理内存分布和大小
【背景】探测计算机系统中的物理内存分布和大小
在proj5中,操作系统需要知道了解整个计算机系统中的物理内存如何分布的,哪些被可用,哪些不可用。其基本方法是通过BIOS中断调用来帮助完成的。其中BIOS中断调用必须在实模式下进行,所以在bootloader进入保护模式前完成这部分工作相对比较合适。这些部分由boot/bootasm.S中从probe_memory处到finish_probe处的代码部分完成完成。通过BIOS中断获取内存可调用参数为e820h的INT 15h BIOS中断。BIOS通过系统内存映射地址描述符(Address Range Descriptor)格式来表示系统物理内存布局,其具体表示如下:
Offset Size Description00h 8字节 base address #系统内存块基地址08h 8字节 length in bytes #系统内存大小10h 4字节 type of address range #内存类型
看下面的(Values for System Memory Map address type)�
Values for System Memory Map address type:
01h memory, available to OS02h reserved, not available (e.g. system ROM, memory-mapped device)03h ACPI Reclaim Memory (usable by OS after reading ACPI tables)04h ACPI NVS Memory (OS is required to save this memory between NVS sessions)other not defined yet -- treat as Reserved
INT15h BIOS中断的详细调用参数:
eax:e820h:INT 15的中断调用参数;edx:534D4150h (即4个ASCII字符“SMAP”) ,这只是一个签名而已;ebx:如果是第一次调用或内存区域扫描完毕,则为0。 如果不是,则存放上次调用之后的计数值;ecx:保存地址范围描述符的内存大小,应该大于等于20字节;es:di:指向保存地址范围描述符结构的缓冲区,BIOS把信息写入这个结构的起始地址。
此中断的返回值为:
cflags的CF位:若INT 15中断执行成功,则不置位,否则置位;eax:534D4150h ('SMAP') ;es:di:指向保存地址范围描述符的缓冲区,此时缓冲区内的数据已由BIOS填写完毕ebx:下一个地址范围描述符的计数地址ecx :返回BIOS往ES:DI处写的地址范围描述符的字节大小ah:失败时保存出错代码
这样,我们通过调用INT 15h BIOS中断,递增di的值(20的倍数),让BIOS帮我们查找出一个一个的内存布局entry,并放入到一个保存地址范围描述符结构的缓冲区中,供后续的ucore进一步进行物理内存管理。这个缓冲区结构定义在memlayout.h中:
struct e820map {int nr_map;struct {long long addr;long long size;long type;} map[E820MAX];};
