java開發系統核心:使用C語言開發系統應用程式

weixin_34007291發表於2017-06-15

更詳細的講解和程式碼除錯演示過程,請參看視訊
用java開發C語言編譯器

更詳細的講解和程式碼除錯演示過程,請參看視訊
如何進入google,演算法面試技能全面提升指南

如果你對機器學習感興趣,請參看一下連結:
機器學習:神經網路導論

更詳細的講解和程式碼除錯演示過程,請參看視訊
Linux kernel Hacker, 從零構建自己的核心

我們的作業系統通過增添核心介面匯出機制後,已經可以作為平臺,執行應用程式了,但目前應用程式的開發有一個不足就是,我們只能使用匯編語言開發應用程式,用匯編語言開發程式實在太累了,如果能使用C語言就好了,例如當我們想要開發一個在控制檯上輸出一個字元的應用程式,如果程式碼能用C語言這麼寫就好了(app.c):

void api_putchar(int c);

void main() {
    api_putchar('C');
    return;
}

如果上面的程式碼能編譯成二進位制檔案,並能通過系統載入執行,那麼在我們的作業系統上開發應用程式就不必要像以前那麼痛苦。我們這一節要做的是,研究如何使用C語言開發執行在我們系統之上的應用程式。

實際上,我們用C語言開發核心的步驟,可以平移到開發應用程式上。我們開發核心時,實際上遵循著的基本邏輯是這樣的:用匯編開發底層介面,然後用C語言呼叫匯編語言匯出的介面,實現業務邏輯。然後把C程式碼編譯成二進位制檔案,接著使用objconv 工具把C語言反編譯成組合語言,下一步就是把原來的用匯編開發的程式碼跟反編譯後得到的彙編程式碼合二為一,最後用匯編編譯器把整合起來的彙編程式碼編譯成一個統一的二進位制可執行檔案。

我們用C語言開發應用程式也遵循上面的邏輯。首先我們用匯編語言匯出核心API介面,用C語言呼叫匯編語言匯出的介面完成業務邏輯的編寫,接著把C語言程式碼編譯成二進位制,再使用objconv反彙編,最後把兩個組合語言程式碼合二為一,統一編譯成一個可執行的二進位制檔案。

基於上面的邏輯步驟,我們第一步要做的就是用匯編語言匯出api_putchar函式呼叫的介面,實現程式碼如下(api_call.asm):

[SECTION .s32]
BITS 32
call main
retf

api_putchar:
  mov edx, 1
  mov al, [esp + 4]
  int 02Dh
  ret

%include "app.asm"

我們先看api_putchar部分,前面我們講過,核心所有api都對應一個編號,向控制檯輸出一個字元的api編號就是1,要呼叫對應api時,只要把對應編號放入暫存器edx, 同時把引數提交給指定暫存器,最後呼叫2D號中斷就可以了。

在程式碼的前面,我們首先執行語句call main, 也就直接呼叫main函式,這意味著用C語言開發程式時,主入口函式必須是main, 所有C語言開發的程式程式碼編譯成二進位制檔案後,然後反彙編成彙編程式,反彙編後的程式檔案就是app.asm,通過include指令把app.asm的程式碼整合到api_call.asm中來,最後使用匯編編譯器nasm 編譯 api_call.asm 所得到的二進位制檔案就是用C語言開發的應用程式。

因此我們通過以下步驟就可以使用C語言來開發應用程式了:
1, 完成api_call.asm 在裡面匯出C語言程式所需要使用的介面
2, 使用C語言,通過介面呼叫完成業務邏輯的開發,例如完成前面所述的app.c
3, 使用命令gcc -m32 -fno-asynchronous-unwind-tables -s -c -o app.o app.c 來編譯C語言程式碼,
4, 使用objconv 反彙編步驟3所得到的二進位制檔案, ./objconv -fnasm app.o app_u.asm
5,使用我們早先開發的java工具對反彙編得到的app_u.asm進行預處理,去掉app_u.asm 裡面一些無用的指令
6,使用nasm編譯api_call.asm , nasm -o hlt.bat api_call.asm 得到二進位制可執行檔案hlt.bat
7, 把hlt.bat的二進位制資料載入到系統中執行便是執行了用C語言開發的應用程式。

具體的操作步驟請參看視訊,上面的步驟是一系列步驟精簡後的過程,更詳實的講解和程式碼執行除錯過程,請參看視訊。

經過上述步驟後,把得到的二進位制檔案載入到系統進行執行後,所得結果如下:


2849961-8d5d7e3c39334fcd
這裡寫圖片描述

可見執行hlt命令後,C語言開發的程式邏輯被執行,字元C正確的顯示到了控制檯視窗裡,由此可見,經過上述步驟,我們是可以使用C語言在我們的系統核心基礎上開發應用程式的。

更詳細的講解還請參看視訊。

更多技術資訊,包括作業系統,編譯器,面試演算法,機器學習,人工智慧,請關照我的公眾號:


2849961-816959f51079d311
這裡寫圖片描述

相關文章