首页 > 代码库 > 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实验二
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。