java開發(fā)系統(tǒng)內(nèi)核:使用C語言開發(fā)系統(tǒng)應(yīng)用程序

更詳細(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)照我的公眾號:


這里寫圖片描述
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市莽使,隨后出現(xiàn)的幾起案子锐极,更是在濱河造成了極大的恐慌,老刑警劉巖吮旅,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件溪烤,死亡現(xiàn)場離奇詭異,居然都是意外死亡庇勃,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進(jìn)店門槽驶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來责嚷,“玉大人,你說我怎么就攤上這事掂铐『狈鳎” “怎么了?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵全陨,是天一觀的道長爆班。 經(jīng)常有香客問我,道長辱姨,這世上最難降的妖魔是什么柿菩? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮雨涛,結(jié)果婚禮上枢舶,老公的妹妹穿的比我還像新娘。我一直安慰自己替久,他們只是感情好凉泄,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蚯根,像睡著了一般后众。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上颅拦,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天蒂誉,我揣著相機(jī)與錄音,去河邊找鬼矩距。 笑死拗盒,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的锥债。 我是一名探鬼主播陡蝇,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼痊臭,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了登夫?” 一聲冷哼從身側(cè)響起广匙,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎恼策,沒想到半個(gè)月后鸦致,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡涣楷,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年分唾,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片狮斗。...
    茶點(diǎn)故事閱讀 39,841評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡绽乔,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出碳褒,到底是詐尸還是另有隱情折砸,我是刑警寧澤,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布沙峻,位于F島的核電站睦授,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏摔寨。R本人自食惡果不足惜去枷,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望祷肯。 院中可真熱鬧沉填,春花似錦、人聲如沸佑笋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蒋纬。三九已至猎荠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蜀备,已是汗流浹背关摇。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留碾阁,地道東北人输虱。 一個(gè)月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像脂凶,于是被迫代替她去往敵國和親宪睹。 傳聞我的和親對象是個(gè)殘疾皇子愁茁,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評論 2 354

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,114評論 25 707
  • 匯編與C的交合調(diào)用 在這個(gè)例子中,源代碼包含兩個(gè)文件:foo.asm, 和 bar.c.程序入口在foo.asm ...
    望月從良閱讀 1,843評論 0 6
  • TITLE: 編程語言亂燉 碼農(nóng)最大的煩惱——編程語言太多亭病。不是我不學(xué)習(xí)鹅很,這世界變化快! 有時(shí)候還是蠻懷念十幾罪帖、二...
    碼園老農(nóng)閱讀 5,321評論 2 35
  • 情理銘 閆貴忠 情不在多促煮,至純則真; 理不在深整袁,守住就行菠齿。 世之情理,唯智可通葬项。 情勢不可逆泞当,...
    閆貴忠閱讀 387評論 0 4
  • 1. 模仿湖南兒歌《月亮粑粑》寫一段荒誕不經(jīng)然而押韻的文字(不用一韻到底,可以幾句一變化): 月亮粑粑, 肚里坐個(gè)...
    起花生閱讀 133評論 3 0