ucore实验二
Posted chaunceyctx
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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实验二的主要内容,如果未能解决你的问题,请参考以下文章