UCORE Lab 2

UCORE的段页式内存布局 从UCORE启动到物理内存管理的初始化结束,一共加载了3次GDT,实现了由单纯的分段到段页式内存管理的布局。 在内核链接脚本中,内核的加载地址由Lab1中的0x100000改为了0xC0100000: 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给抹除了: // 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 · 7 min · 1400 words

UCORE Lab 1

Ex.1 Makefile 狗都不看 操作系统镜像文件ucore.img是如何一步一步生成的? make -n可以输出具体执行的命令: # Compile Kernel Sources echo + cc kern/init/init.c gcc -Ikern/init/ -fno-builtin -Wall -ggdb -m32 -gstabs -nostdinc -fno-stack-protector -Ilibs/ -Ikern/debug/ -Ikern/driver/ -Ikern/trap/ -Ikern/mm/ -c kern/init/init.c -o obj/kern/init/init.o echo + cc kern/libs/stdio.c gcc -Ikern/libs/ -fno-builtin -Wall -ggdb -m32 -gstabs -nostdinc -fno-stack-protector -Ilibs/ -Ikern/debug/ -Ikern/driver/ -Ikern/trap/ -Ikern/mm/ -c kern/libs/stdio.c -o obj/kern/libs/stdio.o echo + cc kern/libs/readline.c gcc -Ikern/libs/ -fno-builtin -Wall -ggdb -m32 -gstabs -nostdinc -fno-stack-protector -Ilibs/ -Ikern/debug/ -Ikern/driver/ -Ikern/trap/ -Ikern/mm/ -c kern/libs/readline....

Oct. 24, 2022 · 15 min · 2996 words