資源描述:
《簡析linux內(nèi)核的內(nèi)核執(zhí)行流程》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在應(yīng)用文檔-天天文庫。
1、簡析linux內(nèi)核的執(zhí)行流程----從bootsect.s到main.c(內(nèi)核版本0.11)Linux啟動的第一階段(從開機(jī)到main.c)3個任務(wù):A、啟動BIOS,準(zhǔn)備實模式下的中斷向量表和中斷服務(wù)程序。B、從啟動盤加載操作系統(tǒng)程序到內(nèi)存。C、為執(zhí)行32的main函數(shù)做過渡準(zhǔn)備。內(nèi)存變化如下:① 、0xFE000到0xFFFFF是BIOS啟動塊,其中上電后第一條指令在0xFFFF0。② 、而后0x00000到0x003FF總共1KB存放中斷向量表,而接下去的地址到0x004FF共256B存放BIOS數(shù)據(jù),從0x0E05B開始的
2、約8KB的內(nèi)存中存放中斷服務(wù)程序。③ 、利用BIOS中斷0x19h把硬盤的第一扇區(qū)bootsect.s的代碼加載到內(nèi)存中,即0x07c00處,后轉(zhuǎn)到該處執(zhí)行。④ 、將bootsect.s的代碼復(fù)制到0x90000處。⑤ 、利用中斷0x13h將setup.s程序加載到內(nèi)存0x90200處。⑥ 、再將剩余的約240個扇區(qū)的內(nèi)容加載到0x10000~0x2EFFF處。⑦ 、開始轉(zhuǎn)到setup.s處執(zhí)行,第一件事就利用BIOS提供的中斷服務(wù)程序從設(shè)備上獲取內(nèi)核運行的所需系統(tǒng)數(shù)據(jù)并存在0x90000的地址處,這時將原來bootsect.s的
3、代碼覆蓋得只剩2Byte的空間。① 、關(guān)中斷并將系統(tǒng)代碼復(fù)制到0x00000處,將原來放在這里的中斷向量表與BIOS數(shù)據(jù)區(qū)覆蓋掉,地址范圍是0x00000~0x1EFFF。同時制作兩表與兩寄存器。② 開地址線A20,尋址空間達(dá)到4GB,后對8259重新編程,改變中斷號。③ 、轉(zhuǎn)到head.s(大小是25K+184B)執(zhí)行,執(zhí)行該程序完后是這樣的:0x00000~0x04FFF:頁目錄與4個頁表,每一項是4KB,共20KB;0x05000~0x05400:共1KB的空間是軟盤緩沖區(qū);0x05401~0x054b8:共184B沒用;0
4、x054b9~0x05cb8:共2KB的空間存中斷描述符表;0x05cb9~0x064b8:共2KB的空間存全局描述符表;之后就是main函數(shù)的代碼了!第二階段、從main.c函數(shù)到系統(tǒng)準(zhǔn)備完畢階段。第一步:創(chuàng)建進(jìn)程0,并讓進(jìn)程0具備在32位保護(hù)模式下載主機(jī)中的運算能力。流程是:復(fù)制根設(shè)備和硬盤參數(shù)表(main.c中的102、110、111行)物理內(nèi)存規(guī)劃格局(main.c的112行~126行,其中有rd_init函數(shù)定義在kernel/ramdisk.c中,此函數(shù)用于虛擬盤初始化;而mem_init函數(shù)是用于內(nèi)存管理結(jié)構(gòu)初始化,
5、定義在mem/memory.c中,該函數(shù)頁面使用虛擬盤設(shè)置與初始化次數(shù)均設(shè)置成100,然后再依據(jù)主內(nèi)存的起始位置和終止位置將處于主內(nèi)存的所有頁面的使用次數(shù)全部清零,系統(tǒng)以后把使用次數(shù)為0的頁面視為空閑頁面。)內(nèi)存管理結(jié)構(gòu)mem_map初始化異常處理類中斷服務(wù)程序掛接(在main.c的127行,trap()函數(shù)定義kernel/trap.c,目的是將各種中斷與中斷描述符表掛接。)初始化塊設(shè)備與字符設(shè)備請求項結(jié)構(gòu)(在main.c的128、129行,blk_dev_init()定義在kernel/blk_dev/ll_rw_blk.c,
6、chr_dev_init()定義在kernel/chr_dev/tty_io.c)將串口與顯示器外設(shè)的中斷服務(wù)程序掛接(在main.c的130行,tty_init()定義在kernel/chr_dev/tty_io.c)開啟時間設(shè)置(在main.c的131行,time_init()定義于main.c函數(shù)76行startup_time)系統(tǒng)開始激活進(jìn)程0(在main.c的131行,sched_init()定義在kernel/sched.c函數(shù)中,該函數(shù)實現(xiàn)進(jìn)程相關(guān)事務(wù)設(shè)置依據(jù)時鐘中斷設(shè)置,系統(tǒng)調(diào)用服務(wù)程序掛接。系統(tǒng)調(diào)用函數(shù)是對用戶程
7、序的最基本支持,利用的是進(jìn)程相關(guān)事務(wù)初始化設(shè)置系統(tǒng)調(diào)用軟中斷,詳細(xì)見下面講的。)時鐘中斷設(shè)置系統(tǒng)調(diào)用服務(wù)程序掛接初始化緩沖區(qū)管理結(jié)構(gòu)(在main.c中133行,buffer_init(buffer_memory_end)定義fs/buffer.c)初始化硬、軟盤(main.c中134、135行,hd_init與floppy_init定義于kernel/blk_drv/hd.c和kernel/blk_drv/floppy.c)開中斷(main.c中136行,sti())第二步:以進(jìn)程0為母本創(chuàng)建進(jìn)程1,使進(jìn)程1不僅僅具備進(jìn)程0所擁有
8、的能力,而且還能以文件的形式與外設(shè)進(jìn)行數(shù)據(jù)交互。流程是:操作系統(tǒng)為進(jìn)程0創(chuàng)建進(jìn)程1做準(zhǔn)備main.c中137行,move_to_user_mode()定義在include/asm/system.h,實現(xiàn)從內(nèi)核態(tài)到用戶態(tài)。進(jìn)程0正式開始執(zhí)行,而后執(zhí)行