內核模塊編寫 編譯 加載/查看/刪除模塊

#include <linux/init.h>
#include <linux/module.h>

static int __init hello_init(void)
{
 printk(KERN_EMERG "ha");
 return 0;
}
static void hello_exit(void)
{
 printk("le");
} 
module_init(hello_init);
module_exit(hello_exit);

__init 表示初始化程序段 ,運行完後,系統就會回收內存空間linux

Makefile 文件shell

ifneq ($(KERNELRELEASE),)
obj-m := hello.o
else 
KDIR := /lib/modules/2.6.31-14-generic/build
all :
 make -C $(KDIR) M=$(PWD) modules
clean:
 rm -f *.ko *.o *.mod.c *.symvers
endif

編譯模塊 #make  函數

產生hell0.koui

添加hello 模塊 # insmod hello.kospa

查看hello 模塊 #lsmod 調試

刪除hello 模塊 #rmmod hellocode

注意:模塊操做以root身份運行事件


模塊應用參數

MODULE_PARAM(name(名稱),type(類型),perm(訪問權限))內存

type常見值:bool   int     charp(字符串)字符串

如int a = 1;

    char *st;

    module_param(a,int,S_IRUGO);

    module_param(st,charp,S_IRUGO);

#include <linux/init.h>
#include <linux/module.h>

static char *name = "chen";
static int age = 30;

module_param(age, int, S_IRUGO);
module_param(name, charp, S_IRUGO);

static int hello_init(void)
{
  printk(KERN_EMERG "name:%s\n",name);
  printk(KERN_EMERG "age:%d\n",age);
  return 0;
}
static void hello_exit(void)
{
 printk("le");
} 
module_init(hello_init);
module_exit(hello_exit);

控制檯優先級 決定模塊裏的printk()可否打印出來

vi   /proc/sys/kernel/printk 能夠查看 級別 控制檯 默認級別 最小級別

printk() 有8個級別 

#define KERN_EMERG 0/*緊急事件消息,系統崩潰以前提示,表示系統不可用*/
#define KERN_ALERT 1/*報告消息,表示必須當即採起措施*/
#define KERN_CRIT 2/*臨界條件,一般涉及嚴重的硬件或軟件操做失敗*/
#define KERN_ERR 3/*錯誤條件,驅動程序經常使用KERN_ERR來報告硬件的錯誤*/
#define KERN_WARNING 4/*警告條件,對可能出現問題的狀況進行警告*/
#define KERN_NOTICE 5/*正常但又重要的條件,用於提醒*/
#define KERN_INFO 6/*提示信息,如驅動程序啓動時,打印硬件信息*/
#define KERN_DEBUG 7/*調試級別的消息*/

默認級別與printk級別決定 是否能夠顯示出來(純字符模式等級低,能夠到純字符模式,查看打印效果,或者修改上面的問件)

編譯多個文件 Makefile

ifneq ($(KERNELRELEASE),)
obj-m := hello.o
hello-objs := main.o add.o

else

KDIR :=	/lib/modules/2.6.31-14-generic/build
all:
	make -C $(KDIR) M=$(PWD) modules
clean:
	rm -f *.ko *.o *.mod.c  *.symvers

endif

//  main.c
#include <linux/module.h>
#include <linux/init.h>

MODULE_LICENSE("GPL");
MODULE_AUTHOR("chen");
MODULE_DESCRIPTION("a simple module");

extern int add(int a,int b);
static int hello_init()
{
	printk(KERN_EMERG "hello \n");
	add(1,2);
	return 0;
}

static void hello_exit()
{
	printk(KERN_EMERG "ok\n");
}

module_init(hello_init);
module_exit(hello_exit);

//  add.c
int add(int a,int b)
{
	return a+b;
}

一個模塊依賴另外一個模塊函數時EXPORT_SYMBOL(依賴函數)

// 模塊 add.ko
#include <linux/init.h>
#include <linux/module.h>

int add(int a,int b)
{
	return a+b;
}

static int __init sym_init()
{
	return 0;
}

static void __exit sym_exit()
{
}

EXPORT_SYMBOL(add); //模塊之間傳遞函數

module_init(sym_init);
module_exit(sym_exit);

// 模塊 hello.ko
#include <linux/module.h>
#include <linux/init.h>

MODULE_LICENSE("GPL");
MODULE_AUTHOR("chen");
MODULE_DESCRIPTION("a simple module");

extern int add(int a,int b);
static int __init hello_init()
{
	printk(KERN_EMERG "hello \n");
	int sum = add(1,2);
	return 0;
}

static void __exit hello_exit()
{
	printk(KERN_EMERG "ok\n");
}

module_init(hello_init);
module_exit(hello_exit);

ifneq ($(KERNELRELEASE),)
obj-m := hello.o  ;這裏分別寫add.o和hello.o編譯兩個模塊

else

KDIR :=	/lib/modules/2.6.31-14-generic/build
all:
	make -C $(KDIR) M=$(PWD) modules
clean:
	rm -f *.ko *.o *.mod.c  *.symvers

endif
相關文章
相關標籤/搜索