📄 1143.html
字号:
<br>
Loading ....[ bootsect.S ] <br>
<br>
uncompress .....[ decompress_kernel() ] <br>
<br>
main.c ---> start_kernel() 开始. <br>
<br>
开始 printk(banner); <br>
<br>
Linux version 2.2.6 (root@lance) (gcc version 2.7.2.3) (检查一下GCC 的版本号, 在/init/main.c 中如果gcc 的版本号不够,时不允许编译内核的)<br>
<br>
#40 Sun Apr 18 17:44:20 CST 1999 <br>
<br>
调用init_time()打印出以下内容:<br>
<br>
Detected 199908264 Hz processor. <br>
<br>
然后运行 console_init() --> drivers/char/tty_io.c */ <br>
<br>
Console: colour VGA+ 80x25 <br>
<br>
运行一个循环,测量一下 MIPS – 据说是要用一个确定的机器指令周期来实现实时的延迟.<br>
<br>
Calibrating delay loop... 199.48 BogoMIPS <br>
<br>
初始化内存/* init_mem */ <br>
<br>
Memory: 63396k/65536k available (848k kernel code, 408k reserved, 856k data <br>
<br>
, 28k <br>
<br>
/** dquote_init() **/ <br>
<br>
VFS: Diskquotas version dquot_6.4.0 initialized <br>
<br>
察看cpu 的类型(在2.2.14 以后听说增加了对多种cpu 的支持, 以后我可得用心看看,if I can find a bug of intel then ……) <br>
<br>
CPU: Intel Pentium Pro stepping 09 <br>
<br>
初始或处理器与协处理器,对于比较老的处理器, linux 会用软件模拟协处理器?<br>
<br>
Checking 386/387 coupling... OK, FPU using exception 16 error reporting. <br>
<br>
检查治理的合法性<br>
<br>
Checking 'hlt' instruction... OK. <br>
<br>
POSIX conformance testing by UNIFIX <br>
<br>
此后调用 linux_thread(init ,..,..,)(arch/i386/kernel/process.c) <br>
<br>
创建一个运行 init 的进程. <br>
<br>
进入了第二阶段用户模式 ( user_mode )End of start_kerne最后进入cpu_idle ( arch/i386/kernel/process.c ) <br>
<br>
第二部分 设备的初始化<br>
<br>
对设备的初始化调用. init()--->do_basic_init()--+ <br>
<br>
pci_init() 对pci 设备的初始化( 在main.c文件中有这样一段 ifdef PCI …..需要看一下)下面打印出结果: <br>
<br>
PCI: PCI BIOS revision 2.10 entry at 0xfd8d1 <br>
<br>
PCI: Using configuration type 1 <br>
<br>
PCI: Probing PCI hardware <br>
<br>
对Socket的初始化,socket_init() (这里也许就是linux 的网络秘密所在吧,以后我的注意) -Linux NET4.0 for Linux 2.2 <br>
<br>
Based upon Swansea University Computer Society NET3.039 <br>
<br>
NET4: Unix domain sockets 1.0 for Linux NET4.0. <br>
<br>
NET4: Linux TCP/IP 1.0 for NET4.0 <br>
<br>
IP Protocols: ICMP, UDP, TCP <br>
<br>
Starting kswapd v 1.5 kswapd_setup() <br>
<br>
调用 device_setup() <br>
<br>
Detected PS/2 Mouse Port. <br>
<br>
初始化 声卡 <br>
<br>
Sound initialization started <br>
<br>
Sound initialization complete <br>
<br>
初始化 软驱 <br>
<br>
Floppy drive(s): fd0 is 1.44M <br>
<br>
FDC 0 is a National Semiconductor PC87306 <br>
<br>
SCSI 设备的初始化 <br>
<br>
(scsi0) <Adaptec AIC-7880 Ultra SCSI host adapter> found at PCI 13/0 <br>
<br>
(scsi0) Wide Channel, SCSI ID=7, 16/255 SCBs <br>
<br>
(scsi0) Downloading sequencer code... 419 instructions downloaded <br>
<br>
scsi0 : Adaptec AHA274x/284x/294x (EISA/VLB/PCI-Fast SCSI) 5.1.10/3.2.4 <br>
<br>
<Adaptec AIC-7880 Ultra SCSI host adapter> <br>
<br>
scsi : 1 host. <br>
<br>
Vendor: SEAGATE Model: ST32155W Rev: 0596 <br>
<br>
ype: Direct-Access ANSI SCSI revision: 02 <br>
<br>
Detected scsi disk sda at scsi0, channel 0, id 0, lun 0 <br>
<br>
Vendor: SEAGATE Model: ST32155W Rev: 0596 <br>
<br>
Type: Direct-Access ANSI SCSI revision: 02 <br>
<br>
Detected scsi disk sdb at scsi0, channel 0, id 1, lun 0 <br>
<br>
scsi : detected 2 SCSI disks total. <br>
<br>
(scsi0:0:0:0) Synchronous at 40.0 Mbyte/sec, offset 8. <br>
<br>
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. <br>
<br>
SCSI device sdb: hdwr sector= 512 bytes. Sectors= 4197405 [2049 MB] [2.0 GB]Partition check: sda: sda1 | <br>
<br>
sdb: sdb1 sdb2 < sdb5 sdb6 > | <br>
<br>
安装 文件系统 filesystem_setup() <br>
<br>
安装设备驱动程序 mount_root()<br>
<br>
VFS: Mounted root (ext2 filesystem) readonly. <br>
<br>
Freeing unused kernel memory: 28k freed <br>
<br>
Adding Swap: 66540k swap-space (priority -1) <br>
<br>
Soundblaster audio driver Copyright (C) by Hannu Savolainen 1993-1996 <br>
<br>
SB 3.01 detected OK (220) <br>
<br>
<ESS ES1688 AudioDrive (rev 11) (3.01)> at 0x220 irq 5 dma 1 <br>
<br>
YM3812 and OPL-3 driver Copyright (C) by Hannu Savolainen, Rob Hooft 1993-1 <br>
<br>
996<Yamaha OPL3> at 0x388 <br>
<br>
NET4: AppleTalk 0.18 for Linux NET4.0 <br>
<br>
eth0: Intel EtherExpress Pro 10/100 at 0xf800, 00:A0:C9:49:2F:FF, IRQ 9. <br>
<br>
Board assembly 645520-034, Physical connectors present: RJ45 <br>
<br>
Primary interface chip DP83840 PHY #1. <br>
<br>
DP83840 specific setup, setting register 23 to 8462. <br>
<br>
General self-test: passed. <br>
<br>
Serial sub-system self-test: passed. <br>
<br>
Internal registers self-test: passed. <br>
<br>
ROM checksum self-test: passed (0x49caa8d6). <br>
<br>
Receiver lock-up workaround activated. <br>
<br>
NET4: AppleTalk 0.18 for Linux NET4.0 <br>
<br>
结束 do_basic_setup() <br>
<br>
open("/dev/console", O_RDWR, 0) <br>
<br>
开始执行 /sbin/init ( execv(...) ) <br>
<br>
内核就此启动完毕... <br>
<br>
这样一来系统在启动时需要的文件一目了然了.要读启动这方面的源码,大概也就可以这样行动即:<br>
<br>
Boot/head.S<br>
<br>
decompress_kernel(),然后按照个功能块来读取相应的函数.<br>
<br>
其实对于整个kernel 来说,还应该解读一下makefile ,说实话在编程来讲我是很爱写 makefile ,然而解读内核,她就是工作十分难以进行.好在有了souce insight 可以让我们轻松的找到,函数和常量的定义, 方便不少.<br>
<br>
打开main.c (其实我是将2.2.14解到了windows 下).发现有n 个函数与2n 个常量的定义,只有几个 init 函数在.对于其他的外部函数也定义了不少.这里却没有主函数—我现在怀疑linux 程序是否和vc 一样不知道从哪里开始进行:__).不过马上明白了, 整个内核事变在一块的. 还包括.存储管理, 处理机管理, 内存管理等许多模块, 她该不会启动以后就没有时刻干了吧<br>
<br>
好了, 一口吃不成胖子.我还是先从启动读起.不过我开始对是否要加中文祝时产生怀疑, 写那些代码的本身都是高手, 他们应知道怎样是最好的注释. 难道读代码的人连这点e 文也看不了?<br>
<br>
读核日记(二) <br>
本文出自:http://os.silversand.net 作者: sunmoon (2001-08-31 12:00:00) <br>
这几天看的东西,前辈有书指导,不用我费口舌, 简单介绍一下<br>
<br>
搞清楚了 linux的启动过程,对于整个系统分析来说.连一个开头都不算.所做的只是知道了系统启动是一些函数的条用顺序.恰如某位朋友来信建议的那样, 如果这样照顺序硬读,实是自残.好在sunmoon 有一定的自知之明.如此这样下去,等不懂得东西多了.那我就不能坚持了,所以我的原则是?:准备不充分决不轻易动手.<br>
<br>
身边有意高手建议,应从应用程序入手,先写一些和系统相关的有水平的程序, 在对程序尽心跟踪.了解整个系统的体系结构和调用体系.再去分析源吗.<br>
<br>
同时,sunmoon 也知道,一个操作系统是所有有关软件理论的集大成.sunmoon 不是计算机系毕业的, 对与很多基础课生疏的很.因此不得不找了<<汇编语言>><<操作系统原理>><<计算机体系结构>><<编译原理?>><<操作系统的设计与实现>>等经典的书籍放在案头备用.当然, 刚出的一本<<linux 操作系统内核分析>>更是非常好.<br>
<br>
在昨晚这些后, 我开始着手分析linux 的体系结构:<br>
<br>
linux 的内核采用的并不是现在流行(理论上应该更先进的)为内核结构.而采用的是由很多过程组成的一个整合体. 每一个过程可以相互调用. 看起来停乱.这与它的开发历程有关.但我个人感觉, linux 整体如同一个结构化的程序.(决非opp).是由不同的模块完成不同的功能, 然后经过整体的调度,整合而变成一整体.<br>
<br>
在<<linux 操作系统内核分析>>中分出了5个子系统: 进程调度, 内存管理,虚拟文件系统,进程通信,与网络接口.<br>
<br>
具体的每个子系统的功能, 接口, 子系统结构, 数据结构的描述, 可以从这本书上详细的看一看.力争对总体有一个把握.<br>
<br>
分清楚在linux 的近50 兆源吗中. 那一部分,实现什么功能, 以便以后阅读是不至于混乱.<br>
<br>
如果我又两年时间, 我会用伪码实现linux 功能的模拟.然后以写的角度去分析,这才是学人之长为我所用的绝好办法. 可惜由于一些难言之隐,我近两年的时间都有安排, 所以我只能这样读了<br>
<br>
再下一步, 应该分析Makefile<br>
读核日记(三) <br>
本文出自:http://os.silversand.net 作者: sunmoon (2001-08-31 15:00:01) <br>
在linux 中每一个进程都由task_struct 数据结构来定义. task_struct就是我们通常所说的PCB.<br>
<br>
她是对进程控制的唯一手段也是最有效的手段.<br>
<br>
当我们调用fork() 时, 系统会为我们产生一个task_struct结构.然后从父进程,那里继承一些数据,<br>
<br>
并把新的进程插入到进程树中, 以待进行进程管理.因此了解task_struct的结构对于我们理解任务<br>
<br>
调度(在linux 中任务和进程是同一概念)的关键.在进行剖析task_struct的定义之前. 我们先按照<br>
<br>
我们的理论推一下它的结构.<br>
<br>
1, 进程状态 ,将纪录进程在等待,运行,或死锁<br>
<br>
2, 调度信息, 由哪个调度函数调度,怎样调度等<br>
<br>
3, 进程的通讯状况<br>
<br>
4,因为要插入进程树,必须有联系父子兄弟的指针, 当然是task_struct型<br>
<br>
5,时间信息, 比如计算好执行的时间, 以便cpu 分配<br>
<br>
6,标号 ,决定改进程归属<br>
<br>
7,可以读写打开的一些文件信息<br>
<br>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -