From f64cb48d05ee8fbda048f390c4e63d1131d5051a Mon Sep 17 00:00:00 2001 From: kiukotsu Date: Sun, 30 Sep 2018 18:55:24 +0800 Subject: [PATCH] add lab1 exercise --- docs/lab1/练习一.md | 127 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 127 insertions(+) create mode 100644 docs/lab1/练习一.md diff --git a/docs/lab1/练习一.md b/docs/lab1/练习一.md new file mode 100644 index 0000000..22becaf --- /dev/null +++ b/docs/lab1/练习一.md @@ -0,0 +1,127 @@ +### 练习一 + +--- + +lab1中包含一个bootloader和一个OS。这个bootloader可以切换到X86保护模式,能够读磁盘并加载ELF执行文件格式,并显示字符。而这lab1中的OS只是一个可以处理时钟中断和显示字符的幼儿园级别OS。 + +**问题一**:操作系统镜像文件 ucore.img 是如何一步一部生成的?(需要比较详细的解释 Makefile 中每一条相关命令和命令参数的含义,以及说明命令导致的结果) + +**回答**:在 `labcodes/lab1` 目录下运行 `make "V="` 得到如下结果: + +```shell +# 编译 init.c 文件,生成 init.o ++ 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 + +# 编译 stdio.c 文件,生成 stdio.o ++ 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 + +# 编译 readline.c 文件,生成 readline.o ++ 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.c -o obj/kern/libs/readline.o + +# 编译 panic.c 文件,生成 painc.o ++ cc kern/debug/panic.c +gcc -Ikern/debug/ -fno-builtin -Wall -ggdb -m32 -gstabs -nostdinc -fno-stack-protector -Ilibs/ -Ikern/debug/ -Ikern/driver/ -Ikern/trap/ -Ikern/mm/ -c kern/debug/panic.c -o obj/kern/debug/panic.o + +# 编译 kdebug.c 文件,生成 kdebug.o ++ cc kern/debug/kdebug.c +gcc -Ikern/debug/ -fno-builtin -Wall -ggdb -m32 -gstabs -nostdinc -fno-stack-protector -Ilibs/ -Ikern/debug/ -Ikern/driver/ -Ikern/trap/ -Ikern/mm/ -c kern/debug/kdebug.c -o obj/kern/debug/kdebug.o + +# 编译 kmonitor.c 文件,生成 kmonitor.o ++ cc kern/debug/kmonitor.c +gcc -Ikern/debug/ -fno-builtin -Wall -ggdb -m32 -gstabs -nostdinc -fno-stack-protector -Ilibs/ -Ikern/debug/ -Ikern/driver/ -Ikern/trap/ -Ikern/mm/ -c kern/debug/kmonitor.c -o obj/kern/debug/kmonitor.o + +# 编译 clock.c 文件,生成 clock.o ++ cc kern/driver/clock.c +gcc -Ikern/driver/ -fno-builtin -Wall -ggdb -m32 -gstabs -nostdinc -fno-stack-protector -Ilibs/ -Ikern/debug/ -Ikern/driver/ -Ikern/trap/ -Ikern/mm/ -c kern/driver/clock.c -o obj/kern/driver/clock.o + +# 编译 console.c 文件,生成 console.o ++ cc kern/driver/console.c +gcc -Ikern/driver/ -fno-builtin -Wall -ggdb -m32 -gstabs -nostdinc -fno-stack-protector -Ilibs/ -Ikern/debug/ -Ikern/driver/ -Ikern/trap/ -Ikern/mm/ -c kern/driver/console.c -o obj/kern/driver/console.o + +# 编译 picirq.c 文件,生成 picirq.o ++ cc kern/driver/picirq.c +gcc -Ikern/driver/ -fno-builtin -Wall -ggdb -m32 -gstabs -nostdinc -fno-stack-protector -Ilibs/ -Ikern/debug/ -Ikern/driver/ -Ikern/trap/ -Ikern/mm/ -c kern/driver/picirq.c -o obj/kern/driver/picirq.o + +# 编译 intr.c 文件,生成 intr.o ++ cc kern/driver/intr.c +gcc -Ikern/driver/ -fno-builtin -Wall -ggdb -m32 -gstabs -nostdinc -fno-stack-protector -Ilibs/ -Ikern/debug/ -Ikern/driver/ -Ikern/trap/ -Ikern/mm/ -c kern/driver/intr.c -o obj/kern/driver/intr.o + +# 编译 trap.c 文件,生成 trap.o ++ cc kern/trap/trap.c +gcc -Ikern/trap/ -fno-builtin -Wall -ggdb -m32 -gstabs -nostdinc -fno-stack-protector -Ilibs/ -Ikern/debug/ -Ikern/driver/ -Ikern/trap/ -Ikern/mm/ -c kern/trap/trap.c -o obj/kern/trap/trap.o + +# 编译 vectors.S 生成 vectors.o ++ cc kern/trap/vectors.S +gcc -Ikern/trap/ -fno-builtin -Wall -ggdb -m32 -gstabs -nostdinc -fno-stack-protector -Ilibs/ -Ikern/debug/ -Ikern/driver/ -Ikern/trap/ -Ikern/mm/ -c kern/trap/vectors.S -o obj/kern/trap/vectors.o + +# 编译 trapentry.S 生成 trapentry.o ++ cc kern/trap/trapentry.S +gcc -Ikern/trap/ -fno-builtin -Wall -ggdb -m32 -gstabs -nostdinc -fno-stack-protector -Ilibs/ -Ikern/debug/ -Ikern/driver/ -Ikern/trap/ -Ikern/mm/ -c kern/trap/trapentry.S -o obj/kern/trap/trapentry.o + +# 编译 pmm.c 生成 pmm.o ++ cc kern/mm/pmm.c +gcc -Ikern/mm/ -fno-builtin -Wall -ggdb -m32 -gstabs -nostdinc -fno-stack-protector -Ilibs/ -Ikern/debug/ -Ikern/driver/ -Ikern/trap/ -Ikern/mm/ -c kern/mm/pmm.c -o obj/kern/mm/pmm.o + +# 编译 string.c 生成 string.o ++ cc libs/string.c +gcc -Ilibs/ -fno-builtin -Wall -ggdb -m32 -gstabs -nostdinc -fno-stack-protector -Ilibs/ -c libs/string.c -o obj/libs/string.o + +# 编译 printfmt.c 生成 printfmt.o ++ cc libs/printfmt.c +gcc -Ilibs/ -fno-builtin -Wall -ggdb -m32 -gstabs -nostdinc -fno-stack-protector -Ilibs/ -c libs/printfmt.c -o obj/libs/printfmt.o + +# 链接生成的所有目标文件,并生成 kernel 二进制文件 ++ ld bin/kernel +ld -m elf_i386 -nostdlib -T tools/kernel.ld -o bin/kernel obj/kern/init/init.o obj/kern/libs/stdio.o obj/kern/libs/readline.o obj/kern/debug/panic.o obj/kern/debug/kdebug.o obj/kern/debug/kmonitor.o obj/kern/driver/clock.o obj/kern/driver/console.o obj/kern/driver/picirq.o obj/kern/driver/intr.o obj/kern/trap/trap.o obj/kern/trap/vectors.o obj/kern/trap/trapentry.o obj/kern/mm/pmm.o obj/libs/string.o obj/libs/printfmt.o + +# 编译 bootasm.S / bootmain.c / sign.c / ++ cc boot/bootasm.S +gcc -Iboot/ -fno-builtin -Wall -ggdb -m32 -gstabs -nostdinc -fno-stack-protector -Ilibs/ -Os -nostdinc -c boot/bootasm.S -o obj/boot/bootasm.o ++ cc boot/bootmain.c +gcc -Iboot/ -fno-builtin -Wall -ggdb -m32 -gstabs -nostdinc -fno-stack-protector -Ilibs/ -Os -nostdinc -c boot/bootmain.c -o obj/boot/bootmain.o ++ cc tools/sign.c +gcc -Itools/ -g -Wall -O2 -c tools/sign.c -o obj/sign/tools/sign.o + +# 生成 sign 文件 +gcc -g -Wall -O2 obj/sign/tools/sign.o -o bin/sign + +# 链接生成 bootblock 二进制文件 ++ ld bin/bootblock +ld -m elf_i386 -nostdlib -N -e start -Ttext 0x7C00 obj/boot/bootasm.o obj/boot/bootmain.o -o obj/bootblock.o +'obj/bootblock.out' size: 488 bytes +build 512 bytes boot sector: 'bin/bootblock' success! + +# 生成ucore.img 文件 +dd if=/dev/zero of=bin/ucore.img count=10000 +10000+0 records in +10000+0 records out +5120000 bytes (5.1 MB, 4.9 MiB) copied, 0.0242314 s, 211 MB/s +dd if=bin/bootblock of=bin/ucore.img conv=notrunc +1+0 records in +1+0 records out +512 bytes copied, 9.9196e-05 s, 5.2 MB/s +dd if=bin/kernel of=bin/ucore.img seek=1 conv=notrunc +146+1 records in +146+1 records out +74828 bytes (75 kB, 73 KiB) copied, 0.000607019 s, 123 MB/s +``` + +> 注意:上面显示的编译过程,我删去了一些警告信息。只将有用的信息标记出来。 + +**GCC** [编译选项](https://gcc.gnu.org/onlinedocs/gcc/C-Dialect-Options.html#C-Dialect-Options)详解: + +| 编译选项 | 含义 | +| :--------------------- | :----------------------------------------------------------: | +| `-I` | 指定库文件包含路径(① 指定值 ② 环境变量 ③ 标准系统搜索路径 | +| `-fno-builtin` | 只识别以 `__builtin_`为前缀的 GCC 內建函数,禁用大多数內建函数,防止与其重名 | +| `-Wall` | 编译后显示所有[警告信息](https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html#Warning-Options) | +| `-ggdb` | 使用 GDB 加入[调试信息](https://gcc.gnu.org/onlinedocs/gcc/Debugging-Options.html#Debugging-Options) | +| `-m32` | 生成 32位机器代码,`int long pointer` 都是 32 位,指定[x86处理器特定选项](https://gcc.gnu.org/onlinedocs/gcc/x86-Options.html#x86-Options), [处理器依赖选项](https://gcc.gnu.org/onlinedocs/gcc/Submodel-Options.html#Submodel-Options) | +| `-gstabs` | 产生 stabs 格式的调试信息,不包含 GDB 扩展 | +| `-nostdinc` | 不搜索标准系统目录的头文件,只搜索 `-I / -iquote / -isystem / -dirafter`指定的头文件, [目录选项](https://gcc.gnu.org/onlinedocs/gcc/Directory-Options.html#Directory-Options) | +| `-fno-stack-protector` | 禁用堆栈保护机制,[工具选项](https://gcc.gnu.org/onlinedocs/gcc/Instrumentation-Options.html#Instrumentation-Options) | +| | | +