linux 驱动程序入门 helloworld.ko

#include

#include 

#static int nbr =2;
#module_param(nbr, int, S_IRUGO)

void hello(void)
{ 
printk(KERN_DEBUG "[kernel space] begin kernel_receive\n");
}

int __init hello_init(void)
{
hello();
}

void __exit hello_exit(void)
{
printk(KERN_DEBUG "test_netlink_exit!!\n");
}

module_init(hello_init);
module_exit(hello_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("xiahzp@hdu");

#MODULE_DESCRIPTION(模块用途的简单描述);

#MODULE_VERSION(模块的版本字符串);
#MODULE_ALIAS(模块的别名);


源文件编辑好后,可以写一个Makefile 用来编译模块

Makefile:
obj-m += hello.o    #module name
modules-objs	:=hello.o      #obj files need to make module
KDIR := /lib/modules/`uname -r`/build
PWD :=$(shell pwd)
default:
	make -C $(KDIR)  M=$(PWD) modules
clean
	rm -rf  *.o *.cmd *.ko *.mod.c .tmp_versions

插入模块:insmod

卸载模块:rmmod 

查看信息: dmesg | tail -12


查看可用参数: ls /sys/module/hello/parameters

带参数加载模块:insmod hello.ko nbr=200

显示模块信息: modinfo hello.ko

小结:

在写到module_param(nbr, int, S_IRUGO) 的时候,你应该想到还有:

EXPORT_SYMBOL(name) ;   /* 可以导出模块的函数,这也是模块编写的最终目的 */

在用到insmod 和 modinfo 的时候, 你应该想到还有:

depmod               /* 分析可加载模块的依赖性,并生成modules.dep文件和映射文件 */

modeprobe   /* Linux 内核添加删除模块 */

实际上编译驱动的时候是使用预先提供的一个makefile 的,位置在:

/lib/module/`uname -r`/build/Makefile







你可能感兴趣的:(linux 驱动程序入门 helloworld.ko)