系列文章目录
嵌入式八股文(一)C语言篇
嵌入式八股文(二)Linux应用篇
嵌入式八股文(三)Linux驱动篇
嵌入式八股文(四)FreeRTOS篇
前言
在继续开始Linux驱动学习之前,本期继续带来linux篇的八股文学习,以为后续的学习打个基础。本系列会不定期持续更新(随笔者的学习进度),大家可以收藏一下时不时看一下。
一、Linux相关问题
1.1 Linux是什么操作系统
Linux 本质上是一个 分时操作系统,但它也支持构建分布式系统。分时操作系统的核心特点是允许多个用户/任务共享 CPU 和时间片资源,每个用户或进程看似“独占”系统。以下是常见操作系统的详细分类和解释:
类型 | 核心特点 |
---|---|
分时操作系统 | 多用户、多任务、时间片轮转调度 是(Linux 的核心设计) |
实时操作系统 | 严格保证任务在确定时间内完成(如工业控制、自动驾驶) |
分布式操作系统 | 多台机器透明协作,全局资源管理 |
批处理系统 | 按队列顺序执行任务,无交互性 |
1.2 初识u-boot
这部分我们学习笔记还没有更新到,这里仅仅简单列一下理论,后续学到这部分在详细讲一下。
1.2.1 bootloader
Linux启动时需要的一段小程序,负责初始化时钟、中断和其他外设等,然后将内核从flash中加载到SDRAM中,并启动内核,相当于PC机的BIOS。U-Boot(Universal Bootloader)是一个开源的引导加载程序,是Bootloader的一个具象化的表现。
1.2.2 为什么使用uboot启动内核
使用U-Boot启动内核的原因主要有以下几点:
- 初始化硬件:CPU不能直接从块设备(如SD卡、iNand、Nandflash等)中执行代码。在启动Linux内核之前,需要进行一系列的硬件初始化工作,如时钟、串口、DRAM等。U-Boot就是一个复杂的裸机程序,它负责这些初始化工作,为Linux内核的启动创造一个合适的环境。
- 加载内核:U-Boot会将Linux内核镜像从块设备中读取到内存中的特定位置(如链接地址处)。这个过程确保了内核代码在正确的内存地址处执行。
- 启动内核:在硬件初始化和内核加载完成后,U-Boot会执行一个特定的命令(如bootm命令)来启动Linux内核。这个命令告诉CPU从内存中的特定位置开始执行代码,从而启动Linux内核。
- 提供交互性:U-Boot还提供了一个交互式的命令行界面,允许用户进行配置、调试和维护操作。这使得在启动Linux内核之前或之后,用户可以对系统进行更精细的控制和调试。
- 支持多种平台和架构:U-Boot是一个开源的引导加载程序,支持多种处理器架构和嵌入式平台。这使得它成为嵌入式系统开发中广泛使用的工具之一。
1.2.3 u-boot的启动过程
U-Boot的启动过程可以分为两个阶段,每个阶段都有其特定的功能和任务。
- 第一阶段(汇编语言阶段):
- 设置异常向量表:当系统发生异常时,处理器会跳转到这些固定地址的向量表中进行处理。
- 硬件初始化:配置时钟相关参数,如内核时钟、总线时钟、IO接口时钟等。
- 准备RAM空间:使内存芯片可用,以便加载U-Boot第二阶段的代码。
- 复制U-Boot第二阶段的代码至RAM中。
- 定义入口
- 第二阶段:
- 初始化外设:包括串口、以太网接口、存储设备等。
- 检测内存映射:确定系统的内存布局和大小。
- 将内核从Flash或其他存储设备读取到RAM中。
- 为内核设置启动参数:这些参数包括内存大小、设备树地址等,用于内核启动时的初始化。
- 调用内核:将控制权交给内核,完成系统的启动过程。
1.2.4 u-boot和内核的数据传输
在完成相关设置(R1和R2)之后,uboot将机器ID通过R1发送给内核,并利用R2存放内存基地址。这里会产生标记的概念,他是一种数据结构是tag_header结构体和一个联合体组成。
1.3 运行地址、链接地址、加载地址
概念 | 定义 | 关键特点 |
---|---|---|
链接地址 | 程序在编译链接阶段确定的代码和数据的预期内存地址(由链接脚本指定) | 静态地址,写入二进制文件 |