ucore实验报告lab1

这篇博客详细介绍了ucore实验的六个练习,包括kernel编译链接、bootblock分析、进入保护模式的过程、加载ELF OS、函数调用堆栈跟踪和中断初始化处理。通过GDB调试,解析了Bootloader如何开启A20门、初始化GDT表,以及加载ELF文件到内存。此外,还讨论了函数print_stackframe的调用关系和中断处理的完善。
摘要由CSDN通过智能技术生成

练习1

1、生成操作系统镜像文件ucore.img
生成ucore.imge的代码如下:

$(UCOREIMG): $(kernel) $(bootblock)
    $(V)dd if=/dev/zero of=$@ count=10000
    $(V)dd if=$(bootblock) of=$@ conv=notrunc
    $(V)dd if=$(kernel) of=$@ seek=1 conv=notrunc
$(call create_target,ucore.img)

用zero块设备作为输入生成一个大小为10000B的块
然后先将bootblock即BootLoader写入块中接着是kernel

输入“make V=”

+ cc kern/init/init.c
+ cc kern/libs/readline.c
+ cc kern/libs/stdio.c
+ cc kern/debug/kdebug.c
+ cc kern/debug/kmonitor.c
+ cc kern/debug/panic.c
+ cc kern/driver/clock.c
+ cc kern/driver/console.c
+ cc kern/driver/intr.c
+ cc kern/driver/picirq.c
+ cc kern/trap/trap.c
+ cc kern/trap/trapentry.S
+ cc kern/trap/vectors.S
+ cc kern/mm/pmm.c
+ cc libs/printfmt.c
+ cc libs/string.c
+ ld bin/kernel
+ cc boot/bootasm.S
+ cc boot/bootmain.c
+ cc tools/sign.c
+ ld bin/bootblock

第140~151行是生成kernel文件。

kernel编译链接:

# kernel中头文件目录
KINCLUDE    += kern/debug/ \
               kern/driver/ \
               kern/trap/ \
               kern/mm/

# kernel的源代码目录
KSRCDIR        += kern/init \
               kern/libs \
               kern/debug \
               kern/driver \
               kern/trap \
               kern/mm

# 在编译选项中添加头文件包含目录
KCFLAGS        += $(addprefix -I,$(KINCLUDE))

# 调用function.mk中的add_files_cc函数,将kernel的全部源文件编译,将源文件和编译生成的OBJ文件加入kernel包(packet)中
$(call add_files_cc,$(call listf_cc,$(KSRCDIR)),kernel,$(KCFLAGS))

# 将KOBJS定义为编译生成的.o文件列表(大概??)
KOBJS    = $(call read_packet,kernel libs)

# create kernel target
# (在kernel前面加上bin/目录名)
kernel = $(call totarget,kernel)

# kernel目标依赖于tools/kernel.ld文件
$(kernel): tools/kernel.ld

# kernel目标依赖于编译生成的OBJ文件
$(kernel): $(KOBJS)
        # 输出"+ ld bin/kernel"到控制台
    @echo + ld $@
    # 即命令"ld -m    elf_i386 -nostdlib -T tools/kernel.ld -o bin/kernel  obj/kern/init/init.o ... obj/libs/printfmt.o"
    $(V)$(LD) $(LDFLAGS) -T tools/kernel.ld -o $@ $(KOBJS)
    # 将OBJ文件全部反编译为汇编文件
    @$(OBJDUMP) -S $@ > $(call asmfile,kernel)
    # 输出OBJ文件对应的符号表
    @$(OBJDUMP) -t $@ | $(SED) '1,/SYMBOL TABLE/d; s/ .* / /; /^$$/d' > $(call symfile,kernel)

# 将kernel包和OBJ文件添加到目标依赖
$(call create_target,kernel)

bootblock:

# -------------------------------------------------------------------

# create bootblock
# bootfiles为boot/文件夹下的全部文件列表
bootfiles = $(call listf_cc,boot)
# 编译boot/文件夹下的全部文件
$(foreach f,$(bootfiles),$(call cc_compile,$(f),$(CC),$(CFLAGS) -Os -nostdinc))

# (在bootblock前面加上bin/目录名)
bootblock = $(call totarget,bootblock)

# bootblock目标的依赖项为源文件对应的OBJ文件和bin/sign
$(bootblock): $(call toobj,$(bootfiles)) | $(call totarget,sign)
        # 输出"+ ld bin/bootblock"到控制台
        @echo + ld $@
        # 将OBJ文件链接为bin/boo
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值