学习笔记——Linux内核与嵌入式开发1

Linux设备驱动与ARM开发笔记

一、ARM嵌入式硬件基础

1.1 存储设备分类

1.1.1 RAM(随机存取存储器)

特点

  • 访问速度快

  • 容量相对较小

  • 掉电后数据丢失

  • 可线性访问(地址连续)

  • 用于运行程序和临时数据存储

RAM分类

  1. SRAM(静态RAM)

    • 不需要刷新电路

    • 速度快、成本高、功耗低

    • 用于CPU缓存

  2. DRAM(动态RAM)

    • 需要定期刷新

    • 速度较慢、成本低、密度高

    • 用于主内存

  3. SDRAM(同步DRAM)

    • 与系统时钟同步

    • 提高了访问效率

  4. DDR SDRAM(双倍数据速率)

    • DDR、DDR2、DDR3、DDR4、DDR5

    • 每代提升速度和能效

1.1.2 ROM(只读存储器)

特点

  • 访问速度相对较慢

  • 容量较大

  • 掉电后数据不丢失

  • 大部分不可线性访问

  • 用于存储固件和系统程序

ROM分类

  1. PROM(可编程ROM)

    • 用户可编程一次

    • 通过熔丝或反熔丝技术

  2. EPROM(可擦除可编程ROM)

    • 紫外光擦除

    • 可重复编程

    • 需要专用擦除设备

  3. EEPROM(电可擦除可编程ROM)

    • 电信号擦除

    • 按字节擦写

    • 可重复编程

1.1.3 Flash Memory(闪存)

特点

  • 结合RAM和ROM的优点

  • 访问速度快

  • 掉电数据不丢失

  • 可擦写,但寿命有限(擦写次数限制)

Flash分类

  1. NOR Flash

    • 随机访问速度快

    • 用于存储代码(XIP - eXecute In Place)

    • 容量相对较小

    • 成本较高

  2. NAND Flash

    • 顺序访问速度快

    • 容量大,成本低

    • 用于存储数据

    • 需要坏块管理

  3. eMMC(嵌入式多媒体卡)

    • 集成Flash和控制器

    • 简化硬件设计

    • 标准化接口

  4. SD卡

    • 可移动存储

    • 广泛兼容

    • 用于数据交换和扩展存储

1.2 ARM处理器体系结构

1.2.1 i.MX6系列特性

i.MX6处理器特点

  • ARM Cortex-A9架构

  • 多核处理器(单核、双核、四核)

  • 丰富的外设接口

  • 强大的多媒体处理能力

  • 低功耗设计

工作模式

  1. 用户模式(User)

  2. 系统模式(System)

  3. 管理模式(Supervisor)

  4. 中止模式(Abort)

  5. 未定义模式(Undefined)

  6. 中断模式(IRQ)

  7. 快速中断模式(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主要工作

  1. 初始化CPU

    • 设置工作模式

    • 初始化异常向量表

  2. 初始化内存管理

    • 初始化堆栈

    • 关闭MMU(虚拟地址→物理地址)

    • 关闭Cache

  3. 关闭不需要的功能

    • 关中断

    • 关看门狗

  4. 初始化硬件设备

    • 初始化内存控制器

    • 初始化串口(用于调试输出)

    • 初始化网卡

  5. 加载内核

    • 集成相关协议

    • 搬移内核到内存

    • 向内核传递参数

  6. 启动内核

    • PC指向内核入口地址

    • 控制权移交给内核

    • 从此Bootloader不再控制CPU

2.2.2 第二阶段:Linux内核

内核定义:一个复杂的程序(永不停息)

内核五大管理功能

  1. 文件管理

  2. 进程管理

  3. 网络管理

  4. 内存管理

  5. 设备管理

内核启动过程

  • 初始化自身

  • 初始化各个子系统

  • 挂载根文件系统

  • 启动Init进程

2.2.3 第三阶段:根文件系统

根文件系统定义:挂载的第一个文件系统

文件系统定义:按一定格式组织的一堆文件

根文件系统内容

  1. 系统命令(ls、cp、mkdir等)

  2. 启动脚本

    • 系统服务启动脚本

    • 安装的应用程序启动脚本

  3. 配置文件

  4. 应用程序

    • 系统工具

    • 用户程序

  5. 普通文件

    • 文本文件

    • 多媒体文件(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 文件传输方式
  1. NFS共享:直接访问共享目录

  2. TFTP传输:通过网络下载文件

  3. SD卡复制:物理介质传输

  4. 串口传输:低速但可靠

4.3 调试技术

4.3.1 调试方法
  1. 串口打印:最基本的调试手段

  2. GDB远程调试:源码级调试

  3. 内核日志:dmesg查看内核信息

  4. 网络调试:通过网络传输调试信息

4.3.2 性能分析
  1. 时间测量:获取函数执行时间

  2. 内存分析:检测内存泄漏

  3. CPU利用率:分析程序性能瓶颈

五、存储设备对比表

设备类型 访问速度 容量 掉电保存 可写性 主要用途 成本
SRAM 最快 最小 CPU缓存 最高
DRAM 主内存
SDRAM 较快 主内存
NOR Flash 较快 较小 有限 代码存储 较高
NAND Flash 最大 有限 数据存储 最低
eMMC 系统存储 中等
SD卡 中等 扩展存储

六、系统启动方式对比

6.1 SD卡启动

适用场景:独立运行,不需要网络支持

优点

  • 部署简单

  • 运行稳定

  • 无需网络环境

缺点

  • 更新系统需要重新烧写SD卡

  • 开发调试不够灵活

6.2 网络启动(NFS)

适用场景:开发调试阶段

优点

  • 开发调试方便

  • 无需重复烧写

  • 可快速部署和测试

缺点

  • 需要稳定的网络环境

  • 启动速度相对较慢

  • 依赖服务器运行

6.3 混合启动

适用场景:灵活部署需求

方案组合

  1. 内核在SD卡,根文件系统在NFS

  2. 内核通过网络下载,根文件系统在SD卡

  3. Bootloader在Flash,其他通过网络

优点

  • 灵活配置

  • 兼顾稳定性和开发便利性

缺点

  • 配置相对复杂

  • 需要多种技术组合

复制代码
相关推荐
yuki_uix几秒前
前端异步编程三板斧:从面试题到底层思维
前端·javascript
梓䈑几秒前
【CMake】CMake工程构建全流程 以及 相关命令行工具的介绍
linux·cmake
会联营的陆逊1 分钟前
Vite + Vue3 构建优化:CDN 外部化方案
前端·vue.js
毛骗导演2 分钟前
对话历史越来越长,OpenClaw 是怎么「压缩」掉的?——深读 Compaction 机制源码
前端·架构
广州华水科技3 分钟前
单北斗GNSS变形监测如何在大坝安全中发挥关键作用?
前端
成都极云科技3 分钟前
2026年服务器托管收费标准解析 性价比对比及边缘节点选型全指南
运维·服务器·github
外派叙利亚4 分钟前
uniapp 颜色卡条拖动
前端·javascript·uni-app
MichaelJohn4 分钟前
qiankun 微前端实战(二):主应用搭建 — 安装、注册与全局状态
前端
高梦轩4 分钟前
Nginx性能优化与监控
运维·nginx·性能优化
ruanCat6 分钟前
simple-git-hooks 踩坑实录:钩子装对了却从没触发过,原来是 .git 目录捣的鬼
前端·git·代码规范