windows下如何编译linux 0.00 内核,编译Linux-0.00内核

编译Linux0.00内核(《Linux内核完全剖析-基于0.12内核》)

老早就买了一本赵炯编写的《Linux内核完全剖析-基于0.12内核》,看来前四章的原理部分,却一直没有勇气来自己动手来实践。最近终于下定决心好好看看这本书,并打算坚持写一些学习笔记来记录学习过程中的一些收获和经验,一来可以强迫自己复习所学的东西,二来也可以和其他正在学习Linux内核的同志们分享一下自己的学习经验和在学习过程中的遇到的一些问题。今天是我真正动手学习Linux的第二天,学习编译书上140~146页的Linux-0.00。

首先,忙活了几个小时,总算正确无误的录入了书上的代码,接下来就是编译了。

0818b9ca8b590ca3270a3433284dd417.png

OK,boot编译连接成功,接下来该head了。

0818b9ca8b590ca3270a3433284dd417.png

非常不幸,编译出错了,根据提示对源代码作如下修改:

第103行: movlscr_loc, %bx改为movlscr_loc, %ebx

第240行: movl $65, %al改为movb $65, %al

第249行:movl $66, %al改为movb $66, %al

同时,将head.s中所有的的.align 2改为.align 4,.align 3改为.align 8

然后再次编译连接head.s。

0818b9ca8b590ca3270a3433284dd417.png

编译虽然通过,但是连接出错,通过查找资料,终于找到了解决方法:

先在程序的.text段中添加一行:.globl startup_32

然后通过使用命令:ld -m elf_i386 -Ttext 0 -e startup_32 -o head head.o进行编译。

OK,到现在为止boot和head都编译成功了。下面就要将二进制代码写到磁盘上面进行测试了,按照907页键入如下命令:

$:sudo dd bs=32 if=boot of=/dev/fd0 skip=1

$:sudo dd bs=512 if=head of=/dev/fd0 skip=2 seek=1

写入成功。

太好了,现在可以在虚拟机上面进行测试了。 但是不幸的是,我在VirtualBox和Bochs 2.3.6上都没有正常引导,运行时一直是黑屏。

问题出在哪里呢?无奈之下只好到赵炯博士的网站上下载了Linux-0.00-050613.zip。先将自己编译连接生成的boot和head文件按上面的方法写入软盘镜像文件vfd(2).img,在将Image写入vfd.img。通过二进制文件比较程序UltraCompare程序比较vfd.img和vfd(2).img发现,从0x00000200开始两个文件的内容就不同了,前面的部分两者一样,如下图所示:

0818b9ca8b590ca3270a3433284dd417.png

这说明boot在两个img文件中都正确写入了,但是在写入head的时候出了差错。

初步假定是文件写入的时候定位错误,通过在vfd中搜索0x00000200处的数据B8 10验证了这一假设,如下图所示:

0818b9ca8b590ca3270a3433284dd417.png

图中说明vfd.img中从地址x00000200开始的数据和vfd(2)中的从0x00000e00开始的数据相同。说明确实是错位引起的错误。

好了,问题找到了就好办了,通过hexdump命令查看head的二进制编码,如下:

$: hexdump head>head.txt

head.txt的内容如下:

0818b9ca8b590ca3270a3433284dd417.png

我们看到从0x0001000开始的数据正是我们需要的,我们只需要将从0x0001000处开始的数据写入软盘(也就img文件)中的x00000200处就可以了:

$:sudo dd bs=32 if=boot of=/dev/fd0 skip=1

$: sudo dd bs=512 if=head of=/dev/fd0 skip=8 seek=1

OK,写入成功。再次进行测试,在VirtualBox中的测试结果如下:

0818b9ca8b590ca3270a3433284dd417.png

实在是太好了,成功运行。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值