国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 開發(fā) > 綜合 > 正文

Linux啟動(dòng)過程全接觸(2)

2024-07-21 02:37:14
字體:
供稿:網(wǎng)友

  Setup()函數(shù)的功用
  
  現(xiàn)在我們就可以深入研究一下自舉過程中不可缺少的匯編語(yǔ)言函數(shù)了。
  
  Setup()函數(shù)可以在/usr/src/linux-2.4.2/arch/i386/boot/setup.S文件中找到。
  
  Setup()函數(shù)代碼是在完整的內(nèi)核自舉程序加載以后,才會(huì)跳到相應(yīng)的函數(shù)代碼處。在內(nèi)核文件中,其偏移地址是0x200。這使得自舉程序很輕易找到這段代碼,并將其拷貝到起始物理地址為0x00090200的內(nèi)存中。
  
  這個(gè)Setup()文函數(shù)到底是做什么用的?在計(jì)算機(jī)時(shí)里,內(nèi)核要正確地操作所有硬件就必需首先要檢測(cè)到它們,并且以一種有序的方式進(jìn)行初始化。Setup()函數(shù)初始化所有的硬件設(shè)備,從而為內(nèi)核操作它創(chuàng)造了一個(gè)環(huán)境。
  
  但是,前面我們不是已經(jīng)提到過BIOS會(huì)檢測(cè)所有的硬件嗎?雖然BIOS初始化了所有的硬件,但是Linux內(nèi)核并不放心,它還要以自己的方式對(duì)所有的硬件進(jìn)行初始化。Linux內(nèi)核之所以要設(shè)計(jì)成這樣,是為了增強(qiáng)可移植性和穩(wěn)定性。這也是Linux內(nèi)核要優(yōu)于很多目前可用的Unix和類Unix內(nèi)核的原因之一,并且也使得它在很多方面表現(xiàn)的非常出眾。
  
  Setup()函數(shù)主要完成以下任務(wù):
  
  (1)首先是檢測(cè)系統(tǒng)可用內(nèi)存的總量,它是通過BIOS程序來完成檢測(cè)的;
  
  (2)設(shè)置鍵盤重復(fù)延遲時(shí)間和重復(fù)速度;
  
  (3)檢測(cè)視頻卡;
  
  (4)重新初始化硬盤控制器和硬盤參數(shù);
  
  (5)檢測(cè)一個(gè)MCA;
  
  (6)檢測(cè)一個(gè)PS/2定點(diǎn)設(shè)備(鼠標(biāo)總線);
  
  (7)檢測(cè)高級(jí)電源治理器(APM)BIOS支持;
  
  (8)檢測(cè)內(nèi)核在內(nèi)存中的位置,假如在低地址0x00010000,就將其移到高地址0x00001000,如在高地址則不做任何移動(dòng);
  
  (9)設(shè)置設(shè)備中斷描述表(IDT)和全局描述表(GDT);
  
  (10)如已經(jīng)有了浮點(diǎn)單位(FPU),則重置之;
  
  (11)重新調(diào)用程序中斷控制器;
  
  (12)通過設(shè)置cr0狀態(tài)寄存器的PE位,把CPU從“實(shí)模式”切換到“保護(hù)模式”;
  
  (13)跳轉(zhuǎn)到stratup_32( )匯編語(yǔ)言函數(shù)。
  
  第一個(gè)stratup_32( )函數(shù)做什么
  
  在啟動(dòng)過程中要用到兩個(gè)stratup_32( )函數(shù),雖然它們都是匯編語(yǔ)言函數(shù),但是卻是兩個(gè)完全不同的函數(shù)。我們這里所說的函數(shù)包含在/usr/src/linux-2.4.2/arch/i386/boot/comPRessed/head.S文件里。
  
  Setup()文件執(zhí)行后,這個(gè)函數(shù)就被加載到物理地址為0x00100000或者物理地址為0x00001000的內(nèi)存中(取決于內(nèi)核是載入高或者低內(nèi)存)。
  
  當(dāng)執(zhí)行這個(gè)函數(shù)時(shí),會(huì)執(zhí)行以下的操作:
  
  (1)初始化段寄存器和一個(gè)臨時(shí)棧。
  
  (2)內(nèi)核中沒有初始化的數(shù)據(jù)都用0填充。它是通過symbols _edata和 _end來識(shí)別的。
  
  (3)執(zhí)行decompress_kernel( )函數(shù)。這個(gè)函數(shù)用于對(duì)Linux內(nèi)核解壓縮。這個(gè)時(shí)候,屏幕上將顯示“Uncompressing Linux……”信息。解壓縮完成后,就會(huì)顯示“OK, booting the kernel”信息。現(xiàn)在有一個(gè)問題,就是解完壓縮的內(nèi)核被放置在什么位置?答案是假如Linux內(nèi)核被加載低地址,那么解壓縮的內(nèi)核將被置于物理地址為0x00100000的地方。假如在高地址,則內(nèi)核會(huì)被先解壓到一個(gè)臨時(shí)緩沖區(qū)中,待完成后再將其加載到物理地址為0x00100000的地方。
  
  (4)最后,跳轉(zhuǎn)到物理地址為0x00100000的地方執(zhí)行。
  
  到此為止,代碼執(zhí)行操作就由另外一個(gè)startup_32( )函數(shù)來接管。也就是說,第二個(gè)startup_32( )函數(shù)接管了啟動(dòng)過程。
  
  第二個(gè)startup_32( )函數(shù)完成的功能
  
  解壓縮Linux內(nèi)核的工作由另外一個(gè)startup_32( )函數(shù)來完成。該函數(shù)位于/usr/src/linux-2.4.2/arch/i386/kernel/head.S文件中。
  
  這時(shí)你可能會(huì)說兩個(gè)不同的函數(shù)用同一個(gè)名字不會(huì)出錯(cuò)嗎?答案是不會(huì)的。因?yàn)閮蓚€(gè)函數(shù)都是到自己初始地址去執(zhí)行,并且都有自己的執(zhí)行環(huán)境,所以不會(huì)出錯(cuò)。
  
  下面我們來看一下第二個(gè)startup_32( )函數(shù)的功能。當(dāng)執(zhí)行這個(gè)函數(shù)時(shí),實(shí)際上是為第一個(gè)Linux進(jìn)程(process 0)設(shè)置環(huán)境。這個(gè)函數(shù)將執(zhí)行下面的操作:
  
  (1)段寄存器將以最后的值進(jìn)行初始化;
  
  (2)為process 0設(shè)置內(nèi)核模式棧;
  
  (3)調(diào)用并且執(zhí)行setup_idt( )函數(shù),該函數(shù)將把所有的IDT填充空值;
  
  (4)把從BIOS中獲得的參數(shù)放在第一頁(yè)的框架中;
  
  (5)識(shí)別處理器的模式;
  
  (6)使用GDT和IDT表加載gdtr和idtr寄存器;
  
  (7)最后跳到start_kernel( )函數(shù)。
  
  start_kernel( )函數(shù)功能
  
  start_kernel( )函數(shù)完成Linux內(nèi)核的初始化工作。
這個(gè)函數(shù)執(zhí)行后,所有的基本內(nèi)核組件都將被初始化。這也是整個(gè)啟動(dòng)過程的最后一步。
  
  該函數(shù)將完成以下的功能:
  
  (1)執(zhí)行paging_init( )函數(shù)初始化頁(yè)表(Page Tables);
  
  (2)執(zhí)行mem_init( )函數(shù)初始化頁(yè)描述符(Page Descriptors);
  
  (3)執(zhí)行trap_init( ) 和 init_IRQ( )函數(shù),最后一次對(duì)IDT進(jìn)行初始化;
  
  (4)執(zhí)行kmem_cache_init( )和kmem_cache_sizes_init ( )函數(shù),對(duì)Slab Allocator進(jìn)行初始化;
  
  (5)執(zhí)行time_init( )函數(shù),初始化系統(tǒng)日期和時(shí)間;
  
  (6)內(nèi)核的線程process 1是通過調(diào)用kernel_thread( )來完成的。接著就建立其它的內(nèi)核線程并且執(zhí)行/sbin/init程序。
  
  到此屏幕上就會(huì)顯示“Linux version 2.4.2 ……”信息。此外,還會(huì)顯示很多其它信息。最后,就會(huì)出現(xiàn)用戶的登錄提示符。這是在告訴用戶Linux內(nèi)核已經(jīng)加載完成,用戶已經(jīng)可以使用。
  Linux啟動(dòng)過程全接觸(2)
  總結(jié)
  
  到現(xiàn)在為止,整個(gè)啟動(dòng)過程都已經(jīng)描述完畢。其中提到的許多詞匯我都沒有解釋,只簡(jiǎn)要說了一下IDT、GDT、eip寄存器和cs寄存器等。因?yàn)橐獙?duì)這些內(nèi)容進(jìn)行完整的解釋需要很長(zhǎng)篇幅,并且會(huì)導(dǎo)致我們這個(gè)話題不完整。假如要進(jìn)行更深入地研究,請(qǐng)到Linux社區(qū)去求助,或者查找相關(guān)的資料。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 安龙县| 金阳县| 布拖县| 山西省| 错那县| 武穴市| 卢湾区| 罗山县| 拉萨市| 天台县| 清原| 大化| 甘泉县| 永和县| 格尔木市| 咸阳市| 城步| 河曲县| 辽源市| 屏边| 滕州市| 邢台县| 清涧县| 互助| 嫩江县| 越西县| 洞口县| 和顺县| 淳安县| 乐清市| 贺兰县| 贡嘎县| 屏东县| 福贡县| 瑞昌市| 秦皇岛市| 凤阳县| 秭归县| 乐都县| 临漳县| 富阳市|