一、flash存储器
lash存储器,全称为Flash EEPROM Memory,又名闪存,是一种长寿命的非易失性存储器。它能够在断电情况下保持所存储的数据信息,因此非常适合用于存储需要持久保存的数据。Flash存储器的数据删除不是以单个的字节为单位,而是以固定的区块为单位,区块大小一般为256KB到20MB。
在ARM系统中,Flash存储器主要分为两种类型:NOR Flash和NAND Flash。
- NOR Flash(可线性访问与内存访问方式相同):
- 特点:地址线和数据线分开,可以像内存一样进行随机访问。支持XIP(Execute In Place,片内执行),即代码可以直接在NOR Flash上执行,无需复制到内存中。
- 应用:由于其快速读取速度和数据不易失的特点,NOR Flash常被用作启动存储介质,存储操作系统的引导程序、内核映像等关键文件。
- NAND Flash(不可线性访问必须配个专门的程序访问):
- 特点:地址线和数据线共用,需要通过特定的命令和地址控制来读取数据。写入和擦除速度比NOR Flash快,但读取速度相对较慢。不支持XIP,需要通过软件控制读取时序。
- 应用:由于其高容量和低成本的特点,NAND Flash常被用作大容量数据存储介质,如存储设备中的文件系统和数据分区。
二、Linux操作系统启动
Linux启动是一个复杂但有序的过程,它涉及从系统加电到用户登录界面的多个步骤。以下是Linux启动过程的详细解析:
一、启动准备阶段
1. **固件初始化**:
- 在x86系统中,通常是通过BIOS(基本输入输出系统)或UEFI(统一可扩展固件接口)进行初始化。BIOS/UEFI负责硬件初始化、自检以及加载固件驱动程序等。
- 在ARM架构中,情况可能有所不同。ARM处理器通常不直接包含BIOS的概念,而是可能使用如OpenSBI(开源的RISC-V虚拟化二进制接口)或其他类似机制进行启动前的准备工作。
2. **启动设备选择**:
- BIOS/UEFI会检测并识别可启动的设备,如硬盘、光盘、USB设备等,并根据预设的启动顺序或用户设置的启动选项,选择一个可启动的设备作为启动介质。
二、加载引导程序(Boot Loader)
1. **Boot Loader的作用**:
- Boot Loader是引导加载程序,负责加载内核文件到内存中,并传递一些参数给内核。常见的 Boot Loader有GRUB(GRand Unified Bootloader)、LILO等。
- 在ARM架构中,u-boot是另一种常见的Boot Loader,它主要用于嵌入式系统。2. **加载过程**:
- 当BIOS/UEFI找到启动设备后,它会读取该设备上的主引导记录(MBR)或UEFI应用程序(如GRUB的.efi文件)。
- Boot Loader被加载到内存中并执行,它会进一步加载操作系统内核。
三、加载内核(kernel)
1. **内核的作用**:
- 内核是Linux系统的核心,负责管理系统资源、提供系统服务、驱动硬件设备等。
2. **加载过程**:
- Boot Loader将内核映像文件加载到内存中,并设置必要的参数。
- 内核被加载后,会进行解压缩、初始化各种模块和组件等操作。
1、引导程序bootloader----为内核启动准备环境
初始化CPU(工作模式)
初始化异常线性表
初始化栈
关看门狗
初始化内存
关闭Cache
关闭MMU
初始化相关的硬件(串口调试,网口)
集成相关的协议
搬移内核内核到内存
向内核传参(根文件系统类型/位置,控制台,init进程,IP(如果需要))
启动内核(PC向内核所在的内存地址)
————boot loader不再控制CPU,CPU的控制权彻底交给内核
2、内核(一个大的程序并未用户提供操作接口)
进程管理 内存管理 网络管理 文件管理 设备管理
内核最后的阶段时:加载根文件系统(以挂载的形式)
启动init进程-》shell-》userapp
3、加载根文件系统可执行程序(系统的命令,普通程序)
配置文件
库 (静态/动态)
普通文本(文本/MP3/jpg)
四、运行init进程
1. **init进程的作用**:
- init是Linux系统的第一个用户空间进程(通常称为1号进程),负责启动和管理其他进程。
2. **运行过程**:
- init进程会读取配置文件(如/etc/inittab、/etc/systemd/system等),确定运行级别(runlevel)并执行相应的初始化脚本。
- 不同的Linux发行版可能使用不同的init系统(如SysVinit、Upstart、Systemd等),但基本流程和目的相似。
五、启动服务
1. **服务的作用**:
- 服务是Linux系统提供的各种功能和应用,如网络、图形界面、数据库等。
2. **启动过程**:
- 根据运行级别的设置,init系统会启动相应的服务。这些服务通常由/etc/rc.d目录下的脚本来管理。
六、建立终端和用户登录
1. **建立终端**:
- 终端是Linux系统与用户交互的界面,可以是文本模式或图形模式。
- 终端由init系统或桌面环境根据配置来创建和管理。
2. **用户登录**:
- 用户登录是Linux系统验证用户身份和权限的过程。用户可以通过用户名和密码、公钥和私钥等方式进行登录。
- 登录后,用户可以执行各种命令和操作。
七、Linux运行级别
Linux系统有七个运行级别(从0到6),每个级别代表不同的系统状态和功能:
- **0**:系统停机状态,不能正常启动,只能关闭电源。
- **1**:单用户工作状态,只有root权限,用于系统维护和修复,禁止远程登录。
- **2**:多用户状态,没有网络文件系统(NFS)支持。
- **3**:完全的多用户状态,有NFS支持,适合服务器和命令行模式的用户。
- **4**:系统未使用,保留给用户自定义。
- **5**:图形用户界面(GUI)状态,有NFS支持,适合桌面和图形界面的用户。
- **6**:系统重启状态,不能正常启动,只能重新启动系统。
三、启动。
1、下载一个bootloader到norflash的0地址处()
查看和设置环境变量
删除后记得保存才能达到修改环境变量的效果。
U-Boot(Universal Boot Loader)是一种广泛使用的开源引导加载程序,它允许用户从各种设备(如硬盘、USB设备、网络等)加载操作系统。U-Boot提供了丰富的命令行接口(CLI),允许用户执行各种硬件级别的操作,比如配置硬件、加载和启动操作系统等。
下面是一些常用的U-Boot命令及其基本用途:
- printenv / setenv
printenv
:打印当前环境变量。setenv VAR value
:设置环境变量VAR的值为value。- bootm
- 用于从内存地址处直接启动内核,通常需要知道内核映像的内存地址。
- bootz
- 从内存地址处启动压缩的内核映像,需要指定内核映像、DTB(设备树)和内核解压后的存放地址。
- boot
- 根据环境变量中配置的启动命令来启动系统。
- tftpboot
- 通过TFTP协议从服务器下载文件到内存中。常用于从TFTP服务器加载内核映像或设备树。
- loadb / loads / loady / loadx
- 从串行端口、USB、以太网等不同接口加载数据到内存中。
- nfs
- 从NFS服务器加载文件。
- fatload / ext2load / ext4load
- 从FAT、ext2或ext4文件系统中加载文件到内存中。
- mm / nm / md
mm
:内存修改命令,允许修改内存中的值。nm
:内存显示命令,显示内存中的值(但不允许修改)。md
:内存显示命令,以十六进制格式显示内存内容。- cp
- 复制内存中的数据。
- ping
- 测试网络连接。
- reset
- 重启系统。
- saveenv
- 将当前的环境变量保存到非易失性存储器中(如EEPROM、闪存等)。
- version
- 显示U-Boot的版本信息。
- help
- 显示帮助信息,或指定命令后加
?
来获取该命令的详细帮助。
综上所示:
Uboot命令:
reset 重启uboot
setenv abc 123 设置环境变量
savenv 保存环境变量到nand
setenv abc 删除环境变量ping 目标 iP
tftp 030008000 ulmage
bootm 0x30008000(启动内核)
(go 0x30008000 运行程序)
下载tftpd到内核中
挂载
遇到这这种情况:
1、内核已经启动完毕,2、根目录有错误