Linux设备驱动与ARM开发笔记
一、ARM嵌入式硬件基础
1.1 存储设备分类
1.1.1 RAM(随机存取存储器)
特点:
-
访问速度快
-
容量相对较小
-
掉电后数据丢失
-
可线性访问(地址连续)
-
用于运行程序和临时数据存储
RAM分类:
-
SRAM(静态RAM)
-
不需要刷新电路
-
速度快、成本高、功耗低
-
用于CPU缓存
-
-
DRAM(动态RAM)
-
需要定期刷新
-
速度较慢、成本低、密度高
-
用于主内存
-
-
SDRAM(同步DRAM)
-
与系统时钟同步
-
提高了访问效率
-
-
DDR SDRAM(双倍数据速率)
-
DDR、DDR2、DDR3、DDR4、DDR5
-
每代提升速度和能效
-
1.1.2 ROM(只读存储器)
特点:
-
访问速度相对较慢
-
容量较大
-
掉电后数据不丢失
-
大部分不可线性访问
-
用于存储固件和系统程序
ROM分类:
-
PROM(可编程ROM)
-
用户可编程一次
-
通过熔丝或反熔丝技术
-
-
EPROM(可擦除可编程ROM)
-
紫外光擦除
-
可重复编程
-
需要专用擦除设备
-
-
EEPROM(电可擦除可编程ROM)
-
电信号擦除
-
按字节擦写
-
可重复编程
-
1.1.3 Flash Memory(闪存)
特点:
-
结合RAM和ROM的优点
-
访问速度快
-
掉电数据不丢失
-
可擦写,但寿命有限(擦写次数限制)
Flash分类:
-
NOR Flash
-
随机访问速度快
-
用于存储代码(XIP - eXecute In Place)
-
容量相对较小
-
成本较高
-
-
NAND Flash
-
顺序访问速度快
-
容量大,成本低
-
用于存储数据
-
需要坏块管理
-
-
eMMC(嵌入式多媒体卡)
-
集成Flash和控制器
-
简化硬件设计
-
标准化接口
-
-
SD卡
-
可移动存储
-
广泛兼容
-
用于数据交换和扩展存储
-
1.2 ARM处理器体系结构
1.2.1 i.MX6系列特性
i.MX6处理器特点:
-
ARM Cortex-A9架构
-
多核处理器(单核、双核、四核)
-
丰富的外设接口
-
强大的多媒体处理能力
-
低功耗设计
工作模式:
-
用户模式(User)
-
系统模式(System)
-
管理模式(Supervisor)
-
中止模式(Abort)
-
未定义模式(Undefined)
-
中断模式(IRQ)
-
快速中断模式(FIQ)
1.3 内存地址映射
1.3.1 i.MX6内存布局
物理地址空间布局:
0x0000_0000 - 0x000F_FFFF:内部ROM(96KB)
0x0090_0000 - 0x009F_FFFF:内部RAM(128KB)
0x1000_0000 - 0x1FFF_FFFF:外设寄存器
0x8000_0000 - 0xFFFF_FFFF:DDR SDRAM(最大2GB)
1.3.2 典型Linux内存映射
0x8000_0000:内存起始地址
0x8080_0000:Linux内核加载地址
0x8300_0000:设备树加载地址
0x8800_0000:根文件系统加载地址
二、Linux系统启动流程
2.1 Windows启动流程对比
2.1.1 Windows启动过程
BIOS → Windows引导程序 → Windows内核 → 桌面环境
2.1.2 Linux启动过程
Bootloader → Linux内核 → 根文件系统 → Init进程 → 用户空间
2.2 Linux启动三阶段详解
2.2.1 第一阶段:Bootloader(引导加载程序)
Bootloader定义:一个裸机程序,为Linux启动准备环境,引导Linux启动
Bootloader主要工作:
-
初始化CPU
-
设置工作模式
-
初始化异常向量表
-
-
初始化内存管理
-
初始化堆栈
-
关闭MMU(虚拟地址→物理地址)
-
关闭Cache
-
-
关闭不需要的功能
-
关中断
-
关看门狗
-
-
初始化硬件设备
-
初始化内存控制器
-
初始化串口(用于调试输出)
-
初始化网卡
-
-
加载内核
-
集成相关协议
-
搬移内核到内存
-
向内核传递参数
-
-
启动内核
-
PC指向内核入口地址
-
控制权移交给内核
-
从此Bootloader不再控制CPU
-
2.2.2 第二阶段:Linux内核
内核定义:一个复杂的程序(永不停息)
内核五大管理功能:
-
文件管理
-
进程管理
-
网络管理
-
内存管理
-
设备管理
内核启动过程:
-
初始化自身
-
初始化各个子系统
-
挂载根文件系统
-
启动Init进程
2.2.3 第三阶段:根文件系统
根文件系统定义:挂载的第一个文件系统
文件系统定义:按一定格式组织的一堆文件
根文件系统内容:
-
系统命令(ls、cp、mkdir等)
-
启动脚本
-
系统服务启动脚本
-
安装的应用程序启动脚本
-
-
配置文件
-
应用程序
-
系统工具
-
用户程序
-
-
普通文件
-
文本文件
-
多媒体文件(mp3、mp4等)
-
用户空间启动流程:
Init进程 → 系统服务 → Shell → 用户应用程序
三、ARM开发板网络配置
3.1 网络环境设置
3.1.1 IP地址配置
开发板IP:192.168.1.100
Ubuntu服务器IP:192.168.1.3
子网掩码:255.255.255.0
3.1.2 目录结构
开发板挂载点:/mnt
Ubuntu共享目录:/home/linux/nfs
3.2 NFS挂载配置
3.2.1 开发板端挂载命令
mount -o nolock,nfsvers=3 192.168.1.3:/home/linux/nfs /mnt
参数说明:
-
-o nolock:禁用文件锁,避免挂起 -
nfsvers=3:使用NFS版本3 -
192.168.1.3:Ubuntu服务器的IP地址 -
/home/linux/nfs:Ubuntu上配置的共享目录 -
/mnt:开发板上的挂载点
3.2.2 结果验证
-
在开发板的
/mnt目录下可以看到Ubuntu上/home/linux/nfs目录的内容 -
所有IP地址和目录都可以根据实际情况自定义
四、ARM应用程序开发模式
4.1 交叉编译环境
4.1.1 环境要求
-
开发主机:Ubuntu Linux
-
目标平台:ARM开发板(如i.MX6)
-
交叉编译工具链:arm-linux-gnueabihf-
4.1.2 开发流程
text
1. 在Ubuntu上编写源代码
2. 使用交叉编译器编译
3. 将可执行文件传输到开发板
4. 在开发板上运行和测试
5. 调试和优化
4.2 开发工具链
4.2.1 基本工具
-
编译器:arm-linux-gnueabihf-gcc
-
调试器:arm-linux-gnueabihf-gdb
-
二进制工具:arm-linux-gnueabihf-objdump、arm-linux-gnueabihf-readelf
4.2.2 文件传输方式
-
NFS共享:直接访问共享目录
-
TFTP传输:通过网络下载文件
-
SD卡复制:物理介质传输
-
串口传输:低速但可靠
4.3 调试技术
4.3.1 调试方法
-
串口打印:最基本的调试手段
-
GDB远程调试:源码级调试
-
内核日志:dmesg查看内核信息
-
网络调试:通过网络传输调试信息
4.3.2 性能分析
-
时间测量:获取函数执行时间
-
内存分析:检测内存泄漏
-
CPU利用率:分析程序性能瓶颈
五、存储设备对比表
| 设备类型 | 访问速度 | 容量 | 掉电保存 | 可写性 | 主要用途 | 成本 |
|---|---|---|---|---|---|---|
| SRAM | 最快 | 最小 | 否 | 是 | CPU缓存 | 最高 |
| DRAM | 快 | 大 | 否 | 是 | 主内存 | 低 |
| SDRAM | 较快 | 大 | 否 | 是 | 主内存 | 低 |
| NOR Flash | 较快 | 较小 | 是 | 有限 | 代码存储 | 较高 |
| NAND Flash | 快 | 最大 | 是 | 有限 | 数据存储 | 最低 |
| eMMC | 快 | 大 | 是 | 是 | 系统存储 | 中等 |
| SD卡 | 中等 | 大 | 是 | 是 | 扩展存储 | 低 |
六、系统启动方式对比
6.1 SD卡启动
适用场景:独立运行,不需要网络支持
优点:
-
部署简单
-
运行稳定
-
无需网络环境
缺点:
-
更新系统需要重新烧写SD卡
-
开发调试不够灵活
6.2 网络启动(NFS)
适用场景:开发调试阶段
优点:
-
开发调试方便
-
无需重复烧写
-
可快速部署和测试
缺点:
-
需要稳定的网络环境
-
启动速度相对较慢
-
依赖服务器运行
6.3 混合启动
适用场景:灵活部署需求
方案组合:
-
内核在SD卡,根文件系统在NFS
-
内核通过网络下载,根文件系统在SD卡
-
Bootloader在Flash,其他通过网络
优点:
-
灵活配置
-
兼顾稳定性和开发便利性
缺点:
-
配置相对复杂
-
需要多种技术组合