《Linux内核设计与实现》读书笔记(二)- 内核开发的准备
在嘗試內(nèi)核開發(fā)之前,需要對內(nèi)核有個整體的了解。
主要內(nèi)容:
- 獲取內(nèi)核源碼
- 內(nèi)核源碼的結(jié)構(gòu)
- 編譯內(nèi)核的方法
- 內(nèi)核開發(fā)的特點
?
1. 獲取內(nèi)核源碼
內(nèi)核是開源的,所有獲取源碼特別方便,參照以下的網(wǎng)址,可以通過git或者直接下載壓縮好的源碼包。
http://www.kernel.org
?
2. 內(nèi)核源碼的結(jié)構(gòu)
?
| 目錄 | 說明 |
| arch | 特定體系結(jié)構(gòu)的代碼 |
| block | 塊設(shè)備I/O層 |
| crypo | 加密API |
| Documentation | 內(nèi)核源碼文檔 |
| drivers | 設(shè)備驅(qū)動程序 |
| firmware | 使用某些驅(qū)動程序而需要的設(shè)備固件 |
| fs | VFS和各種文件系統(tǒng) |
| include | 內(nèi)核頭文件 |
| init | 內(nèi)核引導(dǎo)和初始化 |
| ipc | 進程間通信代碼 |
| kernel | 像調(diào)度程序這樣的核心子系統(tǒng) |
| lib | 同樣內(nèi)核函數(shù) |
| mm | 內(nèi)存管理子系統(tǒng)和VM |
| net | 網(wǎng)絡(luò)子系統(tǒng) |
| samples | 示例,示范代碼 |
| scripts | 編譯內(nèi)核所用的腳本 |
| security | Linux 安全模塊 |
| sound | 語音子系統(tǒng) |
| usr | 早期用戶空間代碼(所謂的initramfs) |
| tools | 在Linux開發(fā)中有用的工具 |
| virt | 虛擬化基礎(chǔ)結(jié)構(gòu) |
?
3. 編譯內(nèi)核的方法
還未實際嘗試過手動編譯內(nèi)核,只是用yum更新過內(nèi)核。這部分等以后手動編譯過再補上。
安裝新的內(nèi)核后,重啟時會提示進入哪個內(nèi)核。當(dāng)多次安裝新的內(nèi)核后,啟動列表會很長(因為有很多版本的內(nèi)核),顯得不是很方便。
下面介紹3種刪除那些不用的內(nèi)核的方法:(是如何安裝的就選擇相應(yīng)的刪除方法)
3.1 rpm 刪除法
?? rpm -qa | grep kernel*? (查找所有l(wèi)inux內(nèi)核版本)
?? rpm -e kernel-(想要刪除的版本)
3.2 yum 刪除法
?? yum remove kernel-(要刪除的版本)
3.3 手動刪除
?? 刪除/lib/modules/目錄下不需要的內(nèi)核庫文件
?? 刪除/usr/src/kernel/目錄下不需要的內(nèi)核源碼
?? 刪除/boot目錄下啟動的核心檔案禾內(nèi)核映像
?? 更改grub的配置,刪除不需要的內(nèi)核啟動列表
?
4. 內(nèi)核開發(fā)的特點
4.1? 無標準C庫
為了保證內(nèi)核的小和高效,內(nèi)核開發(fā)中不能使用C標準庫,所以連最常用的printf函數(shù)也沒有,但是還好有個printk函數(shù)來代替。
4.2 使用GNU C,推薦用gcc 4.4或以后的版本來編譯內(nèi)核
因為使用GNU C,所有內(nèi)核中常使用GNU C中的一些擴展:
4.2.1 內(nèi)聯(lián)函數(shù)
內(nèi)聯(lián)函數(shù)在編譯時會在它被調(diào)用的地方展開,減少了函數(shù)調(diào)用的開銷,性能較好。但是,頻繁的使用內(nèi)聯(lián)函數(shù)也會使代碼變長,從而在運行時占用更多的內(nèi)存。
所以內(nèi)聯(lián)函數(shù)使用時最好要滿足以下幾點:函數(shù)較小,會被反復(fù)調(diào)用,對程序的時間要求比較嚴格。
內(nèi)聯(lián)函數(shù)示例:static inline void sample();
4.2.2 內(nèi)聯(lián)匯編
內(nèi)聯(lián)匯編用于偏近底層或?qū)?zhí)行時間嚴格要求的地方。示例如下:
unsigned int low, high; asm volatile("rdtsc" : "=a" (low), "=d" (high)); /* low 和 high 分別包含64位時間戳的低32位和高32位 */4.2.3 分支聲明
如果能事先判斷一個if語句時經(jīng)常為真還是經(jīng)常為假,那么可以用unlikely和likely來優(yōu)化這段判斷的代碼。
/* 如果error在絕大多數(shù)情況下為0(假) */ if (unlikely(error)) {/* ... */ }/* 如果success在絕大多數(shù)情況下不為0(真) */ if (likely(success)) {/* ... */ }4.3 沒有內(nèi)存保護
因為內(nèi)核是最低層的程序,所以如果內(nèi)核訪問的非法內(nèi)存,那么整個系統(tǒng)都會掛掉!!所以內(nèi)核開發(fā)的風(fēng)險比用戶程序開發(fā)的風(fēng)險要大。
而且,內(nèi)核中的內(nèi)存是不分頁的,每用一個字節(jié)的內(nèi)存,物理內(nèi)存就少一個字節(jié)。所以內(nèi)核中使用內(nèi)存一定要謹慎。
4.4 不使用浮點數(shù)
內(nèi)核不能完美的支持浮點操作,使用浮點數(shù)時,需要人工保存和恢復(fù)浮點寄存器及其他一些繁瑣的操作。
4.5 內(nèi)核棧容積小且固定
內(nèi)核棧的大小有編譯內(nèi)核時決定的,對于不用的體系結(jié)構(gòu),內(nèi)核棧的大小雖然不一樣,但都是固定的。
查看內(nèi)核棧大小的方法:
ulimit -a | grep "stack size"4.6 同步和并發(fā)
Linux是多用戶的操作系統(tǒng),所以必須處理好同步和并發(fā)操作,防止因競爭而出現(xiàn)死鎖。
4.7 可移植性
Linux內(nèi)核可用于不用的體現(xiàn)結(jié)構(gòu),支持多種硬件。所以開發(fā)時要時刻注意可移植性,盡量使用體系結(jié)構(gòu)無關(guān)的代碼。
總結(jié)
以上是生活随笔為你收集整理的《Linux内核设计与实现》读书笔记(二)- 内核开发的准备的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C/C++:程序的内存分配方式
- 下一篇: 《Linux内核设计与实现》读书笔记(五