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

2024-03-01 05:30

本文主要是介绍三、Linux内核模块编写2(多个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.10all:
#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 .*.*.*.cmdclean:@make ARCH=arm64 CROSS_COMPILE=aarch64-linux- -C $(KDIR) M=$(PWD) modules clean@rm -rf *.ko	

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

#include <linux/module.h>
#include <linux/kernel.h>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 <1033275663@qq.com>");//作者信息
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时驱动才能正常安装,返回其他值则安装失败
}

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

这篇关于三、Linux内核模块编写2(多个c文件生成一个ko文件)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/761345

相关文章

Python自动化提取多个Word文档的文本

《Python自动化提取多个Word文档的文本》在日常工作和学习中,我们经常需要处理大量的Word文档,本文将深入探讨如何利用Python批量提取Word文档中的文本内容,帮助你解放生产力,感兴趣的小... 目录为什么需要批量提取Word文档文本批量提取Word文本的核心技术与工具安装 Spire.Doc

Linux内核定时器使用及说明

《Linux内核定时器使用及说明》文章详细介绍了Linux内核定时器的特性、核心数据结构、时间相关转换函数以及操作API,通过示例展示了如何编写和使用定时器,包括按键消抖的应用... 目录1.linux内核定时器特征2.Linux内核定时器核心数据结构3.Linux内核时间相关转换函数4.Linux内核定时

Linux镜像文件制作方式

《Linux镜像文件制作方式》本文介绍了Linux镜像文件制作的过程,包括确定磁盘空间布局、制作空白镜像文件、分区与格式化、复制引导分区和其他分区... 目录1.确定磁盘空间布局2.制作空白镜像文件3.分区与格式化1) 分区2) 格式化4.复制引导分区5.复制其它分区1) 挂载2) 复制bootfs分区3)

Java使用Spire.Barcode for Java实现条形码生成与识别

《Java使用Spire.BarcodeforJava实现条形码生成与识别》在现代商业和技术领域,条形码无处不在,本教程将引导您深入了解如何在您的Java项目中利用Spire.Barcodefor... 目录1. Spire.Barcode for Java 简介与环境配置2. 使用 Spire.Barco

C#实现将Excel工作表拆分为多个窗格

《C#实现将Excel工作表拆分为多个窗格》在日常工作中,我们经常需要处理包含大量数据的Excel文件,本文将深入探讨如何在C#中利用强大的Spire.XLSfor.NET自动化实现Excel工作表的... 目录为什么需要拆分 Excel 窗格借助 Spire.XLS for .NET 实现冻结窗格(Fro

SpringBoot集成iText快速生成PDF教程

《SpringBoot集成iText快速生成PDF教程》本文介绍了如何在SpringBoot项目中集成iText9.4.0生成PDF文档,包括新特性的介绍、环境准备、Service层实现、Contro... 目录SpringBoot集成iText 9.4.0生成PDF一、iText 9新特性与架构变革二、环

Linux服务器数据盘移除并重新挂载的全过程

《Linux服务器数据盘移除并重新挂载的全过程》:本文主要介绍在Linux服务器上移除并重新挂载数据盘的整个过程,分为三大步:卸载文件系统、分离磁盘和重新挂载,每一步都有详细的步骤和注意事项,确保... 目录引言第一步:卸载文件系统第二步:分离磁盘第三步:重新挂载引言在 linux 服务器上移除并重新挂p

idea-java序列化serialversionUID自动生成方式

《idea-java序列化serialversionUID自动生成方式》Java的Serializable接口用于实现对象的序列化和反序列化,通过将对象转换为字节流来存储或传输,实现Serializa... 目录简介实现序列化serialVersionUID配置使用总结简介Java.io.Seripyth

Linux下屏幕亮度的调节方式

《Linux下屏幕亮度的调节方式》文章介绍了Linux下屏幕亮度调节的几种方法,包括图形界面、手动调节(使用ACPI内核模块)和外接显示屏调节,以及自动调节软件(CaliseRedshift和Reds... 目录1 概述2 手动调节http://www.chinasem.cn2.1 手动屏幕调节2.2 外接显

Linux(centos7)虚拟机没有IP问题及解决方案

《Linux(centos7)虚拟机没有IP问题及解决方案》文章介绍了在CentOS7中配置虚拟机网络并使用Xshell连接虚拟机的步骤,首先,检查并配置网卡ens33的ONBOOT属性为yes,然后... 目录输入查看ZFhrxIP命令:ip addr查看,没有虚拟机IP修改ens33配置文件重启网络Xh