linux啟動為什麼沒有先執行main函式
學過c語言的都知道,用c語言設計的程式都有乙個main函式,而且是從main函式開始執行的。linux 0.11的**是用c語言編寫的,奇怪的是,為什麼在作業系統啟動是執行的是三個由彙編寫成的程式,然後才開始執行main函式?為什麼不像我們熟知的c程式那樣,從main函式開始執行呢?
通常,我們用c語言編寫的程式都是使用者應用程式,這類程式的執行有乙個重要的特徵,就是必須在作業系統的平台上執行,這也就是說要有作業系統為應用程式建立程序,並把應用程式的可執行**從硬碟載入到記憶體。現在我們討論的是作業系統,不是普通的應用程式,這樣就出現了乙個問題,應用程式是由作業系統載入的,作業系統該由誰載入呢?(說白了這個過程就是要為linux系統的c程式的執行搭建乙個平台)
載入作業系統的時候,計算機剛剛加電,只有bios程式在這行(bios在記憶體中載入中斷向量和中斷服務程式),而且此時計算機處於16為實模式的狀態,通過bios提供的16位中斷向量表和16位的中斷服務程式,將作業系統分部分(具體說是分三批)的載入到記憶體當中(因為cpu設計為只能執行記憶體當中的東西,這裡為保護模式做準備),載入完核心程式之後則要廢除原有的中斷向量建立一套作業系統自己的中斷向量表和中斷服務程式。作業系統寫在cd 、軟盤、硬碟上(早期的linux寫在軟盤上),但無論寫在什麼儲存器上,bios總是能找到系統所在的位置,因為是「兩頭約定」和「定位識別」規定的存在。
在載入完成後,仍然沒有立即執行main函式,而是開啟a20(這意味著cpu可以進行32位定址,定址空間為4gb,2的32次冪),開啟pe和pg,建立idt、gdt...然才開始執行main函式。
linux 0.11是乙個32位的實時多工的現代作業系統,main函式肯定要執行的是32位**,編譯作業系統**時,是16位和32位兩個不同的編譯選項的,如果選了16位的,c編譯出來的就是16位模式的,結果可能是int型變數的只有兩個位元組,而不是32位的四個位元組,而linux要的是32位的編譯結果,只有這樣才能成為32為的作業系統**,這樣的**才能用到32位匯流排(即開啟a20後的匯流排),才能用到保護模式和分頁,才能成為32位的實時多工的現代作業系統。
開機時的16位實模式與main函式執行需要的32位保護模式之間有很大的差距,這個差距由head.s來彌補,這期間,head程式開啟a20,開啟pe和pg,廢舊的、16位的中斷響應機制,建立新的32位的idt...這些工作做完了,計算機已經處於32位保護模式狀態了,呼叫32為main函式的一切條件已經準備完畢,這時可呼叫main函式,後面的操作就可以用32為編譯的main函式完成。
為什麼沒有掌聲
首先,我要說明,我是山東人,我是濟南人,所以以下的所有文字,並不是針對某一地域的人 為什麼首先要說明這個,如果你們想知道原因,請去163的體育論壇,看他們的對罵 2005.10.22 為什麼沒有掌聲?今天和哥們去了泉城廣場,沒有辦法,真的不知道應該去哪兒,可以去哪兒?兩個男人嘛 如果一男一女,可能娛...
為什麼沒有Rails Inc?
idc 開源軟體的市場將會在2011年達到60億美元上下的規模。毫無疑問,風險投資商很渴望加入這場輪盤賭。這也是讓我寫這篇文章的原因。顯然這不是因為風險投資商不願意注入資金。我已經和數家公司有過好幾次關於投巨資建立rails inc這樣的談話,但是,我就是不敢興趣。有 很多原因讓我現在對風險自己沒有...
程式crash後為什麼沒有啟動JIT偵錯程式?
今天在ms ntdebugging blog上看到乙個puzzler,是說一般通過設定登錄檔的aedbug選項,當程式崩潰的時候會有乙個jit的偵錯程式跳出來 預設時候是dr.waston,但是如果裝過vs的話就會是vs 在什麼情況下debugger不會跳出來?1.在乙個執行緒啟動時,rtl會在呼叫...