XV6源码解读:安装与编译

系列文章目录

第一章: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/kernelfs.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 : {
   
    *(
  • 7
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值