linux內核模塊筆記

主題:	1. 嵌入式基礎知識
	2. linux內核介紹
	3. 內核的編譯和安裝(x86)
	4. 第一個模塊
	5. 模塊的相關工具
	6. 模塊的符號導出
	7. 模塊的參數

1.看linux/module.h。
  這個文件所在的位置:/home/zshh/work/driver/kernel/linux-3.5/include/linux

重點看module結構體(模塊的計數就在module結構體中)
   再module這個結構體中包含模塊的狀態,模塊的初始化話函數指針的定義,
   還由exit函數指針的定義.
   其中還包括對內核參數的操作,struct kernel_param *kp 這個結構體的定義如下:
   struct kernel_param{
	const char *name; 
	const struct kernel parm_ops *ops; 
	u16 perm;
        s16 level;
        union
        {
		void *arg; 
		const struct  kparam_string *str;
		const struct kparam_array * arr; 
        };
   };

  const struct kernel parm_ops *ops;
  這個函數包含了一些讀寫參數的相關操作.
  struct kernel_param_ops
  {
    int (*set)(const char* val, const struct kernel_param *kp)

    int (*set)(char *buffer, const struct kernel_param *kp)
    
    void(*free)(void * arg)

  }


2.看__init宏

#define __init _section(.init.text)
#define __section(s) __attribute__((__section__(#S)))

這個宏最紅替換出來就是 __attribute__((__section__(".init.text")

代表他會被存放再.init.text.
 __init, __initdata等屬性標誌,
是要把這種屬性的代碼放入目標文件的.init.text節,
數據放入.init.data節──這一過程是通過編譯內核時爲相關目標平臺提供了xxx.lds鏈接腳本來指導ld完成的。

//這個函數的執行分兩種情況如下:
一:當編譯爲模塊的時候.使用insmod,或者是modprob插入模塊到內核的時候,他會被執行.
	如果插入成功, __init屬性的函數就被執行;

二:當代碼被編譯進入zImage中是,再內核引導時,執行 
	do_basic_setup()函數調用do_initcalls函數,.init節的所有函數都會被執行一遍.
        在初始化完成後,用這些關鍵字標識的函數或數據所佔的內存會被釋放掉。
三:所有的__init函數在initcall.init都有一個指針指向它.
      

3.看linux/list.h
   

4.實驗模塊參數的bool型,測試可否使用0/1,y/n等;
如果模塊的參數爲數組,則需要使用module_param_array宏來聲明
自己寫個例子,測試該宏的使用



1. 嵌入式基礎知識
=======================
嵌入式行業的當前發展情況,嵌入式系統構成等



2.linux內核的說明
=======================
kernel目錄下有兩個內核,一個是從www.kernel.org下載的標準內核,一個是由google修改、三星移植的內核;
解壓縮內核後說明一下目錄結構,並介紹內核的核心功能

3.內核的編譯安裝(x86)
=======================
(1)內核的配置
$>make menuconfig
通過圖形界面(依賴於ncurses庫),決定編譯的內核都包含哪些部分。
最終的配置結果,存儲在.config文件中
決定代碼是否編譯,如果編譯,是編譯到zImage中,還是編譯爲.ko模塊

(2)內核的編譯
$>make
編譯生成zImage內核和.ko模塊

(3)內核模塊的安裝
$>make modules_install
將生成的.ko安裝到磁盤上的特定位置(就是拷貝)
一般是/lib/modules/xxx/目錄(xxx爲編譯的內核的版本)

(4)內核的安裝
$>make install
將生成的zImage安裝到/boot目錄下
(zImage在x86上稱爲bzImage,位於arch/x86/boot/目錄下)

接下來可以重新啓動系統,看看新編譯的內核能否使用(要看運氣)



4.第一個模塊
=========================
參考x86-drv/01mod/目錄下的mod_test01.c和Makefile
認真瞭解這兩個文件中每部分的作用



5. 模塊的相關工具(5個)
=========================
(1)模塊的手工加載
$>insmod mod_test01.ko
會調用模塊的入口函數,如果是printk的信息,用$>dmesg查看

(2)模塊的手工卸載
$>rmmod mod_test01

(3)顯示模塊信息
$>modinfo xxx.ko

(4)列出內核中已經加載的模塊
$>lsmod

(5)自動加載模塊
模塊的自動加載工具。該工具可以自動將模塊所依賴的模塊也一起加載。
modprobe只能加載/lib/modules/xxx下的模塊。
$>modprobe xxx		//加載
$>modprobe -r xxx  	//卸載

tip:
$>dmesg
顯示printk的信息
$>dmesg -c
清除printk的緩衝區



6.模塊的符號導出
==========================
爲了避免命名空間污染,內核規定,.ko模塊中的所有符號默認都爲局部。必須通過EXPORT_SYMBOL宏導出後,才具有全局屬性;
EXPORT_SYMBOL宏可用於全局函數和全局變量;

寫01mod/mod_test02.c和mod_test03.c
生成模塊mod_test02.ko和mod_test03.ko
可以用insmod/rmmod或modprobe測試

$>make install  //執行Makefile中的目標install
$>modprobe mod_test03
會把依賴的mod_test02也加載

$>modprobe -r mod_test03
用-r可以卸載模塊



7.模塊的參數
=========================
用module_param宏來聲明模塊參數
參考01mod/mod_test04.c

模塊參數對應的文件是/sys/module/mod_test03/parameters/name和value
module_param宏的第3個參數,就用來確定這兩個文件的permission

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章