uboot
1. 什么是bootloader
Linux 系统的启动必须需要一个 bootloader 程序 , bootloader它作为系统启动过程钟运行的第一段代码,它的基本职责是为了操作系统的启动做好准备,可以把bootloader当作一本书的目录,指导系统如何找到操作系统章节 并开始阅读, 在电脑或者嵌入式设备钟, bootloader首先被执行,它初始化时钟,看门狗,SDRAM等外设,然后将linux内核从flash 钟拷贝到SDRAM钟,最后启动Linux内核
2. uboot 启动过程中做了那些事情
第一阶段:主要负责准备系统硬件以及软件环境,为操作系统的加载做准备,主要的任务包括初始化时钟,关闭看门狗,关闭中断,关闭MMU, 初始化SRAM,初始化flash。
第二阶段: 完成了硬件的初始化和基本配置后,uboot进入第二阶段,负责加载操作系统到内存,并设置内核参数参数,启动它
3. 为什么要传递参数给内核
在完成了之前的硬件初始化,可以说内核已经适应了开发板,然而内核并不是适配所有的开发板,此时它对于开发板还一无所知,需要传递一些必要的信息(开发板的ID , 内存的大小等)来告诉内核所处的环境
根文件系统
什么是根文件系统
首先根文件系统是一种文件系统,它不仅具备普通文件系统储存数据的功能,它还有其特殊性,** 它是linux系统启动后所挂载的第一个文件系统,内核代码的映像文件就保存在根文件系统中 ** 。引导启动程序**会在根文件系统挂载之后把一些初始化脚本(rcs,inittab服务)加载到内存中去运行,里面包含了linux系统所能够运行的必要吃程序,库等,比如给用户提供linux的控制界面的shell程序,动态连接程序运行时所需要的glibc库等。
根文件系统就像是linux系统的“家”,电脑启动时首先需要到“家”来获取所有必要的东西,比如程序, 文件,工具等,好让系统正常运行。系统**
如何构建根文件系统
- 明确目标系统的需求
在开始之前,需要明确系统的需求,包括硬件平台,预期功能,性能目标以及内存 , 存储空间等 - 选择基础系统:
根据需求分析的结果,选一个适合的基础系统或者发行版作为起点,对于嵌入式系统,通常会选择Buildroot、Yocto Project或者是直接基于一个最小化的Linux发行版。 - 配置内核
定制Linux内核,确保对目标硬件和所需功能的必要驱动和模块 - 构建文件系统
使用工具链编译 和 安装基本的工具和库。这可能包括标准的C库(如glibc或musl)、shell、核心工具集(如BusyBox),以及任何特定于应用的软件包。
安排文件系统层次结构,确保遵循标准的Linux文件系统结构,这对于系统的维护和扩展至关重要 - 优化和定制
根据需要定制和优化根文件系统。这包括移除不必要的软件包和模块、优化启动脚本和服务以加快启动时间,以及应用可能的安全加固措施。 - 测试和验证
在目标硬件或模拟器上测试构建的根文件系统,验证所有功能正常工作,性能符合预期,且没有安全漏洞 - 维护和更新
准备好对根文件系统进行必要的更新和维护策略,包括安全更新和功能升级
malloc , kmalloc 以及vmalloc 的区别
- malloc 是在用户空间使用, 分配的是进程虚拟空间的内存, 最终系统调用mmap与内核进行交互。分配的是连续的虚拟内存空间但物理内存不一定连续。
- kmalloc 使用场景是在内核空间, 分配的也是虚拟连续物理不一定连续的内存空间, 但是使用kmalloc的花销较大,因为要维护更复杂的页表映射,同时它也能分配很大的内存空间,如几十到几千字节或者更大
- vmalloc:使用场景是在内核空间, 分配的也是虚拟连续 物理也连续的内存空间。用与分配较小的内存空间,所以它的访问的速度比kmalloc快,因为不需要维护复杂的页表映射