xv6 makefile

摘要:
此外,生成的entryother和initcode还只包含可执行指令kernel:$entry。oentryotherinitcodekernel。ld$$-T内核。ld-o内核条目。o$bbinaryinitcodeenterother$-Kernel˃内核。asm$-t内核|sed‘1,/SYMBOLTABLE/d;s/.*//;/^$$/d'˃内核。以连接脚本内核的格式。ld,sym传输条目O$这些文件连接到内核;同时,binaryinitcodeentryother也被放入内核中,以生成相应的全局变量_ binary_*_ Start和_ binary.*_ Size,即程序中指令的位置和大小。

1. xv6.img的构建

在makefile中

bootblock: bootasm.S bootmain.c
    $(CC) $(CFLAGS) -fno-pic -O -nostdinc -I. -c bootmain.c
    $(CC) $(CFLAGS) -fno-pic -nostdinc -I. -c bootasm.S
    $(LD) $(LDFLAGS) -N -e start -Ttext 0x7C00 -o bootblock.o bootasm.o bootmain.o
    $(OBJDUMP) -S bootblock.o > bootblock.asm
    $(OBJCOPY) -S -O binary -j .text bootblock.o bootblock
    ./sign.pl bootblock

  使用bootasm.S和bootmain.c构建bootblock.o,使用工具objcopy把bootblock.o的.text段(该段包含程序的可执行指令)拷贝出来生成bootblock

  使用perl脚本sign.pl把bootblock设置成512自己长度(不够部分填充0,最后2个字节是x55xAA)。该步生成的既bootloader,BIOS自检结束过后,首先执行的代码。

  另外,生成的entryother和initcode也只包含可执行指令

kernel: $(OBJS) entry.o entryother initcode kernel.ld
    $(LD) $(LDFLAGS) -T kernel.ld -o kernel entry.o $(OBJS) -b binary initcode entryother
    $(OBJDUMP) -S kernel > kernel.asm
    $(OBJDUMP) -t kernel | sed '1,/SYMBOL TABLE/d; s/ .* / /; /^$$/d' > kernel.sym

  按照连接脚本kernel.ld的格式,把entry.o $(OBJS)这些文件连接成kernel;同时也把binary initcode entryother放入到kernel中,生成对应的全局变量_binary_*_start和_binary_*_size,也便在程序中定位指令的位置和大小。比如系统启动的第一个进程就是通过

_binary_initcode_start和_binary_initcode_size定位的initcode指令的位置。
xv6.img: bootblock kernel
    dd if=/dev/zero of=xv6.img count=10000
    dd if=bootblock of=xv6.img conv=notrunc
    dd if=kernel of=xv6.img seek=1 conv=notrunc

  使用工具dd把bootblock放在第一个512块(BIOS自检结束之后直接加载该块执行),kernel放在第一个块之后,生成xv6.img

  

免责声明:文章转载自《xv6 makefile》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇监控RMAN操作进度的脚本推荐一款DataGridView的打印解决方案下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

RPi 树莓派 DSI 接口研究 MIPI raspberry pi

之前一直在玩树莓派,发现有个DSI显示接口一直没有被用上,经过一番研究发现有点意思,记录一下相关资料以后再说。 (update1: 目前全网已经有非常多的方案研究hdmi和mipi的互转方案: a. ) mipi屏幕+hdmi接口:研究最多因为mipi屏幕很多且参数美好。详情google,感谢包括稚晖在内的各路大神的研发,例如pocketLCD方案。 其中...

CentOS7 初始化配置

一、在安装的时候配置网卡名称的参数 1. 选择“Install Centos 7” 2. 按Tab,打开kernel启动选项后,增加 net.ifnames=0 biosdevname=0 二、最小化安装完成之后必备安装软件 # 添加epel源,安装基础软件,设置主机名rpm -ivh http://mirrors.aliyun.com/epel/epe...

Makefile中的$(addprefix),添加前缀,指定目标生成目录

先给大家看段Makefile的代码吧: INCLUDE_DIR=usr/java/jdk1.8.0_25/include usr/java/jdk1.8.0_25/include/linux INCLUDE_FLAG=$(addprefix -I,${INCLUDE_DIR}) all: ls ${INCLUDE_FLAG} 假如我们在...

VMware——在CentOS中安装VMware Tools

VMware——在CentOS中安装VMware Tools 摘要:本文主要记录了如何在VMware中的CentOS系统中,安装VMware Tools。 安装依赖 查看系统相关信息: 1 [root@localhost ~]# uname -r 2 3.10.0-327.el7.x86_64 查看已经安装的kernel版本: 1 [root@localh...

本人学习Makefile的总结和分享

其实吧,习惯了IDE之后,很不喜欢自己来写makefile,而且刚学Makefile,感觉语法看起来挺简单的,编写起来也不是很难,但似乎要真正自己写起来就使不上力了 然后就一直找原因,在网上找文档,找教程,处于这个阶段无助的时候只有谷歌可以帮助了 分析得出,自己对编译的过程不熟悉,为什么要用那些编译命令不熟悉,对Makefile的理解不深 刚开始看 陈皓...

Linux kernel API的查看

一般来说Linux上查看一些函数API的说明咱们可以man一下。man 2是syscall,man 3是一些库的函数API。 以下是man sections的一些说明 The table below shows the section numbers of the manual followed by the types of pages they co...