Unix如今已經發展爲一個支持搶佔式多任務、多線程、虛擬內存、換頁、動態連接和TCP/IP網絡的現代化操做系統。linux
操做系統是計算機完成基本功能和系統管理的核心,內核是操做系統的核心。在系統中運行的應用程序經過系統調用來與內核通訊。git
內核提供的服務主要有:緩存
Linux是類Unix系統,但不是Unix,也沒有直接使用Unix的源代碼。Linux內核是自由公開的軟件,開源。Linux是單內核,但汲取了微內核的精華:模塊化設計、搶佔式內核、支持內核線程以及動態裝載內核模塊的能力。ruby
使用Git來獲取最新版本源代碼:服務器
$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git
更新到Linux的最新分支:網絡
$ git pull
解壓並安裝內核源代碼:多線程
$ tar xvjf linux-x.y.z.tar.bz2/gz
使用補丁:併發
$ patch -p1 < ../patch-x.y.z
Linux中能夠配置的選項其前綴均爲CONFIG。異步
配置項二選一:yes 或 no模塊化
配置項三選一:yes 、no 或 module(以模塊形式生成,爲獨立代碼段)
簡化內核配置工具:
字符界面下的Linux工具:逐一遍歷全部的配置項,要求用戶逐一選擇,耗時長。
$ make config
基於ncurse庫編制的圖形界面工具:
$ make menuconfig
基於gtk+的圖形工具:
$ make gconfig
基於默認配置爲體系結構建立一個配置:
$ make defconfig
驗證和更新配置:
$ make oldconfig
一旦內核配置好,就能夠利用一個簡單的命令來編譯它。
$ make
儘可能減小垃圾信息的方法:對輸出進行重定向。
$ make > .. /detritus 將輸出信息重定向到這個文件目錄
$ make > /dev/null 把無用的輸出信息重定向到永無返回值的黑洞/dev/null
以多個做業編譯內核:
$ make jn n爲要衍生出的做業數,每一個處理器能夠衍生出1或2個做業,16核時n可取32
$ make modules_install
編譯時會在內核代碼目錄樹的根目錄下建立一個System.map文件,爲符號對照表,用於將內核符號和他們的起始地址對應起來,方便調試。
大部分經常使用的C庫函數在內核中都已經獲得實現,只要包含<linux/string.h>文件就可使用它們。
內聯函數的工做模式:函數會在它所調用的位置上展開,能夠消除函數調用和返回所帶來的開銷(寄存器存儲和恢復)。可是代碼會變長,佔用更多的內存空間或者緩存指令。
定義一個內聯函數的時候須要使用static做爲關鍵字並用inline限定,而且必須在使用之間就定義好。
static inline void wolf(unsigned long tail_size)
gcc編譯器支持在C函數中嵌入彙編指令。一般使用asm()指令嵌入彙編代碼。
對於條件選擇語句,在一個條件常常出現或不多出現的時候,編譯器能夠根據這條指令對條件分支進行選擇優化。並將其封裝成宏,如likely()和unlikely()。
將一個選擇標記成絕少發生的分支:
/*error絕大多數時間都會爲0*/ if(unlikely(error)){ ... }
將一個分支標記爲一般爲真的分支:
/*success一般都不會爲0*/ if(likely(success)){ ... }
內核中全部的內存都不分頁。每使用一個字節,物理內存就減小一個字節。
內核很容易產生競爭條件,許多性能要求併發地共享訪問數據。一般解決競爭的辦法是自旋鎖和信號量。