insmod :加载模块,该命令可以加入适当的参数;
rmmod:卸载模块;
内核模块的程序结构
模块加载函数(必须)
当通过insmod或modprobe命令加载内核模块时,模块会自动被内核执行,完成模块的相关初始化工作。
一般以 __init标识声名函数,并且用“module_init(初始化函数名)”来初始化
模块卸载函数
模块许可证声名
模块参数
模块导出符号
模块作者等信息声名
独立编译Makefile
#makefile for kernel module
MODNAME=helloworld
ifeq ($(PLATFORM), PC)
KERNELDIR?=/lib/modules/$(shell uname -r)/build
else
KERNELDIR?=你的linux源码编译路径
endif
obj-m := $(MODNAME).o
default:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
clean:
@rm -rf *.o *.ko *.mod.* *.tmp* module* Module*
123456789101112131415
注意ifeq 后面要有个空格
模块测试源码
#include linux/init.h
#include linux/module.h
static int __init helloworld_init(void)
{
printk(KERN_DEBUG "My first hello world kernel module!\n");
return 0;
}
static void __exit helloworld_exit(void)
{
printk(KERN_DEBUG "Bye,cruel world !\n");
}
module_init(helloworld_init);
module_exit(helloworld_exit);
1234567891011121314151617
编译
初始化变量 export PLATFORM=PC
编译: make
执行make后得到对应的.ko文件
模块加载及卸载
insmod helloworld.ko
rmmod helloworld
执行加载命令时我们希望打印 My first hello world kernel module!
卸载时我们希望能打印 Bye,cruel world !
然而实际上什么都没打印,lsmod查看helloworld.ko有成功加载
printk输出
在Linux中,内核打印语句printk()会将内核信息输出到内核信息缓冲区中,内核缓冲区是在
kernel/printk.c中通过如下语句静态定义的:
static char __log_buf[__LOG_BUF_LEN] __aligned(LOG_ALIGN);
1
内核信息缓冲区是一个环形缓冲区(Ring Buffer),因此,如果塞入的消息过多,则就会将之前的消
息冲刷掉。
printk()定义了8个消息级别,分为级别0~7,级别越低(数值越大),消息越不重要,第0级是紧急
事件级,第7级是调试级
通过/proc/sys/kernel/printk文件可以调节printk()的输出等级,该文件有4个数字值:
控制台(一般是串口)日志级别:当前的打印级别,优先级高于该值的消息将被打印至控制台。
默认的消息日志级别:将用该优先级来打印没有优先级前缀的消息,也就是在直接写printk(“xxx”)而不带打印级别的情况下,会使用该打印级别。
最低的控制台日志级别:控制台日志级别可被设置的最小值(一般都是1)。
默认的控制台日志级别:控制台日志级别的默认值。
用户可以通过dmesg命令查看内核打印缓冲区,而如果使用sudo dmesg -c命令,则不仅会显示__log_buf,还会清除该缓冲区的内容。
————————————————
版权声明:本文为CSDN博主「linyplhm」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:
Linux 添加 net 模块的方法是:
1、创建c文件和makefile文件:在任意位置创建一个文件夹(我创建的名称为/drive)mkdir drive后,输入cd drive 进入文件夹。输入vim hello.c新建hello.c文件,输入以下代码。
2、输入 vim Makefile(注意首字母大写,否则编译过程中可能会报错),敲下以下代码。
3、编译makefile文件:直接在/drive(我自己创建的文件夹)下输入make指令即可(只输入这一个单词)。
4、隐藏错误:通过指令dmesg |tail -1查看模块是否添加成功时,遇到了以下报错。
5、最后再通过dmesg |tail -1指令。
操作使用工具:Linux。
使用工具版本:CentOS-7.0-x86_64-DVD-1503-01.iso。
Linux编译内核模块Makefile中指令的作用是:
obj-m:指定构建为可加载内核模块的目标文件。 构建外部模块的命令是:make -Cpath_to_kernel_srcM=$PWD。
-C $(KERNEL_DIR):内核源所在的目录。 “make”实际上会在执行时更改为指定的目录,并在完成时更改回来。
KERNEL_DIR:指内核源目录的路径。
M = $ PWD:通知make正在构建外部模块。 赋予“M”的值是外部模块所在目录的绝对路径。
nsmod和rmmod分别用于加载和卸载模块,但是每次只能加载/卸载一个模块,如果一个模块依赖于多个模块,则需要进行多次操作,比较繁琐。modprobe命令集加载/卸载功能于一身,并且可以自动解决模块的依赖关系,将某个模块所依赖的其他模块全部加载。
用法:#modprobe 【选项】 模块 【符号=值】
同时modprobe支持很多选项
你也可以看一下ZLG的嵌入式Linux开发教程第64页,写得非常详细,我觉得很适合入门。
在2.4内核中,加载驱动命令为:insmod ,删除模块为:rmmod;
在2.6以上内核中,除了insmod与rmmod外,加载命令还有modprobe;
insmod与modprobe不同之处:
insmod 绝对路径/××.o,而modprobe ××即可,不用加.ko或.o后缀,也不用加路径;最重要的一点是:modprobe同时会加载当前模块所依赖的其它模块;
lsmod查看当前加载到内核中的所有驱动模块,同时提供其它一些信息,比如其它模块是否在使用另一个模块。
一、找出内置模块列表
要得到内置模块列表,运行下面的命令。
$ cat /lib/modules/$(uname -r)/modules.builtin
你也可以用下面的命令来查看有哪些内置模块:
二、找出内置模块参数
每个内核模块无论是内置的还是可加载的都有一系列的参数。对于可加载模块,modinfo命令可以显示它们的参数信息。然而这个命令对内置模块没有用。你会得到下面的错误。
modinfo: ERROR: Module XXXXXX not found.
如果你想要查看内置模块的参数,以及它们的值,你可以在 /sys/module 下检查它们的内容。
在 /sys/module目录下,你可以找到内核模块(包含内置和可加载的)命名的子目录。进入每个模块目录,这里有个“parameters”目录,列出了这个模块所有的参数。
比如你要找出tcp_cubic(内核默认的TCP实现)模块的参数。你可以这么做:
$ ls /sys/module/tcp_cubic/parameters
接着阅读这个文件查看每个参数的值。
$ cat /sys/module/tcp_cubic/parameters/tcp_friendliness
以上就是Linux查看内置模块的信息的方法了,这样我们就可以知道Linux安装了哪些内置模块,还可以把没用的模块删除掉,减轻系统的负担。
本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 162202241@qq.com 举报,一经查实,本站将立刻删除。