日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

一 讀核日記

今天開(kāi)始我的讀核罹難記.第一次讀內(nèi)核,整整上學(xué)時(shí)的考試前.胡里胡涂的就過(guò)去了,沒(méi)甚收獲.這次我發(fā)誓要徹底讀一次.
面對(duì)近50 m 的源碼,困惑是難免的所以我決定先從大面上把握,再在某一些具體的點(diǎn)上切入.這樣一來(lái)linux 的啟動(dòng)過(guò)程便十分重要,因此我先用dmesg命令察看一下linux啟動(dòng)時(shí)打出的消息.(我想源文件應(yīng)在/usr/src/linux/init/main.c中)
內(nèi)核的啟動(dòng)最后是到 start_kernel ( in /init/main.c )也就是說(shuō)啟動(dòng)的過(guò)程是從 head.S ( arch/i386/boot/ ) 一直運(yùn)行到 main.c(start_kernel) .它的作用是完成開(kāi)機(jī)后的設(shè)置與內(nèi)核的初始化,然后,系統(tǒng)究竟入一個(gè)無(wú)限的循環(huán)中等待用戶的輸入,調(diào)用fork來(lái)產(chǎn)生子進(jìn)程.從而達(dá)到交互式操作系統(tǒng)的設(shè)計(jì)要求.
第一部分 : 內(nèi)核初始化以及啟動(dòng).
.啟動(dòng)系統(tǒng).當(dāng)PC機(jī)加電開(kāi)始啟動(dòng)時(shí),80X86的處理器(CPU)在實(shí)模式下自檢,開(kāi)始執(zhí)行物理地址0xFFFF0即ROM-BIOS的起始地址處的代碼 。PC機(jī)的BIOS進(jìn)行系統(tǒng)自檢,初始化中斷向量表到物理地址0x0 。然后把引導(dǎo)設(shè)備的第一個(gè)扇區(qū)加載到地址0x7C00,執(zhí)行此處的指令 。到這里與linux無(wú)關(guān),x86系列的硬件設(shè)置如此.
linux的內(nèi)核本身是不能自舉的,所以lilo和loadlin的作用就是加載系統(tǒng)內(nèi)核.有關(guān)lilo的原理可以參考lilo的readme.從加電到內(nèi)核加載的過(guò)程是:加電->執(zhí)行BIOS->加載第一扇區(qū)->lilo->加載內(nèi)核
Linux內(nèi)核的最初部分代碼是用匯編語(yǔ)言寫(xiě)的(文件是boot/bootsect.s) 。(我的匯編水平有限,暫且不看),它首先把自身這部分代碼移到絕對(duì)地址0x90000,把下面的2K代碼從引導(dǎo)設(shè)備加載到地址0x90200上,內(nèi)核的其余部分加載到地址0x10000處 。在加載系統(tǒng)時(shí)顯示“l(fā)oading...”. 然后,程序控制權(quán)交給另一個(gè)實(shí)模式匯編程序(boot/Setup.S) 。接下來(lái),此程序把整個(gè)系統(tǒng)從地址0x10000移到地址0x1000,進(jìn)入保護(hù)模式 。程序控制轉(zhuǎn)給系統(tǒng)的其余部分即地址0x1000 。
下一個(gè)步驟是系統(tǒng)內(nèi)核的解壓過(guò)程,這部分代碼在地址0x1000(文件/Boot/head.S),該段程序初始化寄存器,然后執(zhí)行decompress_kernel(),這個(gè)函數(shù)源于zBoot/inflate.c、zBoot/unzip.c和zBoot/misc.c三個(gè)文件
Loading ....[ bootsect.S ]
uncompress .....[ decompress_kernel() ]
main.c ---> start_kernel() 開(kāi)始.
開(kāi)始 printk(banner);
Linux version 2.2.6 (root@lance) (gcc version 2.7.2.3) (檢查一下GCC 的版本號(hào), 在/init/main.c 中如果gcc 的版本號(hào)不夠,時(shí)不允許編譯內(nèi)核的)
#40 Sun Apr 18 17:44:20 CST 1999
調(diào)用init_time()打印出以下內(nèi)容:
Detected 199908264 Hz processor.
然后運(yùn)行 console_init() --> drivers/char/tty_io.c */
Console: colour VGA80x25
運(yùn)行一個(gè)循環(huán),測(cè)量一下 MIPS – 據(jù)說(shuō)是要用一個(gè)確定的機(jī)器指令周期來(lái)實(shí)現(xiàn)實(shí)時(shí)的延遲.
Calibrating delay loop... 199.48 BogoMIPS
初始化內(nèi)存/* 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 以后聽(tīng)說(shuō)增加了對(duì)多種cpu 的支持, 以后我可得用心看看,if I can find a bug of intel then ……)
CPU: Intel Pentium Pro stepping 09
初始或處理器與協(xié)處理器,對(duì)于比較老的處理器, linux 會(huì)用軟件模擬協(xié)處理器?
Checking 386/387 coupling... OK, FPU using exception 16 error reporting.
檢查治理的合法性
Checking "hlt" instruction... OK.
POSIX conformance testing by UNIFIX
此后調(diào)用 linux_thread(init ,..,..,)(arch/i386/kernel/process.c)
創(chuàng)建一個(gè)運(yùn)行 init 的進(jìn)程.
進(jìn)入了第二階段用戶模式 ( user_mode )End of start_kerne最后進(jìn)入cpu_idle ( arch/i386/kernel/process.c )
第二部分 設(shè)備的初始化
對(duì)設(shè)備的初始化調(diào)用. init()--->do_basic_init()--

推薦閱讀