学习笔记——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,其他通过网络

优点:

  • 灵活配置

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

缺点:

  • 配置相对复杂

  • 需要多种技术组合

复制代码
相关推荐
灯澜忆梦5 分钟前
【Linux】#7 | vi/vim 编辑器
linux·编辑器·vim
Escalating_xu5 分钟前
【Linux 网络编程】UDP Socket 编程(上):从地址与字节序到完整回显服务器
linux·服务器·网络
凌云若寒6 分钟前
BarTender官网下载打印机驱动
运维·服务器·前端·网络·产品经理
遇印记8 分钟前
网络安全,数据链路层,物理层
运维·服务器·网络·windows·学习
system_error_x10 分钟前
自动化常规代码辅助系统
运维·自动化·log4j
重生之小比特10 分钟前
【Linux系统】08 进程切换
linux·运维·服务器
kyle~11 分钟前
Linux --- 内存管理内核子系统
linux·运维·服务器
讯捷蓝达16 分钟前
戴尔 R750XS服务器不开机, 主板 Pfault fail-safe 电压异常、CPU1 VCCIO PG 电压超出范围维修
运维·服务器
cc57250265317 分钟前
2027校招:大数据管理与应用转财务数字化,会计业务、SQL与BI学习路线
数据库·sql·学习
昌原的儿子LEO17 分钟前
嵌入式 Linux I2C 驱动开发核心知识总结:设备树与 platform 架构全解析
linux·驱动开发·架构