linux0 11學習筆記(2)

2021-06-26 16:03:04 字數 2064 閱讀 9871

makefile檔案:

makefile 檔案是make 工具程式的配置檔案。make 程式是使用makefile資料檔案和**檔案的最後修改時間(last-modification time)來確定那些檔案需要進行更新,對於每乙個需要更新的檔案它會根據makefile 中的資訊發出相應的命令。在makefile 檔案中,開頭為'#'的行是注釋行。檔案開頭部分的'='賦值語句定義了一些引數或命令的縮寫。在引用定義的識別符號時,需在前面加上$符號並用括號括住識別符號。前一行最後的'\'符號表示下一行是續行。all 表示建立makefile 所知的最頂層的目標。dep: 該目標或規則用於各檔案之間的依賴關係。建立的這些依賴關係是為了給make 用來確定是否需要要 重建乙個目標物件的。

簡單的makefile 檔案含有一些規則,這些規則具有如下的形式:

目標(target)... : 先決條件(prerequisites)...

命令(command)

......

其中'目標'物件通常是程式生成的乙個檔案的名稱;例如是乙個可執行檔案或目標檔案。目標也可以是所要採取活動的名字,比如'清除'('clean')。'先決條件'是乙個或多個檔名,是用作產生目標的輸入條件。通常乙個目標依賴幾個檔案。而'命令'是make 需要執行的操作。乙個規則可以有多個命令,每乙個命令自成一行。請注意,你需要在每個命令列之前鍵入乙個製表符。自動變數的值是基於目標物件及其先決條件而在命令執行前設定的。例如,』$^』的值表示規則的所有先決條件,包括它們所處目錄的名稱;』$<』的值表示規則中的第乙個先決條件;』$@』表示目標物件

.c.s: # make 老式的隱式字尾規則。該行指示make 利用下面的命令將所有的 .c 檔案編譯生成.s 匯程式設計序。':'表示下面是該規則的命令。

$*.s(或$@)# 是自動目標變數,$《代表第乙個先決條件,這裡即是符合條件 *.c 的檔案。

(cd kernel/math; make)計入子目錄執行make命令

核心的編譯過程:對boot/中的bootsect.s、setup.s 使用8086 彙編器進行編譯,分別生成各自的執行模組。再對源**中的其它所有程式使用gnu 的編譯器gcc/gas 進行編譯,並連線成模組system。再用build 工具將這三塊組合成乙個核心映象檔案image.

as86 和ld86 是由bruce evans 編寫的intel 8086 彙編編譯程式和連線程式。它完全是乙個8086的彙編編譯器,但卻可以為386 處理器編制32 位的**。linux 使用它僅僅是為了建立16 位的啟動扇區(bootsector)**和setup 二進位制執行**。該編譯器的語法與gnu 的彙編編譯器的語法是不相容的,但近似於intel 的組合語言語法(如運算元的次序相反等)。

linux 作業系統啟動部分的主要執行流程:

pc 的電源開啟後,80x86 結構的cpu 將自動進入實模式,並從位址0xffff0 開始自動執行程式**,這個位址通常是rom-bios 中的位址。pc 機的bios 將執行某些系統的檢測,並在實體地址0 處開始初始化中斷向量。此後,它將可啟動裝置的第乙個扇區(磁碟引導扇區,512 位元組)讀入記憶體絕對位址0x7c00 處,並跳轉到這個地方。啟動裝置

通常是軟碟機或是硬碟

linux 的最最前面部分是用8086 組合語言編寫的(boot/bootsect.s),它將由bios 讀入到記憶體絕對位址0x7c00(31kb)處,當它被執行時就會把自己移到絕對位址90000(576kb)處,並把啟動裝置中後2kb 位元組**(boot/setup.s)讀入到記憶體0x90200 處,而核心的其它部分(system 模組)則被讀入到從位址0x10000 開始處,因為當時system 模組的長度不會超過0x80000 位元組大小(即512kb),所以它不會覆蓋在0x90000 處開始的bootsect 和setup 模組。隨後將system 模組移動到記憶體起始處,這樣system模組中**的位址也即等於實際的實體地址。便於對核心**和資料的操作。然後將整個系統從位址0x10000 移至0x0000 處,進入保護模式並跳轉至系統的餘下部分(在0x0000 處)。

此時所有32 位執行方式的設定啟動被完成: idt、gdt 以及ldt 被載入,處理器和協處理器也已確認,分頁工作也設定好了;最終呼叫init/main.c 中的main()程式。上述操作的源**是在boot/head.s 中的。

(42)

Linux0 11學習筆記

目前狀態 中斷程式已設定,第乙個任務 init task已初始化 sched.c main 函式裡通過move to user mode 進入到task 0。目的 手工建立第二個任務 task 1,並和task 0不停切換。做法 在sched.c 建立第二個任務結構,所有值採用第乙個 union t...

Linux 0 11 核心筆記

1 任務0的堆疊問題 一直不明白schedule.c裡的task union的stack和user stack是什麼關係,head.s裡就設定了esp指向user stack,卻一直沒有用到task union,直到看到init task才明白,從進入保護模式到跳轉進使用者態都是用的user sta...

Linux0 11核心筆記( )

c語言 彙編知識 嵌入式彙編 x86處理器和程式設計的相關知識和 unix作業系統設計 linus在最初開發linux作業系統時參考了minix作業系統 作業系統 設計與實現 一種基於訊息傳遞在核心各模組之間進行通訊 資訊交換 重要的五個支柱 unix作業系統 分時作業系統 minix作業系統 gn...