日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

《Linux内核设计与实现》读书笔记(二)- 内核开发的准备

發(fā)布時間:2024/4/18 linux 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《Linux内核设计与实现》读书笔记(二)- 内核开发的准备 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

在嘗試內(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è)備固件
fsVFS和各種文件系統(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)核所用的腳本
securityLinux 安全模塊
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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。