筆記 《核心剖析》 03 核心程式語言和環境

2021-07-15 06:24:18 字數 2048 閱讀 1252

1、本章主要描述linux 0.12核心中使用的組合語言、目標檔案格式和編譯環境,主要目標是提供閱讀linux 0.12核心源**所需要的組合語言和gnu c語言擴充套件知識。 

首先,比較詳細地介紹了as86和gnu as匯程式設計序的語法和使用方法;

然後,對gnu c語言中的內聯彙編、語句表示式、暫存器變數以及內聯函式等核心源**中常用的c語言擴充套件內容進行介紹。

同時,詳細描述了c和彙編函式之間的相互呼叫機制。

之後,理解目標檔案格式,是了解彙編器如何工作的重要前提之一。

稍後,詳細給出linux0.12系統中使用的a.out目標檔案格式。

最後,簡單描述makefile檔案的使用方法。

看著想睡有沒有,只有看到彙編再回來查了。

3、c語言程式

gnu gcc對iso標準c89描述的c語言進行了一些擴充套件,其中一些擴充套件部分已經包括進iso c99標準中。

使用gcc彙編器編譯c語言程式時通常會經過4個處理階段,即預處理階段、編譯階段、彙編階段和鏈結階段。

內聯彙編基本格式:

asm("彙編語句"

:輸出暫存器

:輸入暫存器

:會被修改的暫存器);

gun c對c語言的兩乙個擴充是允許我們把一些變數值放到cpu暫存器中,即所謂暫存器變數。分全域性和區域性暫存器變數。linux中只是用了區域性暫存器變數,定義方法:

register int res   __asm__("ax");

內聯函式(inline):gcc可以直接將函式的**整合到呼叫該函式的**中去,這樣可以去掉呼叫它的進入退出時間開銷,從而加快執行速度。內聯函式嵌入呼叫者**中的操作是一種優化操作,因此只有進行優化編譯時才會執行**嵌入處理。若編譯過程中沒有使用優化選項「-o」,那麼內聯函式的**就會只作為普通函式呼叫來處理。內聯函式的應用格式:                 (-winline)

inline   int  inc(int *a)

(*a)++;

內聯函式 extern inline組合在一起的作用幾乎類同乙個巨集定義。

4、c與匯程式設計序的互相呼叫

c函式呼叫機制: 通過棧運算元據傳遞和區域性變數儲存。 指令call和ret用於處理函式呼叫和返回操作;呼叫指令call的作用是把返回位址壓入棧中並且跳轉到被呼叫函式開始處執行。返回位址是程式中緊隨呼叫指令call後面一條指令的位址。   

手動鏈結順序:crtl.o crti.o crtbegin.o 所有程式模組  crtend.o crtn.o  庫模組檔案。。其中crtl crti crtn由c庫提供,是其啟動模組;crtbegin crtend是c++語言啟動模組。

彙編中呼叫c函式:在匯程式設計序呼叫乙個c函式時,程式需要首先按逆向順序把函式引數壓入棧中,即函式最後乙個引數先入棧,而第乙個引數在最後呼叫指令之前入棧。然後執行call指令去執行被呼叫的函式。在呼叫函式返回後,程式需要再把先前壓入棧中的函式引數清除掉。

c中呼叫彙編函式: 原理與上相同,但是linux核心中不常用,呼叫方法的著重點是對函式引數在棧中位置的確定上。如果較短可以使用彙編內聯語句來實現。

5、linux 0.12目標檔案格式     結構及鏈結器如何工作的。

目標檔案由以下部分順序構成: a.out檔案頭、**部分、資料部分、**重定位資訊、資料重定位資訊、符號表、字串表。

鏈結程式對輸入的乙個或多個模組檔案以及相關的庫函式模組進行處理,最終生成相應的二進位制執行檔案或乙個由模組組合而成的大模組檔案。這個過程中,鏈結程式首先給執行檔案分配儲存空間,然後將所有模組中相同型別的段組合連線在一起,在輸出檔案中為指定段型別形成單一乙個段。

核心作為乙個執行程式有build工具去掉各個模組的頭結構,然後將各個它們的各個段順序組合在一起生成核心影響檔案。   引導啟動程式就可以利用rom bios中斷呼叫載入核心到記憶體中執行。

gld -m 或者nm命令,可以鏈結時在標準輸出上列印出鏈結映像資訊。其中列出了程式段裝入到記憶體中的位置資訊。通常會重定向到乙個檔案中,例如 system.map。利用這個符號表檔案,在核心或相關程式出錯時,可以我們比較容易識別的資訊。 這樣我們就可以非常方便的對核心進行除錯了。

6、make程式和makefile檔案  可以參考《跟我一步一步寫makefile》

《Windows核心程式設計》筆記1 核心物件

由於.net framework中很多地方需要用到以前win32中的一些知識點,不了解其中的來朧去脈學習起來會比較吃力,於是準備用點時間補一下windows 核心方面的知識點,參考書本是經典的核心物件是核心分配的乙個記憶體塊,這種記憶體塊是乙個資料結構,表示核心物件的各種特徵。並且只能由核心來訪問。...

Windows核心程式設計筆記 (3)核心物件

每個核心物件都只是乙個記憶體塊,它由作業系統核心分配,並只能由作業系統核心訪問,這個記憶體塊是乙個資料結構,其成員維護著於物件相關的資訊。少數成員是所有物件都有的,像安全描述符和使用計數等 大多數成員是特有的,像程序物件的程序id,檔案物件的位元組偏移量。由於核心物件的資料結構只能由作業系統核心訪問...

go語言核心程式設計 Go 語言核心檔案除錯

程式除錯對於檢查和理解程式執行過程和狀態是非常有用的。乙個核心轉儲檔案 core dump file 中包含程式程序執行時的記憶體資訊和程序狀態。它主要用於程式的問題除錯,以及在執行過程中理解程式的狀態。這些對於我們診斷程式問題原因和分析生產環境中的服務問題有非常大的幫助。在本文中,我會用乙個非常簡...