UBoot
1、什么是 bootloader?
Linux 系统要启动就必须要一个 bootloader 程序,芯片上电后运行的程序。一般来说,这段程序会先初始化时钟、看门狗、中断、SDRAM 等外设,然后将 Linux 内核从 flash 拷贝到 SDRAM 中,最后启动 Linux 内核。
2、uboot 如何跳转至内核?
Uboot 启动后已经完成了基本的硬件初始化,其直接修改 PC 寄存器的值为 Linux 内核所在的地址,这样 CPU 就会从 Linux 内核所在的地址去取指令,从而执行内核代码。
3、Uboot 在跳转内核前一定要做哪些事?
①、cpu 寄存器的设置,R0 = 0, R1 = 机器类型 ID,R2 = 启动参数表及列表在 RAM 中起始基址。
②、必须禁止中断,设置 CPU 为 SVC 模式。
③、关闭 MMU、数据 cache。
4、如何给内核传递参数?
uboot 把及其 ID 通过 R1 传递给内核,R2 寄存器存放了内存的基地址,这块内存中存放了 uboot 给 Linux 内核的其他参数,有起始地址、内存大小、Linux 内核启动后挂载文件系统的方式等信息。
5、为什么 uboot 要关闭 caches?
caches 是 cpu 内部的一个二级缓存,其作用是将常用的数据和指令放在 CPU 内部。caches 是通过 CP15 管理的,刚上电的时候,cpu 还不能管理 caches。一定要关闭数据 cache,可能导致刚开始时候,RAM 的数据还没有复制到 cache,但是代码去取数据的时候从 cache 中取,发生错误。
文件系统
1、什么是根文件系统
根文件系统首先是一种文件系统,该系统不仅具有普通文件系统的存储数据文件的功能,还是内核启动时所挂载的第一个文件系统,内核代码的映像文件保存在根文件系统中,系统引导启动程序会在根文件系统挂在之后从中把一些初始化脚本和服务加载到内存中运行,里面包含 Linux 系统能够运行所必需的应用程序、库等。
2、根文件系统为什么重要
根文件系统包含系统启动时所必需的目录和关键性文件,以及使其他文件系统得以挂载所必要的文件。比如:
- init 进程的应用程序必须运行在根文件系统上
- 根文件系统提供了目录/
- linux 挂载分区时所依赖的信息存放于根文件系统 /etc/fstab 这个文件中
- shell 命令程序必须运行在根文件系统上
中断
1、什么是软中断和硬中断
硬中断是由赢家按产生的,比如像磁盘、网卡、键盘等。每个设备或设备集都有自己的 IRQ (中断请求)。基于 IRQ,CPU 可以将相应的请求分发到对应的硬件驱动上。硬中断可以直接中断 CPU。
软中断的处理和硬中断类似,它们是由当前正在运行的进程所产生的。通常,软中断是一些对 I/O 的请求,这些请求会调用内核中可以调度 I/O 发生的程序。对于某些设备,I/O 请求需要被立即处理,而磁盘 I/O 请求通常可以排队并稍后处理。软中断不会直接中断 CPU,也只有当前正在运行的代码才会产生软中断。
两者之间的区别如下:
- 软中断是执行中断指令产生的,硬中断由外设引发。
- 硬中断的中断号由中断控制器提供,软中断的中断号由指令直接给出。
- 硬中断可以屏蔽,软中断不可屏蔽。
- 硬中断处理程序需要确保快速完成任务,这样程序执行时才不会等待较长时间,称为上半部。
- 软中断处理中断未完成的工作,是一种推后执行的机制,属于下半部。
2、中断为什么要区分上半部和下半部
为了避免中断处理过程被新的中断打断,因此将终端一分为二,上半部登记新中断,快速处理简单的任务,剩余复杂耗时间的交给下半部处理。下半部处理过程中可以被中断,上半部处理过程中不可以被中断。
3、中断的下半部一般如何实现
软中断、tasklet、工作队列。
4、Linux 中断的响应执行流程是什么
中断的响应流程:cpu接受中断 -> 保存中断上下文并跳转到中断处理函数 -> 执行中断上半部 -> 执行中断下半部 -> 恢复中断上下文