一、模块
1.模块
是一个功能代码的集合,依附于操作系统,在内核空间
可以动态的添加到系统,也可以动态的从系统卸载,系统不受影响
2.怎么运行?
系统启动之后分为用户空间和内核空间:应用程序运行在用户空间,当应用程序段错误时不会对内核造成影响,同时,用户空间是不能之间访问内核空间,更安全。模块加载到系统运行,可以直接从系统卸载,系统不受影响,如果段错误了,则会导致系统奔溃。
3.模块与应用程序区别
应用程序 模块
./程序名执行完结束了 当加载到系统时会一直存在,直到模块卸载
用户空间 内核空间,权限更大
段错误不会造成系统奔溃 段错误会导致系统奔溃
从头到尾都是单任务 预先注册到系统,被动被调用
二、Makefile编写
1 PWD = $(shell pwd) /*自己模块的路径*/
2 KERNELDIR=/home/hqyj/driver/linux-3.14 /*你自己的linux-3.14的路径*/
3
4 obj-m := mymod.o /* 让编译器将mymod.c编译成mymod.o */
5 mymod-objs := mymod1.o mymod2.o /* mymod-objs把mymod1.o mymod2.o处理成mymod.o提供给obj-m */
6 all:
7 make -C $(KERNELDIR) M=$(PWD) modules /*进入到内核目录下借助内核的Makefile将我们自己的mymod.o编译成mymod.ko*/
cp *.ko /home/hqyj/mydd/rootfs
8 clean:
9 make -C $(KERNELDIR) M=$(PWD) clean
三、加载和卸载模块
1.先搭建nfs环境
set bootargs root=/dev/nfs nfsroot=192.168.7.48:/home/wangdefa/mydd/rootfs,v3 rw console=ttySAC2,115200 clk_ignore_unused init=/linuxrc ip=192.168.7.147
2.加载和卸载模块
insmod mymod.ko //加载模块到系统 调用mymod_init
lsmod //显示模块
rmmod mymod //卸载模块 调用mymod_exit
【错误】error: can not change directory /lib/modules
解决方法:
mkdir /lib/modules/3.14.0
rmmod mymod
四、模块传参
module_param(参数名,参数类型,权限)
eg:
module_param(name,charp,0);//指定给name传参
【验证】
insmod mymod.ko name="myled" num=200