Linux-----驱动
一、内核驱动与启动流程

1. Linux内核驱动
-
Nor Flash: 可线性访问,有专门的数据及地址总线(与内存访问方式相同)。
-
Nand Flash: 不可线性访问,访问需要控制逻辑(软件)。
2. Linux启动流程
-
ARM架构:
-
IRAM (4KB): 内部RAM,用于存储初始引导程序。
-
Nor Flash (2M): 存储u-boot程序。
-
内存 (64M): 用于加载内核和根文件系统。
-
Nand Flash (256M): 存储内核、根文件系统等数据。
-

-
-
启动过程:
-
Bootloader (u-boot):
-
初始化CPU、异常向量表、栈、时钟、内存等。
-
关闭看门狗、中断、Cache、MMU。
-
初始化相关硬件和软件协议。
-
将内核加载到内存。
-
向内核传递参数(根文件系统类型、位置、控制台等)。
-
启动内核。
-
-
内核 (kernel):
-
文件管理、内存管理、进程管理、网络管理、设备管理。
-
启动到最后阶段加载根文件系统。
-
init进程启动后台服务程序、加载配置、启动shell和应用程序。
-
-
根文件系统 (rootfs):
-
包含程序(应用、系统、命令)、配置文件、库文件、普通文件(txt、mp3)。
-
-
3. Windows与Linux对比
-
Windows: 使用BIOS启动。
-
Linux: 使用bootloader引导内核启动,内核加载rootfs。
4. 具体启动步骤
-
Nor Flash:
-
系统上电后,PC指向0地址,直接执行Nor Flash中的u-boot程序。
-
-
Nand Flash:
-
系统上电后,自动搬移u-boot前4KB程序到IRAM。
-
CPU执行IRAM中的代码,u-boot初始化内存并将剩余代码搬移到内存执行。
-
5. 内核与文件系统
-
内核 (uImage):
-
启动前u-boot向内核传递参数(
tag_list)。 -
Nand Flash: u-boot直接读取Nand Flash中的uImage并写入内存的0x30008000地址处,启动内核。
-
Ubuntu: 通过TFTP下载uImage到内存的0x30008000地址处,启动内核。
-
-
根文件系统 (rootfs):
-
Nand Flash: uImage启动到最后阶段时,直接挂载Nand Flash中的rootfs。
-
Ubuntu: uImage启动到最后阶段时,通过NFS挂载Ubuntu中的rootfs。
-
6. 前置步骤

-
向Nor Flash 0地址处烧写u-boot.bin。
-
拷贝uImage到Ubuntu的TFTP服务目录下。
-
将rootfs.tar.gz拷贝到Ubuntu的NFS服务目录下,并解压
sudo tar -xvf rootfs.tar.gz
7. U-Boot命令
-
环境变量管理:
-
printenv: 打印环境变量。 -
reset: 重启。 -
setenv serverip 192.168.1.3: 设置环境变量。 -
saveenv: 保存环境变量到Nand Flash。 -
setenv serverip: 删除环境变量。
-
-
下载与启动:
-
tftp 0x30008000 uImage: 通过TFTP协议下载uImage到内存的0x30008000地址处。 -
bootm 0x30008000: 启动内存0x30008000地址处的内核。 -
go 0x30008000: 运行内存0x30008000地址处的程序。
-
8. 设置启动参数
setenv bootargs console=ttySAC0,115200 root=/dev/nfs nfsroot=192.168.1.3:/home/linux/nfs/rootfs ip=192.168.1.123 init=/linuxrc
-
console: 控制台(终端)。
-
root: 根文件系统类型。
-
nfsroot: 根文件系统位置。
-
ip: 内核阶段使用的IP。
-
init: 指定init进程。
二、内核编译
1. 内核编译步骤
-
Kconfig: 定义
make menuconfig的配置选项。 -
make menuconfig: 内核配置。
-
.config: 配置文件,决定哪些文件被编译进内核。
-
CONFIG_SSL = n: 不启用SSL。 -
CONFIG_MM = y: 启用内存管理。
-
-
makefile: 条件编译,编译内核。
2. 内核镜像类型
-
Image: 可以直接使用的内核镜像。
-
zImage: 一段解压代码 + Image的压缩文件。
-
uImage: 64字节的头信息 + zImage。
3. 地址相关代码
-
地址相关代码: 链接地址和加载地址一致。
-
地址无关代码: 链接地址和加载地址无关。
4. 跳转指令
-
相对跳转、短跳转:
b fun -
绝对跳转、长跳转:
ldr pc, 0x00000000
5. 内核目录结构

6. 向内核新增文件
以向drivers/char下添加demo.c为例:
-
在
drivers/char目录下新建并编辑demo.c。 -
修改同层目录下的
makefileMakefile,添加:obj-$(CONFIG_DEMO) += demo.o -
修改同层目录下的
Kconfig,添加一个DEMO的配置。 -
执行
make menuconfig。 -
执行
make uImage。
7. 内核编译命令
-
配置内核
cp config_mini2440_t35 .config make menuconfig -
编译内核
make uImage
8. 内核镜像说明
-
Image: 可直接使用的内核镜像。
-
zImage: 压缩的内核镜像,包含解压代码。
-
uImage: 带有64字节头信息的压缩内核镜像。
9. Makefile和Kconfig
-
每层目录都有
Makefile和Kconfig文件,用于配置和编译内核。
10. 编译流程总结
-
配置内核: 使用
make menuconfig选择内核配置选项。 -
编译内核: 使用
make uImage生成内核镜像。 -
验证内核: 确保生成的内核镜像可以正常启动。
11. 注意事项
-
配置文件:
.config文件决定了哪些模块被编译进内核。 -
条件编译: 使用
obj-$(CONFIG_XXX)进行条件编译。 -
目录结构: 每层目录都有
Makefile和Kconfig文件,确保编译过程正确。
三、驱动程序
1. 设备文件与驱动模块
-
设备文件: 用户空间程序通过设备文件与驱动程序交互。
-
示例:
open("/dev/led");
-
-
驱动模块: 内核中的驱动程序负责控制硬件设备。
-
示例:
sys_open(led)调用驱动模块。
-
2. 设备驱动类型
-
字符设备驱动: 数据按顺序访问,90%以上的设备使用字符设备驱动。
-
块设备驱动: 可以随机访问,主要用于存储设备。
-
网络设备驱动: 网卡,集成复杂协议,通过套接字通信,没有设备号,靠名字维护。
3. 设备号
-
设备号: 用于标识设备。
-
主设备号 (高12位): 区分设备类型。
-
次设备号 (低20位): 区分同类的不同设备。
-
-
示例:
dev_t是32位设备号。
4. 创建设备节点
-
使用
mknod命令创建设备节点mknod /dev/demo3 c 255 0-
/dev/demo3: 设备节点名。 -
c: 字符设备。 -
255: 主设备号。 -
0: 次设备号。
-
5. 驱动模块结构
-
驱动模块: 包含
open、read、write、ioctl、close等函数。 -
示例:
drv_led、drv_key、drv_adc分别对应LED、按键、ADC设备。
6. 设备驱动流程
-
应用程序调用设备文件:
-
open("/dev/led");
-
-
内核调用驱动模块:
-
sys_open(led)→drv_led。
-
-
驱动模块控制硬件设备:
-
drv_led控制LED设备。
-
7. 设备号与驱动模块关系
-
每个设备号对应一个驱动模块。
-
内核通过设备号找到对应的驱动模块。
8. 设备号结构
+--------+--------+----+-------+
| 8 | 8 | 2 | 14 |
+--------+--------+----+-------+
设备类型 命令编号 数据 参数大小
魔幻数 流向
-
设备类型 (魔幻数): 8位,标识设备类型。
-
命令编号: 8位,标识具体命令。
-
数据流向: 2位,标识数据方向。
-
参数大小: 14位,标识参数大小。
9. 设备驱动总结
-
字符设备: 顺序访问,适用于大多数设备。
-
块设备: 随机访问,适用于存储设备。
-
网络设备: 复杂协议,通过套接字通信。
-
设备号: 区分设备类型和具体设备。
-
驱动模块: 内核中的程序,负责控制硬件设备。
10. 关键命令
-
创建设备节点:
mknod。 -
设备文件操作:
open、read、write、ioctl、close。
11. 注意事项
-
设备号分配: 确保主设备号和次设备号唯一。
-
驱动模块编写: 需要实现
open、read、write等函数。 -
设备文件操作: 应用程序通过设备文件与驱动模块交互。
相关文章:
Linux-----驱动
一、内核驱动与启动流程 1. Linux内核驱动 Nor Flash: 可线性访问,有专门的数据及地址总线(与内存访问方式相同)。 Nand Flash: 不可线性访问,访问需要控制逻辑(软件)。 2. Linux启动流程 ARM架构: IRAM…...
GHG认证是什么,GHG认证的意义?对企业发展好处
GHG认证(温室气体认证)详解 GHG认证(Greenhouse Gas Certification,温室气体认证)是指对组织、产品或项目的温室气体(GHG)排放量进行科学量化、报告,并由第三方机构进行独立核查和认…...
Docker 常用命令指南
Docker 提供了丰富的命令行工具来管理镜像、容器、网络和数据卷等资源。本指南按类别整理 Docker 的常用命令,并为每个命令提供简体中文说明和示例,以帮助您快速查询和掌握日常使用。 1. 镜像管理 Docker 镜像(Image)是打包好的应用程序及其依赖环境,可用于创建容器。常用…...
问问lua怎么写DeepSeek,,,,,
很坦白说,这十年,我几乎没办法从互联网找到这个这样的代码,互联网引擎找不到,我也没有很大的“追求”要传承,或者要宣传什么;直到DeepSeek的出现 兄弟,Deepseek现在已经比你更了解你楼下的超市…...
基于神经环路的神经调控可增强遗忘型轻度认知障碍患者的延迟回忆能力
简要总结 这篇文章提出了一种名为CcSi-MHAHGEL的框架,用于基于多站点、多图谱fMRI的功能连接网络(FCN)分析,以辅助自闭症谱系障碍(ASD)的识别。该框架通过多视图超边感知的超图嵌入学习方法,整合…...
C++学习之ORACLE③
1.集合运算符 查询部门号是10和20的员工信息: ?思考有几种方式解决该问题 ? SQL> select * from emp where deptno in(10, 20) SQL> select * from emp where deptno10 or deptno20 集合运算: Select * from emp …...
UniAD:自动驾驶的统一架构 - 创新与挑战并存
引言 自动驾驶技术正经历一场架构革命。传统上,自动驾驶系统采用模块化设计,将感知、预测和规划分离为独立组件。而上海人工智能实验室的OpenDriveLab团队提出的UniAD(Unified Autonomous Driving)则尝试将这些任务整合到一个统一…...
transformers 中的 input_ids 和 labels 是什么
transformers 中的 input_ids 和 labels 是什么 input_ids 是输入文本的数字化表示,而 labels 是模型训练的目标值 在自然语言处理(NLP)和使用 transformers 库进行模型训练时,tokenizer = AutoTokenizer.from_pretrained(model_path) 这行代码是用于从预训练模型路径加载…...
各种排序思路及实现
目录 1.排序概念常见的排序算法 2.常见排序算法实现(1)插入排序直接插入排序希尔排序(缩小增量排序) (2)选择排序直接选择排序堆排序 (3)交换排序冒泡排序快速排序(hoare…...
golang 采用use-go/onvif获取RTSP流
采用https://github.com/use-go/onvif得到完整的RTSP流的地址 全局变量UseGoMain 函数GetDeviceInformation 函数GetRTSPUri 函数 全局变量 这些变量用来设定 ONVIF 设备的连接信息,包含设备地址、用户名和密码 var deviceXaddr "*92.1*8.11*.12*:80" …...
虚幻基础:碰撞帧运算
能帮到你的话,就给个赞吧 😘 文章目录 碰撞碰撞盒线段检测 帧运算:每个程序流就是一帧的计算结果速度过快时(10000),导致每帧移动过大(83),从而导致碰撞盒错过而没有碰撞速度快的碰撞要用线段检测 碰撞 碰撞盒 线段检…...
【北京市小客车调控网站-注册/登录安全分析报告】
前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 暴力破解密码,造成用户信息泄露短信盗刷的安全问题,影响业务及导致用户投诉带来经济损失,尤其是后付费客户,风险巨大,造成亏损无底洞…...
西湖大学团队开源SaProt等多款蛋白质语言模型,覆盖结构功能预测/跨模态信息搜索/氨基酸序列设计等
2025 年 3 月 22—23 日,上海交通大学「AI 蛋白质设计峰会」正式举行。 本次峰会汇聚了来自清华大学、北京大学、复旦大学、浙江大学、厦门大学等知名高校的 300 多位专家学者,以及 200 余位行业领军企业代表和技术研发人员,深入探讨了 AI 在…...
算法--递归实现【DFS】
题目:指数型枚举 从 1∼n这 n 个整数中随机选取任意多个,输出所有可能的选择方案。 输入格式 输入一个整数 n。 输出格式 每行输出一种方案。 同一行内的数必须升序排列,相邻两个数用恰好 11 个空格隔开。 对于没有选任何数的方案,…...
一个批量文件Dos2Unix程序(Microsoft Store,开源)
这个程序可以把整个目录的文本文件改成UNIX格式,源码是用C#写的。 目录 一、从Microsoft Store安装 二、从github获取源码 三、功能介绍 3.1 运行 3.2 浏览 3.3 转换 3.4 转换(无列表) 3.5 取消 3.6 帮助 四、源码解读 五、讨论和…...
无法读取库伦值文件节点解决方案
读取库伦值的目的是为了换算成电流,量化场景功耗用途 1.报错日志 /power_log/debuglogger$ adb shell dmesg | grep -Ei "avc..system_server"[ 79.942272] logd.auditd: type1400 audit(1744279324.832:7149): avc: denied { read } for comm"…...
Linux系统学习Day2——在Linux系统中开发OpenCV
一、OpenCV简介 OpenCV(Open Source Computer Vision Library)是一个开源的跨平台计算机视觉和机器学习库,广泛应用于图像处理、视频分析、物体检测等领域。它提供了丰富的算法和高效的工具集,支持C、Python等多种语言,…...
【图像分类】【深度学习】图像分类评价指标
【图像分类】【深度学习】图像分类评价指标 文章目录 【图像分类】【深度学习】图像分类评价指标前言二分类评价指标Accuracy(准确率/精度)Precision(精确率/查准率)Recall(召回率/查全率)F1-ScoreAUC-ROC曲线(Area Under the Curv-Receiver Operating Characteristic Curve)二…...
一组可能的机器学习问题列表
线性回归与多项式拟合的关系最小二乘法在机器学习中的应用梯度下降是如何实现的贝叶斯分类器的应用场景高斯分布与判定在哪里用到模型的评估有哪些参数误差中的偏差和方差定义训练集分组的快捷方式如何度量模型性能查准率查全率的定义roc,aux的含义正则化是什么意思k均值用来解…...
context上下文(一)
创建一个基础的context 使用BackGround函数,BackGround函数原型如下: func Background() Context {return backgroundCtx{} } 作用:Background 函数用于创建一个空的 context.Context 对象。 context.Background() 函数用于获取一个空的 cont…...
蓝桥杯单片机刷题——按键控制距离显示精度
设计要求 驱动超声波传感器,启动距离测量功能,并将其结果显示到数码管上,距离数据单位为m。 按键“S4”定义为“切换”按键,通过此按键切换距离的显示精度(一位或两位小数)。切换顺序如图所示。 数码管显示格式如下图…...
el-time-picker标签的使用
需求: 实现培训日期,用户可以选择某一天的日期,这个比较简单 <el-form-item label"培训日期" prop"startTime"><el-date-picker clearablev-model"form.startTime"type"date"placeholder…...
云平台一键部署【OmniGen】多功能图像生成模型(2025更新版)
OmniGen 是智源推出的一款全新的扩散模型架构,专注于统一图像生成。它简化了图像生成的复杂流程,通过一个框架处理多种任务,例如文本生成图像、图像编辑和基于视觉条件的生成等。此外,OmniGen 通过统一学习结构实现了知识迁移&…...
C/C++ 知识点:解释型语言与编译型语言
文章目录 一、解释型语言与编译型语言1、概念2、主要区别3、示例对比 一、解释型语言与编译型语言 1、概念 解释型语言 代码逐行解释执行,无需提前编译。如:Python、JavaScript、Ruby。 编译型语言 代码先编译成机器码,再直接执行。如&…...
算法训练之动态规划(四)——简单多状态问题
♥♥♥~~~~~~欢迎光临知星小度博客空间~~~~~~♥♥♥ ♥♥♥零星地变得优秀~也能拼凑出星河~♥♥♥ ♥♥♥我们一起努力成为更好的自己~♥♥♥ ♥♥♥如果这一篇博客对你有帮助~别忘了点赞分享哦~♥♥♥ ♥♥♥如果有什么问题可以评论区留言或者私信我哦~♥♥♥ ✨✨✨✨✨✨ 个…...
uniapp离线打包提示未添加videoplayer模块
uniapp中使用到video标签,但是离线打包放到安卓工程中,运行到真机中时提示如下: 解决方案: 1、把media-release.aar、weex_videoplayer-release.aar放到工程的libs目录下; 文档:https://nativesupport.dcloud.net.cn/…...
5. 蓝桥公园
题目描述 小明喜欢观景,于是今天他来到了蓝桥公园。 已知公园有 N 个景点,景点和景点之间一共有 M 条道路。小明有 Q 个观景计划,每个计划包含一个起点 stst 和一个终点 eded,表示他想从 stst 去到 eded。但是小明的体力有限&am…...
机器人零位标定修正流程介绍
如果想看运动学标定可以看看 机器人运动学参数标定, 一次性把运动学参数和零位标定等一起标定求解. 1. 零位标定 零位标定是机器人运动学标定中的一个重要步骤,其目的是校正机器人关节的初始位置误差。以下是需要进行零位标定的主要原因: 制造误差 在机…...
大疆无人机系列知识
目录 知识 开发者文档 (上云) 无人机的应用 知识 大疆行业无人机接入音视频平台协议详解_大疆无人机 视频流-CSDN博客 开发者文档 (上云) 上云API 无人机的应用 【大疆无人机地图测绘技术学习:高精度、高效率的…...
深入 C++ 线程库:从创建到同步的探索之旅
目录 创建多线程 获取线程返回值 1.传指针 2.传引用 原子操作 互斥量 互斥量(Mutex)的基本概念 mutex类型介绍 锁的类型 互斥锁(Mutex) 自旋锁(Spin Lock) 读写锁(Read - Write Lo…...
