bootloader怎么写( 二 )


为了能够操作整个4GB的地址空间,我使用了WATCOM C写了个小程序读内核,不过你可以仿照bootsect里面的做法,在实模式中读一部分,然后进入到保护模式拷贝到1MB以上,然后再从实模式读一部分……需要注意1:9000H:0也是DOS占用的地址空间,所以读完内核后就不要返回DOS了,否则会有问题;注意2:一定保证是纯DOS,不要加载HIMEM或者EMM386这样的东西,它们会使上面的引导过程失败 。loadlin倒是可以来者通吃几乎所有的DOS,不过它的作者也是这方面的大牛,对DOS下的内存管理非常的熟悉 。
我们现在研究这些古老的东西很难找资料了,况且我们是在写bootloader,不是DOS killer^_^ 。回页首7.引导时的高级功能1)initrdinitrd是启动时的一个小虚拟盘,一般用它来实现模块化的内核 。
【bootloader怎么写】引导initrd的方法主要有两个要点: 第一,把initrd读入内存,我们可以仿照大多数boot loader的方法把它放在内存的最高端; 第二,设定initrd的起始位置和长度bootsect_pos[0x218]开始的4个字节放的是起始物理地址,bootsect_pos[0x21c]开始的4个字节放的是initrd的长度 。2)command_line支持用command_line你可以给内核传一些参数,自己定制内核的行为 。
我是这样做的,首先把command_line放在9900H:0的地址里,然后把9900H:0的物理地址存放在bootsect_pos[0x228]开始的4个字节里面 。注意一定是物理地址,所以你应该放99000H这个数,然后内核就会识别你的command_line了 。
2.怎样从零开始写bootloader 第一部分一般Bootloader和Linux的启动过程的讲解都是嵌入式书籍的一个章节而已,从我自身的学习经验来给出一些建议:
1. 可以看 Embedded Linux Primer (豆瓣) 第二版,网上有英文版(建议)和中文版的pdf,里面的Chapter5和7分别简述了Linux的初始化启动过程和Bootloader基础 。还有后面的Busybox章节也不错 。另外构建嵌入式LINUX系统 (豆瓣)也可以作为参考 。
2. 2. 找一下韦东山的第一期和毕业班,里面也讲到了Bootloader和Linux如何初始化以及如何执行第一个用户程序 。尽管其实只讲了一部分,但是对于Linux的启动流程的学习还是很有帮组的 。跟着写一个Bootloader绝对是学习Bootloader的一种好方式 。如同在stackoverflow里面对于如何学习Bootloader给出的答案一样“The best method to learn it, is to recreate one” 。如果自己写一个有困难,那么就先学习移植吧 。
3. 3. 其实Bootloader就是裸机程序,因此如果你对裸机程序熟悉,那么Bootloader甚至说不上需要学习,给出一本书籍用于参考:ARM处理器裸机开发实战:机制而非策略(附CD-ROM光盘1张)/王小强
其他国人写的书籍中的Bootloader大都是泛泛而谈,对于有经验的人用不着,对于初学者更多的是雾里看花,例如:
杨铸与人合著的两本书:深入浅出:嵌入式底层开发/杨铸和构建嵌入式Linux核心系统实战(附光盘1张)/杨铸
韦东山写的那本书:嵌入式Linux应用开发完全手册(附CD光盘1张)/韦东山
以及各类“精通”与“实战”之流 。
但,不管如何,开卷有益,同时也因人而异 。还是需要题主自己考究 。
最后:
如果你学得很痛苦,那么很可能没有走在正确的路上 。我觉得学习过程应该是不断+1的过程,看,看得懂的代码和书 。否则继续学习基础,或者直接跳过这些东西直接到Linux上面学习驱动开发或者应用开发,其实这些知识点没有那么多牵连,很多人给出的嵌入式学习步骤绝对是带人入坑 。