现在的位置: 首页 > 综合 > 正文

linux 0.11 源码学习(二)

2013年04月28日 ⁄ 综合 ⁄ 共 1428字 ⁄ 字号 评论关闭

linux 0.11的运行

linux 0.11版本的编译和运行可以基于bochs,个人参考的是赵博的文章,主要是三块工作:

  • 制作linux镜像,按要求修改makefile后,可以直接在redhat上编译,生成image:
  • 制作linux根文件镜像rootimage(即启动时存在的bin、home等目录);
  • 设置bochs配置参数,将image和rootimage分别作为软盘A和软盘B;

linux 0.11的makefile

对于linux启动首先要理解的是linux内核镜像的组成,image由三部分组成:bootsect、setup和system,其中system是真正的内核代码。由makefile可知:

all:    Image //最终生成的镜像文件
Image: boot/bootsect boot/setup tools/system tools/build
    objcopy -O binary -R .note -R .comment tools/system tools/kernel
    tools/build boot/bootsect boot/setup tools/kernel $(ROOT_DEV) > Image //由build程序组成image,ROOT_DEV是根文件参数
    rm tools/kernel -f
    sync
tools/system:    boot/head.o init/main.o \ //systtem部分目标文件
        $(ARCHIVES) $(DRIVERS) $(MATH) $(LIBS)
    $(LD) $(LDFLAGS) boot/head.o init/main.o \  //注意是GNU的编译和链接器
    $(ARCHIVES) \ //内核、文件系统、内存管理的目标文件
    $(DRIVERS) \ /驱动部分目标文件
    $(MATH) \ /数学运算库目标文件
    $(LIBS) \ /内核库函数目标文件
    -o tools/system 
//下面两个是X86的编译和连接器
boot/setup: boot/setup.s $(AS86) -o boot/setup.o boot/setup.s $(LD86) -s -o boot/setup boot/setup.o boot/bootsect: boot/bootsect.s $(AS86) -o boot/bootsect.o boot/bootsect.s $(LD86) -s -o boot/bootsect boot/bootsect.o

linux 0.11的build.c

上述makefile中很重要的一个文件是build.c,它将bootsect、setup、system和根文件作为参数,最终生成image。build.c在tools文件夹中,主要就是main函数执行功能如下:

  • 判断入参以及根文件,获取文件的主设备号和从设备号,写入image文件的508、509;默认写入0x021D即1.44 MB B驱动器;
  • 判断bootsect文件正确性,并写入stdout;
  • 判断setup正确性,(长度是否大于4个扇区(4*512),是则错误否则填0),并写入stdout;
  • 判断system正确性,并写入stdout;
  • 最终stdout会在makefile中重定向到image文件(> image);

 

 由上可知在image中头512字节是bootsect代码,因此当该image文件被加载入软盘启动时正好属于BIOS默认的引导扇区,也就是启动设备的第一个扇区,这也就是linux 0.11进入引导程序前的全部工作了:)

抱歉!评论已关闭.