什么是linux內核
linux就像是一個哲學的最佳實踐。如果非要對它評價,我真的不知道該怎么贊嘆,我只能自豪地說著:“linux的美麗簡直讓人沉醉。”
我只能說是我處在linux學習的修煉之路上的一個小菜鳥,linux的東西真的太豐富了,讓你感覺只要掌握了其中的一個部分,就可以在求職之路上大放光彩,因此我常常感嘆自己的弱小和無知,我離著linux的中心是多么的遙遠,我只看到眾多高聳的山峰。
前面的幾個是我比較關心的方向。我現在主要在學習linux嵌入式編程方面的知識。此外就是復雜的linux編程。我在后面會說一下我對linux編程的淺薄認識。眾多的有趣的方向,常常讓我們感覺無所適從。我不談專業的知識,我就談談我學習linux的故事,以及站在專業角度上的評論和展望好了。
我們張家亮老師曾經提起說LInux的設計是行為需求驅動型。似乎是這么說的,覺得不對勁。我對linux的感覺就是自由,合作,兼容。
linux內核體系結構
1.操作系統原理
2.匯編語言精講
3.內存管理專題
4.網絡協議棧專題
5.設備驅動專題
6.文件系統專題
7.內核項目實戰專題
1. 何為內核模塊
最笨的方法是對內核進行重新配置,然后再重新編譯。這樣的話豈不是說我加一個組件就得重新編譯內核,這顯然不是很科學的方法,其實我們的linux內核提供在運行時可進行擴展的特性,這意味著當系統啟動并運行時,我們可以向內核添加或移除部分功能。
更多linux內核視頻教程文本資料免費獲取可以后臺私信【內核】獲取。
我們在運行時添加到內核中的代碼就被稱為動態可加載內核模塊,我們簡稱為內核模塊。
2. 內核模塊的相關操作
a) 加載內核模塊:insmod
b) 卸載內核模塊:rmmod
c) 查看內核模塊:lsmod
3. 模塊聲明
a) MODULE_LICENSE(“GPL”):內核可以識別的許可證有GPL(任意版本GNU通用公共許可證)、GPL v2等
b) MODULE_AUTHOR(“作者”):聲明作者信息可以不用
c) MODULE_VERSION(“版本”):聲明版本信息也可以不用
d) MODULE_DESCRIPTION(“功能描述”):聲明模塊功能,可不用
4. 模塊參數
我們可以在加載內核模塊的時候向其傳遞參數,以讓同一代碼達到不同的效果。當然我們的參數必須用module_param宏來聲明具體如下:
1 module_param(name,type,perm)
a) name:變量名
b) type:數據類型內核支持模塊參數類型有:bool、invbool(bool的發轉,true變為false,false變為true)、charp(char類型指針值)、int、long、short、uint、ulong、ushort、
c) perm:常見的訪問許可值通常為S_IRUGO和S_IWUSR。通常情況下將他們按位或
同時我們也可以用下面的宏聲明數組:
- 1 Module_param_array(name,type,num,perm)
5. 模塊符號導出
當一個模塊要使用另一個模塊的函數(變量)的時候,要使用EXPORT_SYMBOL(符號名)或者EXPORT_SYMBOL_GPL(符號名)來申明。
注:EXPORT_SYMBOL_GPL()只適用于遵循GPL協議的模塊
簡單內核模塊實現
想必大家都記得我們在學習某種語言的時候,寫的第一個程序大部分都是輸出hello world,所以我接下來用我們剛才介紹的內核模塊去完成hello world。
1. 內核模塊編寫
通過上面部分內容的介紹,要完成第一個內核模塊不是很難,下面是自己的代碼。
- 1 #include<linux/init.h> 2 #include<linux/module.h> 3 MODULE_LICENSE("GPL"); 4 staticint hello_init(void) 5 { 6 printk("<0> hello worldn"); 7 return0; 8 } 9 staticvoid hello_exit(void) 10 { 11 printk("<0> goodbyen"); 12 } 13 module_init(hello_init);//該宏在模塊的目標代碼中增加一個特殊地段,用于說明內核初始化函數所在的位置 14 module_exit(hello_exit);//跟上面的宏對立
2. Makefile編寫
Makefile的編寫也比較簡單,要注意的地方代碼中已經說明。
1 obj-m := hello.o
2 DIRS :=/smbshare/linux-2.6.39///此處路徑為內核源碼路徑,該內核源碼必須要經過編譯,不然會報錯
3 all:
4 make -C $(DIRS) M=$(PWD) modules
5 clean:
6 rm -Rf*.o *.ko *.mod.c *.order *.symvers
經過了上面兩個步驟,我們然后編譯加載然后卸載我們的模塊進行試驗。
編譯:
加載:
查看:
卸載:
3. Printk函數簡介
printk函數為內核打印函數,其和printf函數功能類似,不過比printf多了打印權限一共有8個級別,printk的日志級別定義如下(在include/linux/kernel.h中):
1 #define KERN_EMERG 0 //緊急事件消息,系統崩潰之前提示,表示系統不可用
2 #define KERN_ALERT 1 //報告消息,表示必須立即采取措施
3 #define KERN_CRIT 2 //臨界條件,通常涉及嚴重的硬件或軟件操作失敗
4 #define KERN_ERR 3 //錯誤條件,驅動程序常用KERN_ERR來報告硬件的錯誤
5 #define KERN_WARNING 4 //警告條件,對可能出現問題的情況進行警告
6 #define KERN_NOTICE 5 //正常但又重要的條件,用于提醒
7 #define KERN_INFO 6 //提示信息,如驅動程序啟動時,打印硬件信息
8 #define KERN_DEBUG 7 //調試級別的消息
今天的內容比較簡單,只是對內核模塊有了一個初步的了解,所以我今天在給大家推薦一個比較好用的工具,叫做exvim其將好多vim的工具進行了集成,個人感覺十分方便,就是換電腦什么的也不怕自己的配置丟失了。貼一張自己使用的圖,大家有興趣的可以去http://exvim.github.io/ 了解。