UCORE Lab 2

UCORE的段页式内存布局 从UCORE启动到物理内存管理的初始化结束,一共加载了3次GDT,实现了由单纯的分段到段页式内存管理的布局。 在内核链接脚本中,内核的加载地址由Lab1中的0x100000改为了0xC0100000: 1 2 3 4 5 6 7 8 9 10 OUTPUT_FORMAT("elf32-i386", "elf32-i386", "elf32-i386") OUTPUT_ARCH(i386) ENTRY(kern_entry) SECTIONS { /* Load the kernel at this address: "." means the current address */ . = 0xC0100000; ...... } 根据文档里提到的,这个地址为虚拟地址,后续通过分段和分页来映射到物理地址,实际内核还是放在0x100000的物理地址开始的。这个从bootmain函数中可以看得出来,在加载ELF段的时候对va进行了与操作,去除了地址中的高8位数据,也就是把C0给抹除了: 1 2 3 4 5 6 7 8 9 10 // load each program segment (ignores ph flags) ph = (struct proghdr *)((uintptr_t)ELFHDR + ELFHDR->e_phoff); eph = ph + ELFHDR->e_phnum; for (; ph < eph; ph ++) { readseg(ph->p_va & 0xFFFFFF, ph->p_memsz, ph->p_offset); } // call the entry point from the ELF header // note: does not return ((void (*)(void))(ELFHDR->e_entry & 0xFFFFFF))(); 1 - 准备进入内核代码 在boot/bootasm....

Dec. 2, 2022 · 8 min · 1680 words

UCORE Lab 1

Ex.1 Makefile 狗都不看 操作系统镜像文件ucore.img是如何一步一步生成的? make -n可以输出具体执行的命令: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 # Compile Kernel Sources echo + cc kern/init/init....

Oct. 24, 2022 · 17 min · 3555 words