首页 > 代码库 > ucore实验二

ucore实验二

lab2对lab1的改进:

1.在bootloader中,完成了对物理内存资源的探测工作(bootasm.S)

保存地址范围描述符结构的缓冲区:

struct e820map {
                  int nr_map;
                  struct {
                                    long long addr;
                                    long long size;
                                    long type;
                  } map[E820MAX];
};
probe_memory:
    movl $0, 0x8000      #对0x8000处的32位单元清零,即给位于0x8000处的struct e820map的成员变量nr_map清零
    xorl %ebx, %ebx      #ebx如果是第一次调用或内存区域扫描完毕,则为0
    movw $0x8004, %di   #表示设置调用INT 15h BIOS中断后,BIOS返回的映射地址描述符的起始地址
start_probe:
    movl $0xE820, %eax    #INT 15的中断调用参数;
    movl $20, %ecx         #设置地址范围描述符的大小为20字节,其大小等于struct e820map的成员变量map的大小
    movl $SMAP, %edx      #设置edx为534D4150h (即4个ASCII字符“SMAP”)
    int $0x15              #调用int 0x15中断,要求BIOS返回一个用地址范围描述符表示的内存段信息
    jnc cont               #如果eflags的CF位为0,则表示还有内存段需要探测
    movw $12345, 0x8000   #探测有问题,结束探测
    jmp finish_probe
cont:
    addw $20, %di            #eflags的CF位为0,还有内存段需要检测,设置下一个BIOS返回的映射地址描述符的起始地址
    incl 0x8000              #递增struct e820map的成员变量nr_map
    cmpl $0, %ebx            #如果INT0x15返回的ebx为零,表示探测结束,否则继续探测
    jnz start_probe
finish_probe:                

OS需要了解整个计算机系统中的物理内存如何分布的,哪些可用,哪些不可用。其基本方法是通过BIOS中断调用来帮助完成的。其中BIOS中断调用必须在实模式下进行,所以在bootloader进入保护模式前完成这部分工作。具体的流程是:通过BIOS中断获取内存可调用参数为e820h的INT 15H BIOS中断,之后通过系统内存映射地址描述符(Address Range Descriptor)格式来表示系统物理内存布局。

ucore实验二