系列文章目录
第一章:XV6源码解读:安装与编译
文章目录
一、Xv6介绍
Xv6是MIT6.S081教学用的操作系统。
Xv6源码下载:
git clone git://github.com/mit-pdos/xv6-riscv.git
Xv6参考书下载:
git clone git://github.com/mit-pdos/xv6-riscv-book.git
二、编译
1. 从make qemu
开始
编译系统时,在命令行键入命令make qemu
。
关于qemu的Makefile片段:
K=kernel
qemu: $K/kernel fs.img
$(QEMU) $(QEMUOPTS)
由此可知,qemu
这个目标依赖于K/kernel
和fs.img
。其中K/kernel
负责生成内核的可执行文件,运行Xv6就是运行这个可执行文件;fs.img
负责生成文件系统的镜像,用于模拟一块保护所有用户程序的硬盘。
2. 编译kernel
生成可执行文件
关于kernel的Makefile片段:
U=user
OBJS = \
$K/entry.o \
$K/start.o \
$K/console.o \
$K/printf.o \
$K/uart.o \
$K/kalloc.o \
$K/spinlock.o \
$K/string.o \
$K/main.o \
$K/vm.o \
$K/proc.o \
$K/swtch.o \
$K/trampoline.o \
$K/trap.o \
$K/syscall.o \
$K/sysproc.o \
$K/bio.o \
$K/fs.o \
$K/log.o \
$K/sleeplock.o \
$K/file.o \
$K/pipe.o \
$K/exec.o \
$K/sysfile.o \
$K/kernelvec.o \
$K/plic.o \
$K/virtio_disk.o
$K/kernel: $(OBJS) $K/kernel.ld $U/initcode
$(LD) $(LDFLAGS) -T $K/kernel.ld -o $K/kernel $(OBJS)
$(OBJDUMP) -S $K/kernel > $K/kernel.asm
$(OBJDUMP) -t $K/kernel | sed '1,/SYMBOL TABLE/d; s/ .* / /; /^$$/d' > $K/kernel.sym
内核的所有源代码及其编译后生成的二进制文件保存在./kernel/
目录中,OBJS
变量是编译出内核可执行文件所需要的的所有.o
文件的文件名的合集,内核可执行文件由.o
文件链接而成。
kernel
目标生成除了依赖OBJS
变量包含的文件之外,还依赖两个目标:./kernel/kernel.ld
和./user/initcode
。
2.1 链接器脚本:kernel.ld
./kernel/kernel.ld
是链接器脚本,链接器ld
将按照脚本内的指令链接多个.o
文件以生成可执行文件,主要描述了处理链接文件的方式以及生成kernel
可执行文件的内容布局。
OUTPUT_ARCH( "riscv" )
ENTRY( _entry )
SECTIONS
{
/*
* ensure that entry.S / _entry is at 0x80000000,
* where qemu's -kernel jumps.
*/
. = 0x80000000;
.text : {
*(