三、Linux内核模块编写2(多个c文件生成一个ko文件) 您所在的位置:网站首页 linux编译c文件如何退出 三、Linux内核模块编写2(多个c文件生成一个ko文件)

三、Linux内核模块编写2(多个c文件生成一个ko文件)

2024-06-09 11:50| 来源: 网络整理| 查看: 265

本文目录 Ⅰ、多个c文件生成一个ko文件。Ⅱ、模块的安装与卸载Ⅲ、附加: 参数传入(使用不多,一般用于调试)      模块是一个目标文件,可以完成某种独立的功能,但是自身不是一个独立的进程,不能单独运行,可以动态的载入模块,使其成为内核代码的一部分,与内核其他代码的地位完全相同,当不需要某个模块功能时,还可以卸载模块。

Ⅰ、多个c文件生成一个ko文件。

( 注: ko文件为kernel object文件,也称内核模块 ) 程序包括:hello.c 、add.c 、Makefile。

a. 编写Makefile文件程序。

#多个c文件生成一个ko文件。 obj-m +=main.o #名字自定义,但是不要和.c文件的o文件名字一样!! main-objs =hello.o add.o # -objs前的名字要和定义的名字一致 # KDIR 内核源码路径,根据自己需要设置 KDIR:=/home/qjl/work/lichee/linux-3.10 all: #ARCH: 指当前编译的驱动模块的架构 #CROSS_COMPILE:指明交叉编译器的前缀 #-C: 指定去$(KDIR)目录下执行Makefile #M:告知Makefile,需要的编译文件在哪 #modules: 这个规则是用于编译驱动模块的 @make ARCH=arm64 CROSS_COMPILE=aarch64-linux- -C $(KDIR) M=$(PWD) modules @rm -fr .tmp_versions *.o *.mod.o *.mod.c *.bak *.symvers *.markers *.unsigned *.order *~ .*.*.cmd .*.*.*.cmd clean: @make ARCH=arm64 CROSS_COMPILE=aarch64-linux- -C $(KDIR) M=$(PWD) modules clean @rm -rf *.ko

b. 编写简单内核模块程序 ( hello.c )。

#include #include extern int add(int ,int); //实现入口、出口函数 /* __int只有驱动被编译进内核时才有效。 作用:执行完本函数后丢弃该函数,并释放其占用的空间。(节约空间) 原因:它只有模块被安装后才能触发。 */ static int __init a53_hello_init(void) //驱动模块被安装时触发的函数 { // 如果想把消息打印至前台,需要给printk输入等级如0 1 2 3。 如KERN_ERR为3. // 不赋予printk等级则 会将信息打印至后台。 //可使用 :dmesg -c 查看后台内. printk(KERN_ERR"hello world:%d\r\n",add(10,20)); return 0; //此函数返回0时驱动才能正常安装,返回其他值则安装失败 } /* __exit只有驱动被编译进内核时才有效。 作用:不将本函数进行链接,因为模块不可能被卸载,所以此函数无意义 */ static void __exit a53_hello_exit(void) //驱动模块被卸载时触发的函数 { printk(KERN_ERR"BYE BYE\r\n"); // 不使用KERN_ERR 会将信息打印至后台 } //声明驱动模块的入口、出口 module_init(a53_hello_init); module_exit(a53_hello_exit); MODULE_LICENSE("GPL"); //本驱动程序遵循GPL开源协议,必写 MODULE_AUTHOR("QJL ");//作者信息 MODULE_DESCRIPTION("This is hello world driver");//驱动功能的描述 MODULE_VERSION("v1.0");//驱动的版本

c.编写add.c文件。这个c文件不是模块文件,只是普通的c文件。

int add(int a,int b) { return a+b; }

d. 使用make生成hello.ko驱动文件。

e.将驱动文件传给开发板,进行安装。(传输方式见:(https://blog.csdn.net/qq_48361010/article/details/131304809?spm=1001.2014.3001.5501))。

Ⅱ、模块的安装与卸载

a.原程序目录文件 在这里插入图片描述

b.使用make编译后目录文件 在这里插入图片描述

c.将ko文件传给开发板

d.开发板安装模块

insmod main.ko

在这里插入图片描述

e.开发板卸载模块

rmmod main

在这里插入图片描述   

Ⅲ、附加: 参数传入(使用不多,一般用于调试)

使用参考:

int n; module_param(n, int, 0700); //0777为权限 char *p; module_param(p, charp, 0700); //0777为权限 static int __init a53_hello_init(void) //驱动模块被安装时触发的函数 { // 如果想把消息打印至前台,需要给printk输入等级如0 1 2 3。 如KERN_ERR为3. // 不赋予printk等级则 会将信息打印至后台。 //可使用 :dmesg -c 查看后台内. printk(KERN_ERR"hello world\r\n"); printk(KERN_ERR"n = %d\r\n", n); printk(KERN_ERR"p = %s\r\n", p); return 0; //此函数返回0时驱动才能正常安装,返回其他值则安装失败 }

执行安装模块命令时 输入参数,且要输入规范。变量名要一致!! 在这里插入图片描述



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有