內(nèi)核開(kāi)發(fā)的特點(diǎn)
內(nèi)核編程時(shí)既不能訪問(wèn)c庫(kù),也不能訪問(wèn)標(biāo)準(zhǔn)的c頭文件零抬。
內(nèi)核編程必須使用镊讼,gnuc
內(nèi)核編程時(shí)缺乏像用戶空間那樣的內(nèi)存保護(hù)機(jī)制。
內(nèi)核編程時(shí)難以執(zhí)行浮點(diǎn)運(yùn)算平夜。
內(nèi)核給每個(gè)進(jìn)程只有一個(gè)很小的定長(zhǎng)堆棧蝶棋。
由于內(nèi)核支持異步中斷,搶占和smp忽妒,因此必須時(shí)刻注意同步和并發(fā)玩裙。
要考慮可移植的重要性。
定義一個(gè)內(nèi)聯(lián)函數(shù)的時(shí)候锰扶,需要使用static作為關(guān)鍵字,并且用inline限定它寝受,比如:
static inline void wolf()坷牛。內(nèi)聯(lián)函數(shù)必須在使用之前就定義好,由于使用了Static關(guān)鍵字進(jìn)行限制很澄,所以編譯時(shí)不會(huì)為內(nèi)聯(lián)函數(shù)單獨(dú)建立一個(gè)函數(shù)體京闰。如果一個(gè)內(nèi)聯(lián)函數(shù)僅僅在某一個(gè)源文件中使用颜及。那么也可以把它定義在該文件開(kāi)始的地方。
gcc編譯器支持在c函數(shù)中嵌入?yún)R編指令蹂楣,我們通常使用asm()指令嵌入?yún)R編代碼俏站。
對(duì)于條件選擇語(yǔ)句,gcc內(nèi)建了一條指令用于優(yōu)化在一個(gè)條件經(jīng)常出現(xiàn)痊土,或者該條件很少出現(xiàn)的時(shí)候肄扎,編譯器可以根據(jù)這條指定對(duì)條件分支選擇語(yǔ)句進(jìn)行優(yōu)化。內(nèi)核把這條指令封裝成了宏赁酝,比如likely()和unlikely()犯祠。
如果一個(gè)用戶進(jìn)程試圖進(jìn)行一次非法的內(nèi)存訪問(wèn)內(nèi)核,就會(huì)發(fā)現(xiàn)這個(gè)錯(cuò)誤酌呆,發(fā)送s i g s e g v信號(hào)衡载,并結(jié)束整個(gè)進(jìn)程。而如果內(nèi)核自己非法訪問(wèn)內(nèi)存隙袁,那后果就很難控制了痰娱。畢竟,誰(shuí)能照顧內(nèi)核呢菩收??jī)?nèi)核中發(fā)生的內(nèi)存錯(cuò)誤會(huì)導(dǎo)致oops梨睁,這是內(nèi)核中經(jīng)常出現(xiàn)的一種錯(cuò)誤,在內(nèi)核中不應(yīng)該去訪問(wèn)非法的內(nèi)存地址坛梁,引用空指針之類的事情而姐,否則他可能會(huì)死掉,卻根本不告訴你一聲划咐。在內(nèi)核風(fēng)險(xiǎn)風(fēng)長(zhǎng)比外面大一些拴念。
此外,內(nèi)核中的內(nèi)存都不分頁(yè)褐缠。也就是說(shuō)你每用掉一個(gè)字節(jié)政鼠,物理內(nèi)存就減少一個(gè)字節(jié)。
在用戶空間的進(jìn)程進(jìn)行浮點(diǎn)數(shù)操作的時(shí)候队魏,內(nèi)核會(huì)完成從整數(shù)操作到浮點(diǎn)數(shù)操作的模式轉(zhuǎn)換公般。在執(zhí)行浮點(diǎn)數(shù)指令時(shí)到底會(huì)做些什么呢?因體系結(jié)構(gòu)不同胡桨,內(nèi)核的選擇也不相同官帘,但是內(nèi)核通常捕獲陷阱并著手于整數(shù)到浮點(diǎn)方式的轉(zhuǎn)變。
與用戶空間進(jìn)程不同昧谊,內(nèi)核并不能完美的支持浮點(diǎn)操作刽虹,因?yàn)樗旧聿荒芟萑搿T趦?nèi)核中使用浮點(diǎn)數(shù)時(shí)呢诬,除了要人工保存和恢復(fù)浮點(diǎn)寄存器涌哲,還有其他一些瑣碎的事情要做胖缤。如果直接了當(dāng)?shù)幕卮穑蔷褪莿e這么做了阀圾,除了一些基礎(chǔ)的情況不要在內(nèi)核中使用浮點(diǎn)數(shù)操作哪廓。
用戶空間的程序可以從棧上分配大量的空間來(lái)存放變量,甚至巨大的結(jié)構(gòu)體或者是包含數(shù)以千計(jì)的數(shù)據(jù)項(xiàng)的數(shù)組都沒(méi)有問(wèn)題初烘。之所以可以這么做涡真,是因?yàn)橛脩艨臻g的棧本身比較大,而且還能隨著發(fā)展而不斷增大账月。
內(nèi)核棧的準(zhǔn)確大小隨著體系結(jié)構(gòu)而變综膀,再x86上,棧的大小局齿,在編譯時(shí)配置剧劝,可以是4KB也可以是8KB,從歷史上說(shuō)內(nèi)核棧的大小是兩頁(yè)抓歼,這意味著32位機(jī)的內(nèi)核棧是8KB讥此,而64位機(jī)是16KB,這是固定不變的谣妻,每個(gè)處理器都有自己的棧萄喳。