读核日记(一)

2016-01-29 19:45 9 1 收藏

读核日记(一),读核日记(一)

【 tulaoshi.com - Linux 】

 

今天开始我的读核罹难记.第一次读内核,整整上学时的考试前.胡里胡涂的就过去了,没甚收获.这次我发誓要彻底读一次.

面对近50 m 的源码,困惑是难免的所以我决定先从大面上把握,再在某一些具体的点上切入.这样一来linux 的启动过程便十分重要,因此我先用dmesg命令察看一下linux启动时打出的消息.(我想源文件应在/usr/src/linux/init/main.c中)

内核的启动最后是到 start_kernel ( in /init/main.c )也就是说启动的过程是从 head.S ( arch/i386/boot/ ) 一直运行到 main.c(start_kernel) .它的作用是完成开机后的设置与内核的初始化,然后,系统究竟入一个无限的循环中等待用户的输入,调用fork来产生子进程.从而达到交互式操作系统的设计要求.

第一部分 : 内核初始化以及启动.

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/linux/)

.启动系统.当PC机加电开始启动时,80X86的处理器(CPU)在实模式下自检,开始执行物理地址0xFFFF0即ROM-BIOS的起始地址处的代码。PC机的BIOS进行系统自检,初始化中断向量表到物理地址0x0。然后把引导设备的第一个扇区加载到地址0x7C00,执行此处的指令。到这里与linux无关,x86系列的硬件设置如此.

linux的内核本身是不能自举的,所以lilo和loadlin的作用就是加载系统内核.有关lilo的原理可以参考lilo的readme.从加电到内核加载的过程是:加电-执行BIOS-加载第一扇区-lilo-加载内核

Linux内核的最初部分代码是用汇编语言写的(文件是boot/bootsect.s)。(我的汇编水平有限,暂且不看),它首先把自身这部分代码移到绝对地址0x90000,把下面的2K代码从引导设备加载到地址0x90200上,内核的其余部分加载到地址0x10000处。在加载系统时显示“loading...”. 然后,程序控制权交给另一个实模式汇编程序(boot/Setup.S)。接下来,此程序把整个系统从地址0x10000移到地址0x1000,进入保护模式。程序控制转给系统的其余部分即地址0x1000。

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/linux/)

下一个步骤是系统内核的解压过程,这部分代码在地址0x1000(文件/Boot/head.S),该段程序初始化寄存器,然后执行decompress_kernel(),这个函数源于zBoot/inflate.c、zBoot/unzip.c和zBoot/misc.c三个文件

Loading ....[ bootsect.S ]

uncompress .....[ decompress_kernel() ]

main.c --- start_kernel() 开始.

开始 printk(banner);

Linux version 2.2.6 (root@lance) (gcc version 2.7.2.3) (检查一下GCC 的版本号, 在/init/main.c 中如果gcc 的版本号不够,时不允许编译内核的)

#40 Sun Apr 18 17:44:20 CST 1999

调用init_time()打印出以下内容:

Detected 199908264 Hz processor.

然后运行 console_init() -- drivers/char/tty_io.c */

Console: colour VGA+ 80x25

运行一个循环,测量一下 MIPS – 据说是要用一个确定的机器指令周期来实现实时的延迟.

Calibrating delay loop... 199.48 BogoMIPS

初始化内存/* init_mem */

Memory: 63396k/65536k available (848k kernel code, 408k reserved, 856k data

, 28k

/** dquote_init() **/

VFS: Diskquotas version dquot_6.4.0 initialized

察看cpu 的类型(在2.2.14 以后听说增加了对多种cpu 的支持, 以后我可得用心看看,if I can find a bug of intel then ……)

CPU: Intel Pentium Pro stepping 09

初始或处理器与协处理器,对于比较老的处理器, linux 会用软件模拟协处理器?

Checking 386/387 coupling... OK, FPU using exception 16 error reporting.

检查治理的合法性

Checking 'hlt' instruction... OK.

POSIX conformance testing by UNIFIX

此后调用 linux_thread(init ,..,..,)(arch/i386/kernel/process.c)

创建一个运行 init 的进程.

进入了第二阶段用户模式 ( user_mode )End of start_kerne最后进入cpu_idle ( arch/i386/kernel/process.c )

第二部分 设备的初始化

对设备的初始化调用. init()---do_basic_init()--+

pci_init() 对pci 设备的初始化( 在main.c文件中有这样一段 ifdef PCI …..需要看一下)下面打印出结果:

PCI: PCI BIOS revision 2.10 entry at 0xfd8d1

PCI: Using configuration type 1

来源:http://www.tulaoshi.com/n/20160129/1510033.html

延伸阅读
标签: 孕妇食谱
一周孕妇食谱日记      刚怀孕那会肚子总感觉很饥饿,但这种饥饿感和怀孕前空腹的那种饥饿感有所不一样,怎么吃都感觉很饿。就像电视上的饿死鬼投胎一样。记得刚怀孕那时家里人对营养方面是很重视的,甚至还制定了一周的孕妇食谱,下面就让图老师小编为大家分享下吧!     星...
胶囊日记怎么删除日记?   胶囊日记怎么删除日记? 胶囊日记可以删除吗?胶囊的规则是只有当天写的日记可以修改和删除。过去的都是历史,不能被改变。 只有当天可以修改删除,过了晚上12:00就不能再删除了。 等到日记本过期的时候可以查看,过期了的也不能修改删除。
标签: 健康养生
樱桃是营养价值很高的水果,不仅可以生吃,还可以制作果酱来使用。可是大家总是在去核这里犯了难,那么怎么才能快速去核呢?我马上就把方法分享给大家!   怎样轻松去除樱桃核 1.首先就是把樱桃统统洗干净,然后把樱桃把给摘掉。 2.拿一根筷子洗干净。 ...
标签: 生活常识
痔核怎么消除 痔核怎么消除 第一,患上了痔疮以后,要注意自己每天的饮食,特别是要多吃一些排毒和促进肠胃蠕动的食物,这样才能够让痔疮的症状慢慢消失。 第二,不能因为我们工作忙碌,从而忽略了对痔疮的护理,要保持清洁,卫生。 第三,要多摄取水分及纤维,便秘是造成痔疮的最大诱因,因此,为防治便秘,须多喝水及多吃富含纤...
奶酪怎么设置已读消息为未读          不小心查看了好友的消息?但是不想好友知道你查看了TA的消息?没关系,小伙伴们可以把已读消息设置为未读,现在就跟小编一起操作,看奶酪怎么设置已读消息唯爱未读。 打开奶酪,点击长按要设置为未读的消息,然后点击即可。