更詳細(xì)的講解和代碼調(diào)試演示過程,請參看視頻
用java開發(fā)C語言編譯器
更詳細(xì)的講解和代碼調(diào)試演示過程,請參看視頻
如何進(jìn)入google,算法面試技能全面提升指南
如果你對機(jī)器學(xué)習(xí)感興趣询枚,請參看一下鏈接:
機(jī)器學(xué)習(xí):神經(jīng)網(wǎng)絡(luò)導(dǎo)論
更詳細(xì)的講解和代碼調(diào)試演示過程喊崖,請參看視頻
Linux kernel Hacker, 從零構(gòu)建自己的內(nèi)核
我們的操作系統(tǒng)通過增添內(nèi)核接口導(dǎo)出機(jī)制后,已經(jīng)可以作為平臺豪直,運(yùn)行應(yīng)用程序了劣摇,但目前應(yīng)用程序的開發(fā)有一個(gè)不足就是,我們只能使用匯編語言開發(fā)應(yīng)用程序弓乙,用匯編語言開發(fā)程序?qū)嵲谔哿四┤冢绻苁褂肅語言就好了,例如當(dāng)我們想要開發(fā)一個(gè)在控制臺上輸出一個(gè)字符的應(yīng)用程序暇韧,如果代碼能用C語言這么寫就好了(app.c):
void api_putchar(int c);
void main() {
api_putchar('C');
return;
}
如果上面的代碼能編譯成二進(jìn)制文件勾习,并能通過系統(tǒng)加載執(zhí)行,那么在我們的操作系統(tǒng)上開發(fā)應(yīng)用程序就不必要像以前那么痛苦懈玻。我們這一節(jié)要做的是巧婶,研究如何使用C語言開發(fā)運(yùn)行在我們系統(tǒng)之上的應(yīng)用程序。
實(shí)際上涂乌,我們用C語言開發(fā)內(nèi)核的步驟艺栈,可以平移到開發(fā)應(yīng)用程序上。我們開發(fā)內(nèi)核時(shí)湾盒,實(shí)際上遵循著的基本邏輯是這樣的:用匯編開發(fā)底層接口湿右,然后用C語言調(diào)用匯編語言導(dǎo)出的接口,實(shí)現(xiàn)業(yè)務(wù)邏輯罚勾。然后把C代碼編譯成二進(jìn)制文件毅人,接著使用objconv 工具把C語言反編譯成匯編語言,下一步就是把原來的用匯編開發(fā)的代碼跟反編譯后得到的匯編代碼合二為一尖殃,最后用匯編編譯器把整合起來的匯編代碼編譯成一個(gè)統(tǒng)一的二進(jìn)制可執(zhí)行文件丈莺。
我們用C語言開發(fā)應(yīng)用程序也遵循上面的邏輯。首先我們用匯編語言導(dǎo)出內(nèi)核API接口分衫,用C語言調(diào)用匯編語言導(dǎo)出的接口完成業(yè)務(wù)邏輯的編寫场刑,接著把C語言代碼編譯成二進(jìn)制,再使用objconv反匯編蚪战,最后把兩個(gè)匯編語言代碼合二為一牵现,統(tǒng)一編譯成一個(gè)可執(zhí)行的二進(jìn)制文件。
基于上面的邏輯步驟邀桑,我們第一步要做的就是用匯編語言導(dǎo)出api_putchar函數(shù)調(diào)用的接口瞎疼,實(shí)現(xiàn)代碼如下(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部分,前面我們講過壁畸,內(nèi)核所有api都對應(yīng)一個(gè)編號贼急,向控制臺輸出一個(gè)字符的api編號就是1茅茂,要調(diào)用對應(yīng)api時(shí),只要把對應(yīng)編號放入寄存器edx, 同時(shí)把參數(shù)提交給指定寄存器太抓,最后調(diào)用2D號中斷就可以了空闲。
在代碼的前面,我們首先執(zhí)行語句call main, 也就直接調(diào)用main函數(shù)走敌,這意味著用C語言開發(fā)程序時(shí)碴倾,主入口函數(shù)必須是main, 所有C語言開發(fā)的程序代碼編譯成二進(jìn)制文件后,然后反匯編成匯編程序掉丽,反匯編后的程序文件就是app.asm,通過include指令把a(bǔ)pp.asm的代碼整合到api_call.asm中來跌榔,最后使用匯編編譯器nasm 編譯 api_call.asm 所得到的二進(jìn)制文件就是用C語言開發(fā)的應(yīng)用程序。
因此我們通過以下步驟就可以使用C語言來開發(fā)應(yīng)用程序了:
1捶障, 完成api_call.asm 在里面導(dǎo)出C語言程序所需要使用的接口
2僧须, 使用C語言,通過接口調(diào)用完成業(yè)務(wù)邏輯的開發(fā)项炼,例如完成前面所述的app.c
3担平, 使用命令gcc -m32 -fno-asynchronous-unwind-tables -s -c -o app.o app.c 來編譯C語言代碼,
4, 使用objconv 反匯編步驟3所得到的二進(jìn)制文件芥挣, ./objconv -fnasm app.o app_u.asm
5驱闷,使用我們早先開發(fā)的java工具對反匯編得到的app_u.asm進(jìn)行預(yù)處理,去掉app_u.asm 里面一些無用的指令
6空免,使用nasm編譯api_call.asm , nasm -o hlt.bat api_call.asm 得到二進(jìn)制可執(zhí)行文件hlt.bat
7, 把hlt.bat的二進(jìn)制數(shù)據(jù)加載到系統(tǒng)中執(zhí)行便是執(zhí)行了用C語言開發(fā)的應(yīng)用程序空另。
具體的操作步驟請參看視頻,上面的步驟是一系列步驟精簡后的過程蹋砚,更詳實(shí)的講解和代碼運(yùn)行調(diào)試過程扼菠,請參看視頻。
經(jīng)過上述步驟后坝咐,把得到的二進(jìn)制文件加載到系統(tǒng)進(jìn)行執(zhí)行后循榆,所得結(jié)果如下:
可見運(yùn)行hlt命令后,C語言開發(fā)的程序邏輯被執(zhí)行墨坚,字符C正確的顯示到了控制臺窗口里秧饮,由此可見,經(jīng)過上述步驟泽篮,我們是可以使用C語言在我們的系統(tǒng)內(nèi)核基礎(chǔ)上開發(fā)應(yīng)用程序的盗尸。
更詳細(xì)的講解還請參看視頻。
更多技術(shù)信息帽撑,包括操作系統(tǒng)泼各,編譯器,面試算法亏拉,機(jī)器學(xué)習(xí)扣蜻,人工智能逆巍,請關(guān)照我的公眾號: