linux设备驱动入门1

2023-11-12

一.如何让驱动程序运行起来

1.1 linux中驱动程序和应用程序的区别

linux系统中驱动程序运行在内核空间而应用程序运行在用户空间,他们之间有着很多的不同之处,应用程序是无后缀的,而驱动程序是带后缀".ko",比如hello.ko是驱动成员,而hello是应用程序。驱动程序通过命令 insmod 加载,通过命令 rmmod 卸载

1.2 如何在linux内核中运行我们的驱动程序

1.方法一
将驱动程序和linux内核"融为一体",即将驱动源码拷贝到内核源码中,并重新编译内核。
这个方法比较麻烦,因为每次修改驱动程序都需要重新编译整个内核源码树,并且驱动模块无法被卸载,驱动调试会带来很大的麻烦。
2.方法二
将驱动程序编译为可加载模块,然后使用 insmod 命令将驱动程序加载到内核中。
可加载模块的好处是可以手动加载和卸载,并且编译简单。不用重新内核镜像。加载驱动和运行应用程序一样的简单。

1.3 运行环境

1.开发板
任何开发板都可以,笔者采用是友善的nanopiM2,原因主要是便宜咸鱼价80块钱左右,还是多核的CPU,然后可以通过他的维基网站下载内核源码,uboot源码
2.编译器
这个编译器是交叉编译工具链,和应用程序一样的编译器即可。
3.内核源码
驱动程序即使不编译进内核,但编译驱动程序依然是需要内核源码,这是因为驱动编译的时候会去内核读取一些信息作为驱动程序的头部,当驱动加载的时候,内核会根据驱动程序的这些信息进行判断是否让驱动程序加载到内核之中。

最简单的驱动程序 hello.c :

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

static int hello_world_init(void)
{
	printk(KERN_EMERG "hello_world hi!\n");/*加KERN_EMERG 用于紧急权限打印*/
	return 0;
}
static void hello_world_exit(void)
{
	printk(KERN_EMERG "hello_world goobye!\n");
	
}

module_init(hello_world_init);/*insmod 调用的函数*/
module_exit(hello_world_exit);/*rmmod 调用的函数*/
MODULE_AUTHOR("Jaya Kumar");
MODULE_LICENSE("GPL");

Makefile:

#目标
obj-m:=hello.o

#内核源码目录,读者根据自己情况修改这个参数!
KDIR:=/root/linux-3.4.y/
#获取当前目录
PWD:=$(shell pwd)

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

clean:
        rm -rf *.o  *.ko 

这个Makefile 语法比较简洁,通过 -C 参数 ( K D I R ) 指 定 内 核 源 码 的 位 置 , 再 通 过 M = (KDIR) 指定 内核源码的位置,再通过 M= (KDIR)M=(PWD) 指定源文件hello.c的位置,通过 modules 指定编译目标为可加载模块。
在这里插入图片描述
将驱动程序hello.ko文件通过串口或者U盘再或者NFS方式传送到开发板中,然后用
insmod hello.ko 加载 观察打印信息,通过lsmod 可以查看当前所有加载中的可加载模块,最后通过rmmod hello.ko 卸载驱动程序。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

linux设备驱动入门1 的相关文章

  • Vagrant 遇到问题 - “404 - 未找到”

    我正在尝试使用 Vagrant 制作一个 LAMP 盒子 有人告诉我它使用起来非常简单 我对网络和虚拟机完全陌生 对 Linux Ubuntu 的经验也很少 我目前已尝试按照官方文档页面上的教程进行操作 http docs vagrantu
  • 使用 ioctl 在 C++ 中以编程方式添加路由

    我编写了简单的 C 函数 添加了新路线 void addRoute int fd socket PF INET SOCK DGRAM IPPROTO IP struct rtentry route memset route 0 sizeof
  • 使用 systemctl 获取 systemd 进程的正常运行时间或停机时间?

    喜欢使用systemctl is active
  • 如何从 Bash 命令行在后台 Vim 打开另一个文件?

    我正在从使用 Gvim 过渡到使用控制台 Vim 我在 Vim 中打开一个文件 然后暂停 Vim 在命令行上运行一些命令 然后想返回到 Vim Ctrl Z 在正常模式下 暂停 Vim 并返回到控制台 fg可用于将焦点返回到 Vim job
  • 链接错误:命令行中缺少 DSO

    我对 Linux 使用 Ubuntu 14 04 LTS 64 位 相当陌生 来自 Windows 并且正在尝试移植我现有的 CUDA 项目 当通过链接时 usr local cuda bin nvcc arch compute 30 co
  • 在 x86 汇编语言中获取文件大小的简单方法

    假设我已经在汇编中打开了一个文件 并且在寄存器 eax 中有该文件的文件句柄 我将如何获取文件的大小 以便为其分配足够的缓冲区空间 我在这里研究了另一个讨论 建议使用sys fstat 28 系统调用来获取文件统计信息但无法实现它 My a
  • 如何从 C++ 程序中重新启动 Linux?

    我有一个 Qt 4 GUI 我需要在下拉菜单中提供一个选项 允许用户选择重新启动计算机 我意识到这对于以其他方式重新启动计算机的能力来说似乎是多余的 但选择需要保留在那里 我尝试使用 system 来调用以下内容 suid root she
  • 为什么 fork 炸弹没有使 android 崩溃?

    这是最简单的叉子炸弹 我在许多 Linux 发行版上执行了它 但它们都崩溃了 但是当我在 android 终端中执行此操作时 即使授予后也没有效果超级用户权限 有什么解释为什么它没有使 Android 系统崩溃吗 一句话 ulimit Li
  • awk 在循环中使用时不打印任何内容[重复]

    这个问题在这里已经有答案了 我有一堆使用 file 1 a 1 txt 格式的文件 如下所示 A 1 B 2 C 3 D 4 并使用以下命令添加包含每个文件名称的新列 awk print FILENAME NF t 0 file 1 a 1
  • 在 docker 中重定向命令输出

    我想为我的服务器做一些简单的日志记录 它是一个在 Docker 容器中运行的小型 Flask 应用程序 这是 Dockerfile Dockerfile FROM dreen flask MAINTAINER dreen WORKDIR s
  • Tomcat Intellij Idea:远程部署

    RackSpace 云服务器 Ubuntu 12 04 Intellij Idea 11 1 2 Windows 8 Tomcat 7 0 26 JDK 6 在 Intellij Idea 上 当我尝试在远程 Tomcat 7 服务器上运行
  • ioctl 命令的用户权限检查

    我正在实现 char 驱动程序 Linux 并且我的驱动程序中有某些 IOCTL 命令仅需要由 ADMIN 执行 我的问题是如何在 ioctl 命令实现下检查用户权限并限制非特权用户访问 IOCTL 您可以使用bool capable in
  • 找不到包“gdk-pixbuf-2.0”

    我正在尝试在 Amazon Linux 发行版实例上构建 librsvg 我已经通过 yum 安装了大部分依赖项 其中一些在实例上启用的默认 yum 存储库中不可用 因此必须从头开始构建它们 我已经走了很远 但还停留在最后一点 跑步时sud
  • 有没有一种快速方法可以从 Jar/war 中删除文件,而无需提取 jar 并重新创建它?

    所以我需要从 jar war 文件中删除一个文件 我希望有类似 jar d myjar jar file I donot need txt 的内容 但现在我能看到从 Linux 命令行执行此操作的唯一方法 不使用 WinRAR Winzip
  • 适用于 Linux 的轻量级 IDE [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 在 C 中使用单个消息队列是否可以实现双向通信

    我希望服务器向客户端发送一些消息 并让客户端确认它 我被分配了这个任务 我可以在 C linux 中使用单个消息队列来完成它还是我需要创建两个 谢谢 是的 可以使用 sysV 消息队列来做到这一点 从您之前的问题来看 您正在使用该队列 您可
  • linux下无法创建僵尸进程

    嗯 我有一个奇怪的问题 我无法在我的项目中创建僵尸进程 但我可以在其他文件中创建僵尸进程 有简单的说明 int main if fork 0 printf Some instructions n else sleep 10 wait 0 r
  • 调用 printf 系统子例程在汇编代码中输出整数错误[重复]

    这个问题在这里已经有答案了 来回 在windows7控制台窗口中运行gcc s2 asm 然后生成一个exe文件 运行a exe 然后崩溃 为什么 s2 asm 代码由以下源代码生成 int m m 1 iprint m s2 asm请参考
  • Linux 上的静态 Qt5 构建:部署时如何处理字体?

    我使用这些配置选项创建了 Qt 5 2 0 库的静态版本 Ubuntu 12 04 开源 确认许可 force pkg config 发布 静止的 前缀 home juzzlin qt5 无icu opengl桌面 无油嘴滑舌 辅助功能 n
  • 执行“minikube start”命令时出现问题

    malik malik minikube start minikube v1 12 0 on Ubuntu 18 04 Using the docker driver based on existing profile Starting c

随机推荐

  • win10下电脑和开发板无法ping通解决

    首先确保电脑ip地址和开发板ip地址在同一网关下 如图我的电脑和开发板都在192 168 2 网关下 1 打开控制面板 2 选择查看方式为小目标 3 打开防火墙 选择高级设置 4 打开入站规则 选择文件和打印机共享 回显请求 ICMPv4
  • 汇客huikeCRM项目实战-熟能生巧

    任务目录 开胃菜一 统计分析 线索统计 线索转化率漏斗图 开胃菜二 首页 商机转化龙虎榜接口 开胃菜二 首页 线索转化龙虎榜接口 任务一 首页 待办数据统计接口 任务二 统计分析 客户统计 学科客户分布饼图 任务三 统计分析 线索统计 新增
  • elsearch 查询不设置size,默认只返回10条数据.....

    原文链接 http blog csdn net qq 18145031 article details 53489370 方法一 如果需要搜索分页 可以通过from size组合来进行 from表示从第几行开始 size表示查询多少条文档
  • MATLAB2022a/Simulink + STM32F407 Discovery Kit教程1

    0 前面的话 之前在B站上看到了STM32 MATLAB开发环境设置的视频 但是STM32MatTarget包已经被ST官方移除了 这种方法已经过时了 现在有新的方法来利用Matlab来开发STM32 这里来分享一下 主要是参考matlab
  • 什么是以太坊

    文章以及资料 开源 github地址 文章目录 定义 特点 第二层功能 以太币 智能合约 以太坊组件 p2p网络 共识规则 交易 状态机 数据结构 经济安全性 扩展阅读 定义 以太坊 英语 Ethereum 是一个开源的有智能合约功能的公共
  • 使用windows调用Linux远程桌面

    一 安装所需要的软件 yum install y xrdp yum install y vnc chkconfig xrdp on chkconfig vncserver on 二 修改配置 a添加用户 useradd herry b 设置
  • 前端Vue仿美团地址管理列表组件

    随着技术的发展 开发的复杂度也越来越高 传统开发方式将一个系统做成了整块应用 经常出现的情况就是一个小小的改动或者一个小功能的增加可能会引起整体逻辑的修改 造成牵一发而动全身 通过组件化开发 可以有效实现单独开发 单独维护 而且他们之间可以
  • Python画樱花树代码和小猪佩奇

    樱花树 效果图 import turtle as T import random import time 画樱花的躯干 60 t def Tree branch t time sleep 0 0005 if branch gt 3 if 8
  • C语言---合法标识符与整型

    目录 1 头文件 2 常量 变量 命名规范 合法的浮点数 小数与指数 char与八进制 3 sizeof 数据溢出 4 整型 5 面向过程 流程 入口 出口 注释 6 进制转换 首先我们来介绍一下 一开始学习c语言最先遇到的头文件是什么 头
  • [vue3 + element-plus] 表单中清除单个字段的校验效果

    清除全部校验效果 const resetForm formEl FormInstance undefined gt if formEl return formEl clearValidate 清除单个校验效果 const resetItem
  • html网页设计字体变色,网页制作怎么改变字体颜色

    大家好 我是时间财富网智能客服时间君 上述问题将由我为大家进行解答 网页制作改变字体颜色的方法是 1 首先打开hbuilder软件 新建一个html文件 里面写入3个p标签 再在style标签中设置p标签的基本样式 包括间距 字体大小等属性
  • redhat7 虚拟机 取消屏幕保护或自动休眠时间

    RedHat7系统每次不操作5 10分钟 就会自动锁屏 要重新出入密码 比较麻烦 取消屏保步骤 应用程序 系统工具 设置 power 空白屏幕选择 从不
  • linux下QTCreator无法出现代码提示框到问题解决

    问题 在QT 5中输入代码是不出现补全代码到提示框 例如输入 incl几个字母后提示框中出现 include补全提示 解决办法 在中文输入法下面的字母输入模式下输入代码时 qt无法实时识别字母 所以不出现补全提示框 将输入法切换到EN 英语
  • 无字母数字的命令执行(ctfshow web入门 55)

    这几天都没有怎么学习 基本上都是复习学科知识 因为我们要期末考试 刚刚好今天有时间来做了一道命令执行的题 再一次拜读了 p神的文章 受益匪浅 直接进入正题 源代码
  • java easypoi 多sheet导入与导出

    easypoi 多sheet导入与导出 文章目录 easypoi 多sheet导入与导出 一 easypoi 环境 二 多sheet导出 二 多sheet导入 一 easypoi 环境 1 pom依赖
  • Git下载安装及设置详细教程

    一 安装前准备 1 廖雪峰老师Git教程 推荐Git入门教程 2 按照自己的系统版本下载Git软件 我的操作系统 Windows7 64位 安装版本为Git 2 18 0 64 bit exe 截至2018 8 27最新版本 Git下载地址
  • 海外风控中这类征信数据与模型实践,实操落地效果最有效

    今天的文章我们跟大家详细介绍 海外现金贷征信数据的特征介绍与建模实践 希望今天的内容可以帮助各位童鞋了解海外现金贷的数据维度及其特征体系 并重点熟悉特征衍生的加工方法 在实际任务场景中加以实践应用 首先 我们需要明确征信数据与短信 APP等
  • gradle全下载

    http services gradle org distributions
  • pyautogui快捷键自动点击

    一个小玩意 本意是知云翻译完可以更方便地读出单词 Path是要识别的按钮的图片 import pyautogui import keyboard def Nonetype return None if name main Path D sp
  • linux设备驱动入门1

    一 如何让驱动程序运行起来 1 1 linux中驱动程序和应用程序的区别 linux系统中驱动程序运行在内核空间而应用程序运行在用户空间 他们之间有着很多的不同之处 应用程序是无后缀的 而驱动程序是带后缀 ko 比如hello ko是驱动成