浅析内核启动过程

(弃我去者,昨日之日不可留;乱我心者,今日之日多烦忧)

 

受心魔所困,又整整沉沦了一个晚上加一上午。本来想为某人写点东西,下午冷静下来,看了一会儿书,发现一些事情最坏的情况,不过就如此,就让它去吧。是我的,终究是我的,不是我的,我也不去强求。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()

 

似乎没什么内容,其实以上引用的那些地址想把我要说的事都说了,比我专业。

等待我整理清楚了,能以更干练的语言叙述出来,再以此扩充吧。

多多包涵委屈



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值