(弃我去者,昨日之日不可留;乱我心者,今日之日多烦忧)
受心魔所困,又整整沉沦了一个晚上加一上午。本来想为某人写点东西,下午冷静下来,看了一会儿书,发现一些事情最坏的情况,不过就如此,就让它去吧。是我的,终究是我的,不是我的,我也不去强求。TI那块强大的开发板也被我冷落了,搁好学之人眼里,我这是对知识的极大侮辱啊。算了,反正快放假了,公司所剩之人不多。
今天,我整理记忆,理清linux内核的启动过程。由于相关的书籍已经归还,我只能从源代码处去逆推这个过程了,可能会有更清晰的认识。先搜索了CSDN上的相关资料,发现如下几篇有帮助的文章:
http://blog.csdn.net/jn1158359135/article/details/7330849
http://blog.csdn.net/yunsongice/article/category/672106
http://blog.csdn.net/yunsongice/article/category/759408
阅读这些内容是有帮助的。但是我发现,这些文章大体是以某个基础上进行了“润色”,一看就愣,不知道是作者是为了买弄文笔,还是有意彰显知识。阅读Documentation\x86下的boot.txt再去阅读他们的博客,总归能减少一些疑惑,而不用再为一个莫名其妙的地址搞得团团转。
选择一个内核版本,例如内核版本linux-3.6.11。安装一个源代码阅读器,eclipse和vim可能都好,可是eclipse导入项目,满屏红,我无心磨这个问题,有相关工作的能否提示下相关设置?vim嘛,呵呵。反正最后偷懒用了windows平台的source insight,还有什么工具比这个更直观,更容易阅读源代码的吗?
新建项目,定位源代码目录,OK,点击add tree,等待一会儿,点关闭,源代码全部被载入到项目下了。好庞大,3W多个文件,点击browse project symbols,比较长的等待。如何操作source insight?请百度,或认识那些单词,凭着你多年使用软件的直觉。
一个传统的内核加载器的内存映像如下:
0A0000 +------------------------+
| Reserved for BIOS | Do not use. Reserved for BIOS EBDA.
09A000 +------------------------+
| Command line |
| Stack/heap | For use by the kernel real-mode code.
098000 +------------------------+
| Kernel setup | The kernel real-mode code.
090200 +------------------------+
| Kernel boot sector | The kernel legacy boot sector.
090000 +------------------------+
| Protected-mode kernel | The bulk of the kernel image.
010000 +------------------------+
| Boot loader | <- Boot sector entry point 0000:7C00
001000 +------------------------+
| Reserved for MBR/BIOS |
000800 +------------------------+
| Typically used by MBR |
000600 +------------------------+
| BIOS use only |
00 +------------------------+
而一个内核的内存结构层次如下:
| Protected-mode kernel |
100000 +------------------------+
| I/O memory hole |
0A0000 +------------------------+
| Reserved for BIOS | Leave as much as possible unused
~ ~
| Command line | (Can also be below the X+10000 mark)
X+10000 +------------------------+
| Stack/heap | For use by the kernel real-mode code.
X+08000 +------------------------+
| Kernel setup | The kernel real-mode code.
| Kernel boot sector | The kernel legacy boot sector.
X +------------------------+
| Boot loader | <- Boot sector entry point 0000:7C00
001000 +------------------------+
| Reserved for MBR/BIOS |
000800 +------------------------+
| Typically used by MBR |
000600 +------------------------+
| BIOS use only |
000000 +------------------------+
弄清楚内核启动的几个关键源文件如下:
arch/<xxx>/boot/main.c
装入内核前的准备工作
arch/<xxx>/boot/ compressed/head.S
解压内核,加载内核
init/ main.c
调用start_kernel()
似乎没什么内容,其实以上引用的那些地址想把我要说的事都说了,比我专业。
等待我整理清楚了,能以更干练的语言叙述出来,再以此扩充吧。
多多包涵