单片机论坛

 找回密码
 立即注册

QQ登录

只需一步快速开始

搜索
查看: 906|回复: 1
打印 上一主题 下一主题
收起左侧

Linux内核模块介绍

[复制链接]
跳转到指定楼层
楼主
条梦127 发表于 2019-4-1 15:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
嵌入式设备驱动开发中将驱动程序以模块的问发布更是极大地提高了设备使用的灵活性用户只需要拿到相关驱动模块再插入到用户的内核中即可灵活地使用你的设备
1.1.2 使用Linux模块的优点
1.        用户可以随时扩展Linux系统的功能
2.        币修改当前Linux系统的驱动时只需要卸载旧模块编译目标驱动模块重新安装插入即可
3.        系统中如果需要使用新模块不必重新编译内核只要插入相应的模块即可
4.        减小Linux内核的体积节省flash
1.2 Linux模块入门
1.2.1
模块相关命令
1.2.1.1 Linux模块命令详细介绍
1.      模块安装命令insmod
insmod xxxx.ko
2.      查看当前已经安装模块lsmod
lsmod 不需要问
3.      模块卸载命令rmmod
rmmod xxxxx.ko
4.      查看模块信息modinfo
X86上操作
[root@zhifachen linux-3.5]# modinfo/root/work/rootfs/home/mod/tiny4412_hello_module.ko
filename:      /root/work/rootfs/home/mod/tiny4412_hello_module.ko
license:        GPL
depends:        
intree:         Y
vermagic:      3.5.0-FriendlyARM SMP preempt mod_unload ARMv7 p2v8
[root@zhifachen linux-3.5]#
1.2.1.2 Linux模块命令测试示例
注意模块的编译是览具体一份源码并且这份被编译过并且没有使用mrproperdistclean清除的源码工程  
1.2.2 使用makemodules编译内核源码树中的模块
1.      添加内核菜单
2.      make menuconfig 配置为 M
3.      在顶层目录终端输入makemodules
直接make 也可生成模块文件.ko,不生成zImage当你只想编译模块而不想编译zImage时候使用 make modules 命令会更加快速
1.2.3 把内核源码树中模块源文件编译到内核映像中
如果不需要配置菜单只想编译代码到内核zImageMakefile可以这样写obj-y += xxxx.o
如果不需要配置菜单只想编译代码为外部模块Makefile可以这样写 obj-m+= xxxx.o
1.2.4 在内核源码中添加自定义的模块并且编译
1.2.5 外部独立Makefile编译模块
在驱动开发阶段接触到新驱动机率非常高如果都要去修改内核源码Makefile, 太过于繁杂也不利于移植导开发中会使用另外一址法来编译模块文件
1.2.5.1 Linux内核模块代码文件模板
可以直接复制内核源码中自带的示例模板来测试drivers/char/tiny4412_hello_module.c
1.2.5.2 Linux内核模块编译Makefile模板
编译模块Makefile文件

obj-m +=  xyd_hello_module.o
all:
      @make -C /root/work/linux-3.5/  M=$(PWD)    modules
      @rm -rf *.o *.mod.c modules.order Module.symvers  *~   *.bak
clean:
      @rm -rf *.o *.mod.c modules.order  Module.symvers *.ko  *~  *.bak
make -C $(KDIR)M=$(PWD) modules
M=选项让该Makefile在构造modules目标之前返回到模块源代码目录然后modules目标指向obj-m变量中设定的模块在上面的例子中我们将该变量设置成了module.o
上面的清除规则是自己写模也可利用内核Makefile清除规则来清编译生成目标文件改进后代码

obj-m +=  xyd_hello_module.o
# x86 编译时候使用  uname -r 得到当前内核的版本号  
#KDIR :=  /lib/modules/`uname -r`/build
#arm 编译时候使用
KDIR  :=/root/work/linux-3.5

all:
      @make -C  $(KDIR)   M=$(PWD)  modules

clean:
      @make -C  $(KDIR)   M=$(PWD)  modules  clean
      @rm -f *.ko.unsigned *~

1.1.1 Linux内核printk 函数
内核中不能使用printf函数输出信息要使用printk函数这个函数有输出等级控频ġ
内核通过 printk() 输出的信息具有日志级别日志级别是通过在 printk() 输出的址串前加一个带尖括号的整数来控频模如 printk("<6>Hello, world!/n");内核中共提供了八种不同的日志级别在 linux/kernel.h 中有相应的宏对应
#defineKERN_EMERG    "<0>"    /* system is unusable  系统不可用*/
#defineKERN_ALERT     "<1>"    /* action must be takenimmediately警报必须立即采取行动*/
#define KERN_CRIT        "<2>"    /*critical conditions临界状态   */
#defineKERN_ERR        "<3>"    /* error conditions  错误状态*/
#defineKERN_WARNING  "<4>"    /* warningconditions警告状态*/
#defineKERN_NOTICE    "<5>"    /* normal but significant正常模但引人注目*/
#define KERN_INFO        "<6>"    /*informational  信息*/
#defineKERN_DEBUG     "<7>"    /* debug-level messages调试等级信息 */
可以通过 查看/proc/sys/kernel/printk 文件内容知道设置信息

[root@ChenZhiFa/]# cat /proc/sys/kernel/printk
7       4       1      7

可以通过echo 命令修改指等级
[root@ChenZhiFa/]# echo  4  4 1  7  > /proc/sys/kernel/printk

得直接使用printk( kkkk); 这样没有指明等级这种未明分定

只有等级比较当前终端等级高才会在终端上显示出来
以下进行X86 系统上的测试在纯址界面下测试有效在图形界面中是无效
在图形界面系统中按 Ctl + Alt + F2 (F2~F6键其中一个不同电脑可能不同)可以进入到纯址界面要返回按Ctl +Alt + F1不同电脑可能不同
printk   ---  不支指点数导上驱动程序也不支指点运算所有浮点运算应该放在用户空间


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾段博腾段博 腾讯朋友腾讯朋友
收藏收藏1 转播转播 分享分享 分享淘帖 顶 踩
回复

使用道具 举报

沙发
wan5500config 发表于 2019-5-7 08:41 | 只看该作者
谢谢分享
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|单片机论坛 |51Hei单片机16群 联系QQ:125739409;际交流QQ群7344883

Powered by 单片机坛网

快速回复 返回顶部 返回列表
ձһhƬձƵ ձƵɫwww ձƵ:ɫ