linux内核完全剖析---linux0.00-050613/rh9 makefile分析

boot.s简单的引导程序,head.s简单内核,makefile内容如下

# Makefile for the simple example kernel.
AS86    =as86 -0 -a
LD86    =ld86 -0
AS  =as
LD  =ld
LDFLAGS =-m elf_i386 -Ttext 0 -e startup_32 -s -x -M  

all:    Image

Image: boot system
    dd bs=32 if=boot of=Image skip=1
    objcopy -O binary system head
    cat head >> Image

disk: Image
    dd bs=8192 if=Image of=/dev/fd0
    sync;sync;sync

head.o: head.s

system: head.o
    $(LD) $(LDFLAGS) head.o  -o system > System.map

boot:   boot.s
    $(AS86) -o boot.o boot.s
    $(LD86) -s -o boot boot.o

clean:
    rm -f Image System.map core boot head *.o system

1.boot:   boot.s ,这一阶段使用了as86汇编器和ld86链接器生成了16位的目标文件, 使用file boot.o 得到 boot.o: Linux-8086 object file
  使用file boot 得到boot: Linux-8086 impure executable (为什么不是x86 boot sector, code offset 0x5,是因为ld86链接加上了头,而且boot的大小为544

2.head.o : head.s ,这一阶段使用了makefile的隐含规则,即:as -o head.o head.s file head.o 得到:head.o: ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not stripped,(as 默认生成elf格式目标文件) 

3.system: head.o,这一阶段链接head.o  LDFLAGS =-m elf_i386 -Ttext 0 -e startup_32 -s -x -M, 指定了仿真格式 elf_i386 , .text段地址为0, 入口函数是startup_32  -s 删除符号信息 -x 丢弃局部符号 -M 打印链接图文件     

4.Image: boot system,这一阶段生成Image(boot和head文件cat而成),file Image 得到:Image: x86 boot sector, code offset 0x5, 红色那一行意思是:

将elf格式的system转换为原生二进制head, file system得到:system: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), statically linked, stripped
,file head得到:head: COM executable for DOS.如果不转换的话是不能正确运行的,虽然boot把head读到了0地址处,而且ld也指明了text段地址为0,入口地址为0,但是此时地址0处并不是.text而是elf header ,ld只是指明了文件的.text段要在0地址处,所以加载器要读取这个信息,然后把.text段放到0地址处,但是我们这个例子中,是整个elf文件在0地址处,所以不能运行  

5,disk: Image,这一阶段主要是虚拟软盘的问题,用dd命令或者bximage命令得到的不是虚拟软盘只是一个数据块儿,想要得到虚拟软盘,两种方法,1.挂载到dos里面,将其格式化 2.写引导扇区,而且引导扇区要有引导功能.

 

 

 

 

    

posted on 2013-09-25 21:05  莫扎特也是程序猿  阅读(532)  评论(0编辑  收藏  举报

导航