2. 關於Linux內核簡介linux
3. 操做系統和內核簡介git
- 支持對稱多處理(SMP)編程
- 內核能夠搶佔(preemptive),容許內核運行的任務有優先執行的能力安全
- 不區分線程和進程網絡
Linux內核有兩種:穩定的(具備工業級的強度,能夠普遍應用和部署)、處於開發中的。架構
Linux命名機制(可用於區分穩定的和處於開發中的內核):併發
若是版本號是偶數,則內核是穩定版;若是是奇數,內核就是開發版。異步
git其實是一種開源的分佈式版本控制工具。 Linux做爲一個開源的內核,其源代碼也能夠用git下載和管理分佈式
- 獲取最新提交到版本樹的一個副本模塊化
- $ git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git
- 下載代碼後,更新本身的分支到最新分支
- $ git pull
壓縮形式爲bzip2:$ tar xvjf linux-x.y.z.tar.bz2
壓縮形式爲zip:$ tar xvzf linux-x.y.z.tar.gz
關於參數:
-x 解開.tar格式的文件
-v 顯示詳細信息
-j 使用bzip2程序
-z 使用gzip程序
-f 使用歸檔文件
從內部源碼樹開始,運行$ patch -p1 < ../patch-x,y,z
2、內核源碼結構
配置項的二選一和三選一:
二選一:yes 或者 no
三選一:yes 或者 no 或者 module(module意味着該配置被選定了,以模塊生成。驅動程序通常都用三選一的配置項)
字符頁面的命令行工具:
make config
圖形界面工具:
make menuconfig
基於默認配置爲體系結構建立一個配置:
make defconfig
驗證和更新配置:
make oldconfig
編譯內核:
make
重定向到該文件中:
make > .. /detritus
把無用的輸出信息重定向到永無返回值的黑洞中:
make > /dev/null
將全部已編譯的模塊安裝到正確的主目錄/lib/modules下
make modules_install
緣由:(速度與大小)保證內核高效和簡練。
內核源代碼文件不能包含外部頭文件。
基本頭文件:內核源代碼頂級目錄下的include中
體系結構相關頭文件:內核源代碼樹的arch/<architecture>/include/asm目錄下
printk()函數:把格式化好的字符串拷貝到內核日誌緩衝區上,syslog程序能夠經過讀取該緩衝區來獲取內核信息。
什麼是GNU?GNU是一種操做系統,GNU提供的C編譯器就是咱們以前使用的gcc。
static inline void wolf(unsigned long tail_size);
- static:關鍵字
- inline:用於限定關鍵字
內聯函數:編譯時在它被調用的地方展開。
優勢:減小了函數調用的開銷,性能較好。
缺點:頻繁的使用內聯函數也會使代碼變長,從而在運行時佔用更多的內存。
定義內聯函數特色:時間要求高,自己長度較短的函數。
使用以前就要定義好內聯函數,通常在頭文件中定義。
爲了類型安全和易讀性,優先使用內聯函數而不是複雜的宏。
unsigned int low, high;
asm volatile("rdtsc" : "=a" (low), "=d" (high));
/* low 和 high 分別包含64位時間戳的低32位和高32位 */
- asm:嵌入彙編代碼
- volatile:不優化
彙編語言用於偏近底層或對執行時間嚴格要求的地方。
/* 若是error在絕大多數狀況下爲0(假) */
if (unlikely(error)) {
/* ... */
}
/* 若是success在絕大多數狀況下不爲0(真) */
if (likely(success)) {
/* ... */
}
對於條件選擇語句,在一個條件常常/不多出現時,編譯器可經過gcc內建的一條指令對條件分支選擇進行優化。
內核把這條指令封裝成了宏。
內核本身非法訪問內存的風險
內核中的內存都不分頁:每用掉一個字節,物理內存都減小一個
使用浮點數時,須要人工保存和恢復浮點寄存器及其餘一些繁瑣的操做。
不建議使用
內核棧的大小是編譯內核時決定的,對於不用的體系結構,內核棧的大小不同,但都是固定的。(不像用戶空間的棧能夠動態增加)
緣由:
Linux是搶佔多任務操做系統
內核支持對稱多處理器系統(SMP)
中斷異步到來
內核能夠搶佔
經常使用解決方法:自旋鎖和信號量
須要保持的特色:大部分C語言代碼與體系結構無關。