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

优点

  • 灵活配置

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

缺点

  • 配置相对复杂

  • 需要多种技术组合

复制代码
相关推荐
Charlie_lll1 小时前
学习Three.js–风车星系
前端·three.js
宇钶宇夕2 小时前
CoDeSys入门实战一起学习(二十八):(LD)三台电机顺起逆停程序详解—上升、下降沿使用上
单片机·嵌入式硬件·学习
科技林总2 小时前
【系统分析师】6.5 电子商务
学习
微尘hjx2 小时前
【Gstreamer 应用程序开发手册 01】关于GSTREAMER
linux·音视频·媒体
代码游侠2 小时前
C语言核心概念复习(一)
c语言·开发语言·c++·笔记·学习
qq_401700412 小时前
STM32晶振频率怎么选
stm32·单片机·嵌入式硬件
腾讯蓝鲸智云2 小时前
【运维自动化-节点管理】节点管理跟配置平台的联动关系
运维·服务器·经验分享·自动化·sass·paas
Fᴏʀ ʏ꯭ᴏ꯭ᴜ꯭.2 小时前
Nginx构建PC站点:root与alias详解
运维·chrome·nginx
玩电脑的辣条哥2 小时前
幽灵回复AI已回复但前端不显示的排查与修复
前端·人工智能