分享
 
 
 

读核日记(一)

王朝other·作者佚名  2006-11-24
窄屏简体版  字體: |||超大  

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

面对近50 m 的[url=http://www.pccode.net].net" class="wordstyle"源码,困惑是难免的所以我决定先从大面上把握,再在某一些具体的点上切入.这样一来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三个文件

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

PCI: Probing PCI hardware

对Socket的初始化,socket_init() (这里也许就是linux 的网络秘密所在吧,以后我的注意) -Linux NET4.0 for Linux 2.2

Based upon Swansea University Computer Society NET3.039

NET4: Unix domain sockets 1.0 for Linux NET4.0.

NET4: Linux TCP/IP 1.0 for NET4.0

IP Protocols: ICMP, UDP, TCP

Starting kswapd v 1.5 kswapd_setup()

调用 device_setup()

Detected PS/2 Mouse Port.

初始化 声卡

Sound initialization started

Sound initialization complete

初始化 软驱

Floppy drive(s): fd0 is 1.44M

FDC 0 is a National Semiconductor PC87306

SCSI 设备的初始化

(scsi0) found at PCI 13/0

(scsi0) Wide Channel, SCSI ID=7, 16/255 SCBs

(scsi0) Downloading sequencer code... 419 instructions downloaded

scsi0 : Adaptec AHA274x/284x/294x (EISA/VLB/PCI-Fast SCSI) 5.1.10/3.2.4

scsi : 1 host.

Vendor: SEAGATE Model: ST32155W Rev: 0596

ype: Direct-Access ANSI SCSI revision: 02

Detected scsi disk sda at scsi0, channel 0, id 0, lun 0

Vendor: SEAGATE Model: ST32155W Rev: 0596

Type: Direct-Access ANSI SCSI revision: 02

Detected scsi disk sdb at scsi0, channel 0, id 1, lun 0

scsi : detected 2 SCSI disks total.

(scsi0:0:0:0) Synchronous at 40.0 Mbyte/sec, offset 8.

SCSI device sda: hdwr sector= 512 bytes. Sectors= 4197405 [2049 MB] [2.0 GB ](scsi0:0:1:0) Synchronous at 40.0 Mbyte/sec, offset 8.

SCSI device sdb: hdwr sector= 512 bytes. Sectors= 4197405 [2049 MB] [2.0 GB]Partition check: sda: sda1 |

sdb: sdb1 sdb2 < sdb5 sdb6 > |

安装 文件系统 filesystem_setup()

安装设备驱动程序 mount_root()

VFS: Mounted root (ext2 filesystem) readonly.

Freeing unused kernel memory: 28k freed

Adding Swap: 66540k swap-space (priority -1)

Soundblaster audio driver Copyright (C) by Hannu Savolainen 1993-1996

SB 3.01 detected OK (220)

at 0x220 irq 5 dma 1

YM3812 and OPL-3 driver Copyright (C) by Hannu Savolainen, Rob Hooft 1993-1

996 at 0x388

NET4: AppleTalk 0.18 for Linux NET4.0

eth0: Intel EtherExpress Pro 10/100 at 0xf800, 00:A0:C9:49:2F:FF, IRQ 9.

Board assembly 645520-034, Physical connectors present: RJ45

Primary interface chip DP83840 PHY #1.

DP83840 specific setup, setting register 23 to 8462.

General self-test: passed.

Serial sub-system self-test: passed.

Internal registers self-test: passed.

ROM checksum self-test: passed (0x49caa8d6).

Receiver lock-up workaround activated.

NET4: AppleTalk 0.18 for Linux NET4.0

结束 do_basic_setup()

open("/dev/console", O_RDWR, 0)

开始执行 /sbin/init ( execv(...) )

内核就此启动完毕...

这样一来系统在启动时需要的文件一目了然了.要读启动这方面的[url=http://www.pccode.net].net" class="wordstyle"源码,大概也就可以这样行动即:

Boot/head.S

decompress_kernel(),然后按照个功能块来读取相应的函数.

其实对于整个kernel 来说,还应该解读一下makefile ,说实话在编程来讲我是很爱写 makefile ,然而解读内核,她就是工作十分难以进行.好在有了souce insight 可以让我们轻松的找到,函数和常量的定义, 方便不少.

打开main.c (其实我是将2.2.14解到了windows 下).发现有n 个函数与2n 个常量的定义,只有几个 init 函数在.对于其他的外部函数也定义了不少.这里却没有主函数—我现在怀疑linux 程序是否和vc 一样不知道从哪里开始进行:__).不过马上明白了, 整个内核事变在一块的. 还包括.存储管理, 处理机管理, 内存管理等许多模块, 她该不会启动以后就没有时刻干了吧

好了, 一口吃不成胖子.我还是先从启动读起.不过我开始对是否要加中文祝时产生怀疑, 写那些代码的本身都是高手, 他们应知道怎样是最好的注释. 难道读代码的人连这点e 文也看不了?

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有