Linux驱动1:入口与出口、头文件路径、makefile编译

这篇具有很好参考价值的文章主要介绍了Linux驱动1:入口与出口、头文件路径、makefile编译。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

Linux 驱动两种运行方式

字符设备驱动框架

1、创建目录和编写文件

2、添加头文件路径

3、Makefile编写和解释

4、编译测试


Linux 驱动两种运行方式

第一种就是将驱动编译进 Linux 内核中,这样当 Linux 内核启动的时候就会自动运行驱动程序;

第二种就是将驱动编译成模块(Linux 下模块扩展名为.ko),在Linux 内核启动以后使用“insmod”命令加载驱动模块。

在调试驱动的时候一般都选择将其编译为模块,这样修改驱动以后只需要编译一下驱动代码即可,不需要编译整个 Linux 代码,而且在调试的时候只需要加载或者卸载驱动模块即可,不需要重启整个系统。

将驱动编译为模块最大的好处就是方便开发,当驱动开发完成,确定没有问题以后就可以将驱动编译进Linux 内核中,当然也可以不编译进 Linux 内核中,具体看自己的需求。

模块有加载和卸载两种操作,在编写驱动的时候需要注册这两种操作函数,模块的加载和卸载注册函数,如下

module_init(xxx_init);
module_exit(xxx_exit);
//注册模块加载函数
//注册模块卸载函数

module_init 函数用来向 Linux 内核注册一个模块加载函数,参数 xxx_init 就是需要注册的具体函数,当使用“insmod”命令加载驱动的时候, xxx_init 这个函数就会被调用。 module_exit()函数用来向 Linux 内核注册一个模块卸载函数,参数 xxx_exit 就是需要注册的具体函数,当使用“rmmod”命令卸载具体驱动的时候 xxx_exit 函数就会被调用。

下面开始创建字符设备驱动框架

字符设备驱动框架

1、创建目录和编写文件

在IMX6ULL/Linux_Drivers创建目录1_chrdevbase

makefile中添加头文件,# IMX6ULL驱动,linux,arm开发,arm,ubuntu,驱动开发
在vscode打开目录并并创建chrdevbase.c文件,在chrdevbase.c文件输入下面的代码

#include <linux/module.h>

static int __int chrdevbase_init(void)
{
    return 0;
}

static void __exit chrdevbase_exit(void)
{
    
}

module_init(chrdevbase_init);
module_exit(chrdevbase_exit);

makefile中添加头文件,# IMX6ULL驱动,linux,arm开发,arm,ubuntu,驱动开发

第 4 行,定义了个名为chrdevbase_init 的驱动入口函数,并且使用了“__init”来修饰
第 11 行,定义了个名为chrdevbase_exit 的驱动出口函数,并且使用了“__exit”来修饰
第 17 行,调用函数 module_init 来声明chrdevbase_init 为驱动入口函数

                当加载驱动的时候 chrdevbase_init函数就会被调用
第18行,调用函数module_exit来声明chrdevbase_exit为驱动出口函数

                当卸载驱动的时候chrdevbase_exit函数就会被调用

2、添加头文件路径

这里需要给vscode头文件添加路径,因为是编写 Linux 驱动,因此会用到 移植在开发板上面的Linux 源码中的函数。需要在 VSCode 中添加 Linux源码中的头文件路径。打开 VSCode,按下“Crtl+Shift+P”打开 VSCode 的控制台,然后输入“C/C++: Edit configurations(JSON) ”,打开 C/C++编辑配置文件,如下图 所示
makefile中添加头文件,# IMX6ULL驱动,linux,arm开发,arm,ubuntu,驱动开发

 打开如下图

makefile中添加头文件,# IMX6ULL驱动,linux,arm开发,arm,ubuntu,驱动开发

需要将 Linux 源码里面的头文件路径添加进来,也就是移植的 Linux 源码中的头文件路径,分别是开发板所使用的 Linux 源码下的 include、arch/arm/include 和 arch/arm/include/generated 这三个目录的路径,注意这里使用绝对路径

makefile中添加头文件,# IMX6ULL驱动,linux,arm开发,arm,ubuntu,驱动开发

添加头文件路径(7-8-9行)以后的 c_cpp_properties.json的文件内容如下所示:

 "${workspaceFolder}/**",
                "/home/ubantu22/my_linux/linux-imx-rel_imx_4.1.15_2.1.0_ga_my/include",
                "/home/ubantu22/my_linux/linux-imx-rel_imx_4.1.15_2.1.0_ga_my/arch/arm/include",
                "/home/ubantu22/my_linux/linux-imx-rel_imx_4.1.15_2.1.0_ga_my/arch/arm/include/generated/"

makefile中添加头文件,# IMX6ULL驱动,linux,arm开发,arm,ubuntu,驱动开发

3、Makefile编写和解释

设置好路径之后需要编译测试,也就是将chrdevbase.c 这个文件编译为.ko 模块
创建Makefile,代码如下:

KERNELDIR := /home/ubantu22/my_linux/linux-imx-rel_imx_4.1.15_2.1.0_ga_my

CURRENT_PATH := $(shell pwd)

obj-m := chrdevbase.o

build : kernel_modules

kernel_modules:
    $(MAKE) -C $(KERNELDIR) M=$(CURRENT_PATH) modules

clean:
    $(MAKE) -C $(KERNELDIR) M=$(CURRENT_PATH) clean

makefile中添加头文件,# IMX6ULL驱动,linux,arm开发,arm,ubuntu,驱动开发 第 1 行, KERNELDIR 表示开发板所用的 Linux 内核源码目录,使用绝对路径

                根据自己的实际情况填写

第 3 行, CURRENT_PATH 表示当前路径,直接通过运行“pwd”命令来获取当前所处路径

第 5 行, obj-m 表示chrdevbase.c 这个文件编译为 chrdevbase.ko 外部可加载模块

                chrdevbase.c会先编译成chrdevbase.o文件,再编译成chrdevbase.ko文件

第 7 行,表示要编译构建的是模块

第 9 行,编译构建模块目标

第 10 行,编译构建模块目标的具体编译命令

                $(MAKE),表示"make"命令,输入make就执行

                -C 表示将当前的工作目录切换到指定目录中,就是 KERNERLDIR 目录,即第1行目录

                M 表示模块源码目录,这是CURRENT_PATH,即编译到第3行目录

                以后程序会自动到指定的CURRENT_PATH目录中读取模块的源码并将其编译为.ko 文件

                “ modules ”与前面的“make”搭配,使用"make"命令即表示编译成模块

第 12 行,清理目标

第 13 行,清理目标的具体命令,清理工作目录和指定的目录,命令为"make clean"

这里的makfile不用指定编译器,因已进入到linux内核中, 移植linux的时候中已指定好编译器

4、编译测试

输入 “ make ”命令开始编译 

makefile中添加头文件,# IMX6ULL驱动,linux,arm开发,arm,ubuntu,驱动开发 编译完成之后,查看可以看到有“.ko”文件,并测试清理命令“ make clean”并重新查看一下

makefile中添加头文件,# IMX6ULL驱动,linux,arm开发,arm,ubuntu,驱动开发

 可以看到编译出来的也被删除了,测试一下用16核编译,命令“ make -j16”

makefile中添加头文件,# IMX6ULL驱动,linux,arm开发,arm,ubuntu,驱动开发

 测试到此,说明框架是可以成功编译的文章来源地址https://www.toymoban.com/news/detail-692622.html

到了这里,关于Linux驱动1:入口与出口、头文件路径、makefile编译的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • cpp文件编译过程 makefile cmake

    直接 gcc 没有-o 的话出来的输出exe文件没有调试信息,相比-o的大小会小一点,只有包含了调试信息文件才可以执行 头文件在编译器的include目录中,编译时 -I 指定库 函数库默认路径在编译器的lib目录中,编译时 -L指定目录,-l 小写L 指定库 函数或者是在别的c与cpp文件中 静态

    2024年02月08日
    浏览(37)
  • MDK Keil查看map文件及编译占用内存信息、函数入口地址

    一、在哪里打开map文件查看 (1)第一种,在keil软件下,双击你的工程名,map就会弹出 (2)第二种,点击魔术棒,查看 Lis文件输出的位置入口 我的在output...文件下,那我们工程的文件夹下,找到output 二、查看map文件信息 (1)函数定义的位置信息 如图,这些你定义函数的

    2024年02月05日
    浏览(44)
  • makefile 编译动态链接库使用(.so库文件)

    动态链接库:不会把代码编译到二进制文件中,而是在运行时才去加载, 好处是程序可以和库文件分离,可以分别发版,然后库文件可以被多处共享 动态链接库 动态:动态加载 链接:二进制文件和库文件分离。 库 库文件 .so 新建一个文件TestSo 编译一下 main.cpp 写好之后我们

    2024年01月23日
    浏览(42)
  • 嵌入式Linux驱动开发系列六:Makefile

    Makefile是什么? gcc hello.c -o hello gcc aa.c bb.c cc.c dd.c ... make工具和Makefile make和Makefile是什么关系? make工具:找出修改过的文件,根据依赖关系,找出受影响的相关文件,最后按照规则单独编译这些文件。 Makefile文件:记录依赖关系和编译规则。 必须要学精Makefile吗? 怎么学习Makefi

    2024年02月13日
    浏览(56)
  • Makefile——Linux下C/C++编译方法

    linux下常见的C语言项目相关的文件如下图所示。 通常使用GCC来编译C文件。编译过程为 源文件.c文件 - 预编译成.i文件 - 编译成汇编语言.s - 汇编成.o文件 - 链接成可执行文件 。编译命令为gcc -参数 .c -o 输出文件名称 预处理:将头文件拷贝进.c文件内容中,执行预编译命令。采

    2024年02月03日
    浏览(34)
  • linux | vscode | makefile | c++编译和调试

    简单介绍环境: vscode 、centos、 gcc、g++、makefile 简单来说就是,写好项目然后再自己写makefile脚本实现编译。所以看这篇博客的用户需要了解gcc编译的一些常用命令以及makefile语法。在网上看了很多教程,以及官网也看了很多次,最后自己一点多一点摸索,有的些许收获。 首

    2024年02月15日
    浏览(33)
  • 【嵌入式Linux】编译应用和ko内核模块Makefile使用记录

    在Makefile中,变量的赋值可以使用以下几种方式: = :最基本的赋值符号,表示简单的延迟展开(lazy expansion)方式。变量的值将会在使用变量的时候进行展开。 := :立即展开(immediate expansion)的赋值方式。变量的值在赋值的时候立即展开,并且在后续的使用中不再改变。

    2024年02月08日
    浏览(50)
  • 【Linux】编译器gcc | make | Makefile | 模拟进度条 | gitee

    目录 1. 编译器 gcc 1.1 背景知识 1.2 gcc如何完成 2.1 Makefile背景 2.2 Makefile原理 2.3 Makefile常用符号 3. 模拟倒计时 4. 模拟进度条 5. 使用 git 命令行 5.1 安装 git 5.2 创建项目下载到本地 5.3 推送本地代码到远端仓库 1. 编译器 gcc 1.1 背景知识 预处理(进行宏替换) 编译(生成汇编) 汇编

    2024年03月12日
    浏览(60)
  • Linux下gcc编译,动态库和静态库,makefile,gdb调试

    展开头文件, 宏替换(变量宏、函数宏)、替换空格等 逐行检查程序中出现的语法错误,简单的逻辑错误 将 .s 汇编文件中所有的汇编指令翻译成二进制机器码(下面就是来了个截图,二进制显示了乱码) 将 .o 的目标文件,链接库文件、数据段合并,地址回填(把汇编里相

    2024年02月08日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包