读核日记(一)

馃拕馃巵馃惐

馃拕馃巵馃惐

2016-01-29 19:45

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

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

面对近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来产生子进程.从而达到交互式操作系统的设计要求.

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

.启动系统.当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。

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

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

Loading ....[ bootsect.S ]

uncompress .....[ decompress_kernel() ]

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

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

展开更多 50%)
分享

猜你喜欢

读核日记(一)

Linux Linux命令 Linux安装 Linux编程 Linux桌面 Linux软件 Linux内核 Linux管理
读核日记(一)

读核日记(六)

Linux Linux命令 Linux安装 Linux编程 Linux桌面 Linux软件 Linux内核 Linux管理
读核日记(六)

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

读核日记(三)

Linux Linux命令 Linux安装 Linux编程 Linux桌面 Linux软件 Linux内核 Linux管理
读核日记(三)

读核日记(四)

Linux Linux命令 Linux安装 Linux编程 Linux桌面 Linux软件 Linux内核 Linux管理
读核日记(四)

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

读核日记(五)

Linux Linux命令 Linux安装 Linux编程 Linux桌面 Linux软件 Linux内核 Linux管理
读核日记(五)

读核日记(二)

Linux Linux命令 Linux安装 Linux编程 Linux桌面 Linux软件 Linux内核 Linux管理
读核日记(二)

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

显示目录下所有的文件(含文件夹)

显示目录下所有的文件(含文件夹)

Photoshop教程:合成打造魔幻之夜场景

Photoshop教程:合成打造魔幻之夜场景
下拉加载更多内容 ↓