Linux驱动开发笔记(三):基于ubuntu的helloworld驱动源码编写、makefile编写以及驱动编译加载流程测试

news2024/10/6 6:05:15

若该文为原创文章,转载请注明原文出处
本文章博客地址:https://hpzwl.blog.csdn.net/article/details/130542981

红胖子网络科技博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中…

Linux系统移植和驱动开发专栏

上一篇:《Linux驱动开发笔记(二):ubuntu系统从源码安装gcc7.3.0编译器》
下一篇:敬请期待…


前言

  前面学习了驱动的基础框架,上一篇编译了gcc7.3.0,那么为了方便很好的熟悉流程,本篇,将使用ubuntu18.04,直接编译ubuntu18.04的驱动,然后做好本篇文章的相关实战测试。


Ubuntu虚拟机准备

步骤一:安装虚拟机

  本次使用之前rk3568的ubuntu18.04,笔者没有重新弄了,安装虚拟机的过程请自行搜索查找完成。
  在这里插入图片描述

步骤二:获取内核版本号

  获取内核版本号是为了确认内核版本号一致。

sudo cat /proc/version

  在这里插入图片描述

步骤三:校准编译器版本

  前面获取了内核的编译器版本是gcc7.3.0,但是本机是gcc7.5,需要变更版本:
  在这里插入图片描述

步骤四:下载内核源码

sudo cat /proc/version
sudo apt-cache search linux-source
sudo apt-get install linux-source-4.15.0

  查看到本ubuntu的内核版本,然后下载对应的版本:
  在这里插入图片描述
  以上准备好的内核源码和编译器则可以开始编译内核。


内核编译

  注意1:ubuntu的/usr/src下有内核的头文件可编译直接使用。
  注意2:本标题章节所编译的内核然后使用该内核编译的驱动是不可兼容的。
  在这里插入图片描述

步骤一:下载解压

  在这里插入图片描述
  发现其实系统自带了header头文件。(PS:-header- 就是头文件,驱动和某些和内核功能关联的东西都要调用当前内核版本的对应头文件才能正确的编译出来而且可以使用。所以有些发行版就制作了专用的 header 包来让需要的程序调用。这种包只有 header 文件,没有其他无关开发的内容。

cd linux-source-4.18.0/
sudo tar xvf linux-source-4.18.0.tar.bz2

  在这里插入图片描述

步骤二:内核配置

cd linux-source-4.18.0
sudo make menuconfig

  在这里插入图片描述
  进入了配置:
  在这里插入图片描述
  不做任何配置变动,退出。

步骤三:直接编译

make -j8

  在这里插入图片描述
  半小时左右编译完成:
  在这里插入图片描述


驱动编译

  把驱动编译城模块,然后加载到内核里面。

步骤一:使用前面编写的驱动和makefile

  在这里插入图片描述

驱动代码文件

  在这里插入图片描述

#include <linux/init.h>
#include <linux/module.h>

static int hello_init(void)
{
    // 在内核里面无法使用基础c库printf,需要使用内核库printk
    printk(“Hello, I’m hongPangZi\n”);
    return 0;
}

static void hello_exit(void)
{
    printk(“bye-bye!!!\n”);
}

MODULE_LICENSE(“GPL”);

module_init(hello_init);
module_exit(hello_exit);

驱动makefile

  在这里插入图片描述
  这里make过不去,发现这里不能是空格,如下图,才可以:
  在这里插入图片描述

obj-m += helloworld.o

KDIR:=/usr/src/linux-source-4.18.0/linux-source-4.18.0

PWD?=$(shell pwd)

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

步骤二:编译make

make

  直接在驱动工程目录编译:
  在这里插入图片描述

  这里是makefile的m要大写,修改后可编译:
  在这里插入图片描述

  应该是windows拷贝 过来字符编码啥的变了(双引号),这里更正一下:
  在这里插入图片描述
  在这里插入图片描述
  然后再编译:
  在这里插入图片描述
  编译成功
  在这里插入图片描述

步骤三:加载卸载驱动测试

  将驱动拷贝到开发板或者目标系统,然后使用加载指令:

insmod helloworld.ko

  会打印入口加载的printk输出。
  在这里插入图片描述

  出现问题可能原因一是内核编译使用的编译器和模块使用的编译器版本不一致。
  这里我们核对过是一样的,所以此处暂时也不知道如何,如下图:
  在这里插入图片描述

  那么怀疑问题二:编译模块时选择的Linux头文件目录与当前运行的系统版本不匹配(可能是配置吧,明显大版本和子版本是一致的)
  所以这里我们重新配置一下makefile,直接引用linux-header如下:

  在这里插入图片描述
  编译通过:
  在这里插入图片描述

  继续加载、查看和卸载测试:
  在这里插入图片描述

  发现ubuntu中printk终端无打印的问题,是重定向问题,打入内核日志消息了,可以使用dmesg进行查看:

  在这里插入图片描述

  至此,会发现作为ubuntu来说,自带的/usr/src下的就是内核的头文件编译直接使用就可以了,无需编译内核,但是编译器还是需要的。
  本文章内核编译保留,因为编译内核是一个准备条件。


上一篇:《Linux驱动开发笔记(二):ubuntu系统从源码安装gcc7.3.0编译器》
下一篇:敬请期待…


若该文为原创文章,转载请注明原文出处
本文章博客地址:https://hpzwl.blog.csdn.net/article/details/130542981

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/516970.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

将远程服务器linux上的jupyter notebook映射到本地浏览器中

前提&#xff1a;mobaXterm可以连接远程服务器了 &#xff01;&#xff01;&#xff01;注意端口变化&#xff01;&#xff01;&#xff01; * 用从cmd中ssh -L 。。。去链接&#xff0c;报错perssion denied&#xff0c;所以还是选择mobaXterm方便。 1、mobaXterm的SSHTunnel配…

一般纳税人如何解决增值税、企业所得税高等问题?

业务是流程&#xff0c;财税是结果&#xff0c;税收问题千千万&#xff0c;关注《税算盘》来帮你找答案。 一般纳税人需要缴纳的增值税比小规模纳税人相比&#xff0c;需要缴纳更多。增值税作为我国第一大税种&#xff0c;能够筹划的空间并没有企业所得税那么多。 但是也是有…

软考A计划-真题-分类精讲汇总-第二章(操作系统)

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分享&am…

最近大火的ChatGpt,到底给我们带来了哪些改变?

我相信最近大家都有听说这个ChatGpt了吧&#xff01; 即使没有听说过也没有关系&#xff0c;我来给大家掰扯掰扯。 OpenAI公司推出了一款名为ChatGPT的人工智能聊天机器人&#xff0c;该技术通过利用大量训练数据&#xff0c;实现了人类般的自然语言处理能力&#xff0c;并能…

堆的实现,画图和代码分析建堆,堆排序,时间复杂度以及TOP-K问题

堆的实现 堆的概念及结构堆的实现初始化销毁返回堆顶元素判空有效数据个数堆的插入&#xff08;向上调整算法&#xff09;删除堆顶元素&#xff0c;仍然保持堆的形态&#xff08;向下调整算法&#xff09; 堆的创建向上调整法建堆向下调整建堆两种建堆方法时间复杂度向下调整法…

Go并发情况下debug调试无法进入所需调试goroutine,附带并发测试代码

大部分情况 问题&#xff1a; 在使用go语法的时候&#xff0c;由于并发情况&#xff0c;只能调试一个goroutine&#xff0c;但存在随机性&#xff0c;难指定 找到你所需的线程直接切换即可跳转。没有找到同时调试多个的办法&#xff0c;理论上是不行的&#xff0c;不然就不叫并…

美颜sdk的商业价值分析:如何利用美颜技术赢得市场?

当下&#xff0c;从自拍软件到直播平台&#xff0c;从手机相机到电商平台&#xff0c;美颜技术都有着广泛的应用。而美颜sdk作为美颜技术的重要组成部分&#xff0c;其商业价值也越来越受到关注。 一、美颜sdk有哪些商业价值&#xff1f; 随着美颜技术的不断发展&#xff0c…

历年系统架构师下午真题详解

请点击↑关注、收藏&#xff0c;本博客免费为你获取精彩知识分享&#xff01;有惊喜哟&#xff01;&#xff01; 试题一是必答题 阅读以下关于软件架构设计与评估的叙述&#xff0c;在答题纸上回答问题1和问题2。 【说明】 某电子商务公司拟升级其会员与促销管理系统&#…

LinkedList 的作者:我写了 LinkedList,但我自己都不用

Joshua Bloch&#xff1a;我写了 LinkedList&#xff0c;但我自己都不用&#xff01; 对&#xff0c;Joshua Bloch 就是 LinkedList 的作者&#xff01; 如果你真信了作者的话&#xff0c;那就真的大错特错了&#xff0c;LinkedList 虽然用的没有 ArrayList 多&#xff0c;但使…

FISCO BCOS(三十六)———Python Sdk window环境部署及应用开发

1、环境要求 Python环境:python 3.6.3, 3.7.3(最好是3.7.3,因为我是) FISCO BCOS节点:可以直接建链,可以是节点前置,也可以是一键部署2、安装python 2.1、python下载地址 https://www.python.org/downloads/release/python-373/2.2、环境变量配置 3、下载pip 3.1、pip下…

【企业信息化】第1集 世界排名第一的免费开源ERP: Odoo 16 CRM客户关系管理系统

文章目录 前言一、概览二、使用功能1.加快销售速度2.销售线索3.机会4.客户5.高效沟通6.报告7.集成 三、总结 前言 世界排名第一的免费开源ERP: Odoo 16 CRM客户关系管理系统。真正以客户为中心的CRM。 一、概览 获得准确预测 使用可操作数据&#xff0c;以做出更好的决定。 获…

BUUFCTF—[极客大挑战 2019]Upload 1

考点&#xff1a; 文件上传黑名单绕过内容绕过目录浏览 文件上传 1. 测试是黑名单还是白名单 上传图片1.png成功&#xff0c;上传1.php失败&#xff0c;1.pngs成功&#xff0c;说明是黑名单过滤。 所以要寻找黑名单外的php文件&#xff1a;php, php3, php5, php7, phtml都能…

Linux基础学习---4、文件权限类、搜索查找类、压缩和解压类

1、文件权限类 1.1 文件属性 Linux系统是一种典型的多用户系统&#xff0c;不同的系统处于不同的地位&#xff0c;拥有不同的权限。为了保护系统的安全性&#xff0c;Linux系统对不同的用户访问访问同一文件&#xff08;包括目录文件&#xff09;的权限做了不同的规定。在Lin…

港联证券|北交所行情活跃 近九成个股5月以来录得上涨

北交所A股昨日表现活跃&#xff0c;北证50指数上涨1.92%。数字人30cm涨停&#xff0c;云创数据涨18.38%&#xff0c;流金科技涨16.61%&#xff0c;广道数字、艾融软件、惠丰钻石等涨幅居前。 数字人昨日录得近16个月以来最大涨幅。近3个交易日&#xff0c;数字人累计获得融资净…

微服务架构下网关的技术选型

一、简介 当使用单体应用程序架构时&#xff0c;客户端&#xff08;Web 或移动端&#xff09;通过向后端应用程序发起一次 REST 调用来获取数据。负载均衡器将请求路由给 N 个相同的应用程序实例中的一个。然后应用程序会查询各种数据库表&#xff0c;并将响应返回给客户端。微…

ant-design实现树的穿梭框,穿梭后右侧是已选树(一)

主要内容: 基于ant-design树的穿梭框&#xff0c;实现穿梭后右侧是已选树&#xff0c;&#xff08;当前antd右侧只有一个层级&#xff09; 理想的树的穿梭框&#xff1a; 左边是完整的树&#xff0c;右边是已选的树&#xff0c;左边已选穿梭到右边左边已选的消失&#xff0c;右…

LeetCode-206. 反转链表

目录 双指针递归 题目来源 206. 反转链表 双指针 定义两个指针&#xff1a; pre 和 cur&#xff1b;pre 在前 cur 在后。 每次让 cur 的 next 指向 pre&#xff0c;实现一次局部反转 局部反转完成之后&#xff0c;pre 和 cur 同时往前移动一个位置 循环上述过程&#xff0c;直…

AWS S3 跨账号迁移

目录 **迁移架构&#xff1a;****具体实施&#xff1a;****1. 在目标账号创建策略&#xff08;S3MigrationPolicy&#xff09;和角色&#xff08;S3MigrationRole&#xff09;****2. 安装 aws cli&#xff0c;并配置$ aws configure&#xff0c;**[请参阅 AWS CLI 文档中的安装…

C++回调函数

回调函数 文章目录 回调函数一、函数指针二、回调函数应用Reference 一、函数指针 指针是一个变量&#xff0c;是用来指向内存地址。 一个程序运行时&#xff0c;所有和运行相关的东西都需要加载到内存当中&#xff0c;因此可以通过指针指向该内存。 函数是存放在内存代码区…

Otter CTF--Network(web网络1-3)

目录 一.题目 1.Birdmans Data 2.Look At Me 3.Otter Leak 一.题目 网址 OtterCTF 1.Birdmans Data 下载文件&#xff1a; .pcap文件 Wireshark打开&#xff1a; 既然是web 我们就从http分析&#xff1a; 追踪流 HTTP流&#xff1a; 发现两个密钥key&#xff1a; {"…