精选文章 Linux驱动开发(一)模块编译

Linux驱动开发(一)模块编译

作者:気絿 时间: 2021-02-05 09:56:39
気絿 2021-02-05 09:56:39
【摘要】linux设备驱动程序有两种加载方式。一种是直接编译进内核,系统启动的时候自动加载;另一种是编译成模块手动加载进内核。第一种直接编译进内核的方式的优点是不需要每次使用的时候进行加载,缺点是 需要在编译内核的时候一起编译进去,花费时间比较长,一般是驱动程序测试没什么问题之后才会编译进内核。第二中的优点是,可以随时加载和卸载,而且不需要和内核一起编译,可以单独编译,所以花费时间比较少,一般调试驱...

linux设备驱动程序有两种加载方式。一种是直接编译进内核,系统启动的时候自动加载;另一种是编译成模块手动加载进内核。第一种直接编译进内核的方式的优点是不需要每次使用的时候进行加载,缺点是 需要在编译内核的时候一起编译进去,花费时间比较长,一般是驱动程序测试没什么问题之后才会编译进内核。第二中的优点是,可以随时加载和卸载,而且不需要和内核一起编译,可以单独编译,所以花费时间比较少,一般调试驱动的时候用的是这种动态编译的方式。

1.编写可加载模块

hello.c

#include 
#include 
#include  static int helloworld_init(void)
{
	printk("helloworld_init.\n");
	return 0;
}

static void helloworld_exit(void)
{
	printk("helloworld_exit.\n");
}

module_init(helloworld_init);
module_exit(helloworld_exit);


MODULE_DESCRIPTION("simple module");
MODULE_LICENSE("GPL");

先在ubuntu做测试:

Makefile

obj-m := hello.o

KDIR := /lib/modules/`uname -r`/build

PWD := $(shell pwd)

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


clean:
	rm -rf *.o *.mod.* *.ko *.symvers *.order

编译后生成hello.ko模块

加载到ubuntu: insmod hello.ko

Linux驱动开发(一)模块编译1

由于ubuntu下的打印等级不一样,这里加载模块的时候并没有把printk的打印消息打印出来。

可以使用指令查看是否加载成功

lsmod | grep hello

Linux驱动开发(一)模块编译2

如上图,可以看出模块已经成功加载到系统中

卸载模块: rmmod hello.ko

Linux驱动开发(一)模块编译3

再次使用lsmod | grep hello查看的时候,会发现模块已经卸载了。

在ARM中加载:

Makefile

obj-m := hello.o

KDIR := /home/vinkim/OrangePiH6/kernel

PWD := $(shell pwd)

default:
	make ARCH=arm64 CROSS_COMPILE=/opt/toolchain/gcc-linaro-aarch/bin/aarch64-linux-gnu- -C $(KDIR) M=$(PWD) modules


clean:
	rm -rf *.o *.mod.* *.ko *.symvers *.order

需要将模块加载到arm中,需要修改KDIR为你的linux内核所在位置,并指定ARCH(芯片架构)和你的CROSS_CONPILE(交叉编译工具链)。编译后即可将生成的hello.ko拷贝到你的arm开发板上进行加载,加载和卸载指令参考上面。

勿删,copyright占位
您找到想要的结果了吗?
Linux驱动开发(一)模块编译
提交成功!非常感谢您的反馈,我们会继续努力做到更好
分享文章到微博
分享文章到朋友圈

上一篇:面试题———随即发生器概率(2)

下一篇:搭建 Redis 主从+哨兵集群

您可能感兴趣

  • 什么是敏捷开发?

     【IT专家网独家】最近一段时间以来,很多人开始谈论敏捷开发、研究敏捷开发,那么究竟什么才是敏捷开发呢?   简单的说,敏捷开发是一种以人为核心、迭代、循序渐进的开发方法。在敏捷开发中,软件项目的构建被切分成多个子项目,各个子项目的成果都经过测试,具备集成和可运行的特征。换言之,就是把一个大项目分为多个相互联系,但也可独立运行的小项目,并分别完成,...

  • linux上安装maven

    一 下载 官网地址: http://maven.apache.org/download.cgi 下载:apache-maven-3.5.4-bin.tar.gz 到/opt中 二 解压 [root@master opt]# tar zxvf apache-maven-3.5.4-bin.tar.gz 三 安装 ...

  • SSM框架+RESTful开发

    什么是RESTful?         RESTful架构,就是目前最流行的一种互联网软件架构。它结构清晰、符合标准、易于理解、扩展方便,所以正得到越来越多网站的采用。RESTful(即Represen...

  • 【预告】我主讲的MSDN Webcast之二:公共语言运行库(CLR)开发系列课程(2):Pinvoke 进阶(Level 300)...

    下面是我主讲的MSDN Webcast:公共语言运行库(CLR)开发系列课程的第二讲P/Invoke进阶的链接,有兴趣的朋友可以在这里登记一下: http://msevents.microsoft.com/CUI/WebCastEventDetails.aspx?EventID=1032387495&EventCategory=4&culture=...

  • 自制chatroom_构建由Node.js驱动的Chatroom Web App:入门

    自制chatroom 本文是Microsoft的Web开发技术系列的一部分。 感谢您支持使SitePoint成为可能的合作伙伴。 这个Node.js教程系列将帮助您构建完全部署在云中的由Node.js驱动的实时聊天室Web应用程序。 在本系列中,您将学习如何在Windows计算机上设置Node.js (如果在Mac上则仅学习概念),如...

  • Linux 基本命令及用法

    Linux 简单命令 1、命令:touch [文件](创建文件) 2、命令:mkdir -p 目标文件递归创建文件夹(如:mkdir -p /usr/local/d1/d2/d3) 3、命令:rm [文件](删除);                 rm -r [文件]删除目录;                 rm -f [文件]删除文件...

  • 使用信元流(TLVStream)规范、简化模块(C/C++)间交互

      问题描述:   在软件开发过程中,一般会对复杂的现实世界进行抽象,并且采用分而治之的策略,将大系统分解为子系统,将子系统分解为一个个的模块。模块间的通信一般采用函数调用的方式,这样会产生一些问题: 1. 模块间的接口增多会导致模块间紧密耦合,不利于模块的重用、调试、维护。 2. 接口函数参数会很复杂,容易出现很庞大,功能面面俱到的结构体。 3....

  • async模块

    async是一个异步处理模块,主要有三个方式: 串行无关联   async.series()并行无关联  async.parallel()串行有关联  async.waterfall() 他们的基本用法,建一个a的文件夹,在它下面打开命令窗口,npm init 创建package.json文件,之后安装依赖,npm i async -D 写一个异...

CSDN

CSDN

中国开发者社区CSDN (Chinese Software Developer Network) 创立于1999年,致力为中国开发者提供知识传播、在线学习、职业发展等全生命周期服务。
Linux驱动开发(一)模块编译介绍:华为云为您免费提供Linux驱动开发(一)模块编译在博客、论坛、帮助中心等栏目的相关文章,同时还可以通过 站内搜索 查询更多Linux驱动开发(一)模块编译的相关内容。| 移动地址: Linux驱动开发(一)模块编译 | 写博客