1 字符设备基础

常用模块操作命令
lsmod: 打印当前系统已经安装的驱动
insmod: 用来向当前内核安装一个模块 用法:insmod xxx.ko
modinfo:用来打印一个内核模块自带的信息 用法:modinfo xxx.ko
rmmod: 删除一个模块 用法:rmmod + 驱动名,新版本可以rmmod xxx.ko

模块的安装:
  insmod这个命令被执行时,就会安装一个模块,其实内部是因为有一个module_init宏,然后内部又有一个chrdev_init函数,所以最终安装的实质上,是chrdev_init函数被执行,这个函数内部有一句话:printk(KERN_DEBUG "chardev init ");可以使用dmesg

  insmod实际在执行的时候还做了其他事情,除了帮我们调用宏,譬如lsmod我们可以看到多了刚安装的模块,肯定是维护了一个链表,并且把刚刚的模块名字头插进去;

模块的卸载:

rmmod,这里面也是一个module_exit宏,对应内部函数式chardev_exit函数,所以卸载的实质也是这个函数的代码,同样可以dmesg来看printk输出的内容;同样,也在lsmod的时候删除了对应的名字;

***重要的dmesg命令,可以查看kernel 的log;比较常用的一个命令***

模块的信息:

modinfo:这里面包含很多模块的信息。

(1)使用modinfo查看模块的版本信息
(2)内核zImage中也有一个确定的版本信息
(3)insmod时模块的vermagic必须和内核的相同,否则不能安装,报错信息为:insmod: ERROR: could not insert module module_test.ko: Invalid module format
(4)模块的版本信息是为了保证模块和内核的兼容性,是一种安全措施
(5)如何保证模块的vermagic和内核的vermagic一致?编译模块的内核源码树就是我们编译正在运行的这个内核的那个内核源码树即可。说白了就是模块和内核要同出一门。

模块中常用宏
(1)MODULE_LICENSE,模块的许可证。一般声明为GPL许可证,而且最好不要少,否则可能会出现莫名其妙的错误(譬如一些明显存在的函数提升找不到)。
(2)MODULE_AUTHOR, 模块的作者。
(3)MODULE_DESCRIPTION, 
(4)MODULE_ALIAS

原文地址:https://www.cnblogs.com/yr-linux/p/5975549.html