内核
内核是一个操作系统的核心,负责管理系统的进程、内存、设备驱动程序、文件系统和网络系统,是一个驻留在内存中的软件。
Linux内核将应用层的请求传递给硬件,并充当底层驱动程序,对系统中的各种设备和组件进行寻址,内核是应用程序所知道的层次中的最底层。
内核是整个操作系统的最底层,负责着整个硬件的驱动,以及提供各种系统所需要的功能。Linux内核中有大量代码都在设备驱动程序中,它们以一种特定的模式管理底层硬件设备并以统一的接口向上层进程提供底层硬件的使用,设备驱动程序是内核和硬件之间的接口。
系统调用层为用户空间提供了一套标准的系统调用函数来访问 Linux 内核,系统调用对应用程序来说就像调用普通函数一样,系统调用是内核和应用程序之间的接口。
![img](https://img-blog.csdnimg.cn/img_convert/1d76237229ce13552cb080f20a14bb2c.webp?x-oss-process=image/format,png)
文件系统
文件系统是存储设备上组织文件的方法,Linux系统中每个分区都是一个文件系统,都有自己的目录层次结构。
Linux文件系统的目的就是实现数据的查询和存储,数据在硬件中就是一系列二进制,文件系统将二进制还原为人类能看懂的文件形式。
文件是用户与操作系统交互所采用的主要工具,Linux以文件的形式对数据和资源进行管理,也就是Linux常说的一切皆文件。
虚拟文件系统(VFS):隐藏各种文件系统的具体细节,为用户提供一个统一的接口,VFS使得Linux可以支持多个不同的文件系统。
![img](https://img-blog.csdnimg.cn/img_convert/a9e42a6237afc91a6774069ea1497794.webp?x-oss-process=image/format,png)
挂载:利用一个目录当成进入点,将文件系统放置在该目录下。当文件系统挂载到某个目录后,可以通过这个目录来访问该文件系统,这个目录称为挂载点。除了根文件系统,其它所有文件系统,都要先挂载到根文件系统下的某个目录后才能被访问。
根文件系统(rootfs)
根文件系统是内核启动时所挂载的第一个文件系统,包含系统引导和使其它文件系统得以挂载所必要的文件,也包含Linux系统启动时所必须的目录和关键性文件,内核代码的镜像文件保存在根文件系统中。
系统引导启动程序会在根文件系统挂载之后从中把一些初始化脚本和服务加载到内存中去运行。
单独的Linux内核无法工作,必须搭配根文件系统。没有根文件系统,其它的文件系统和软件都无法工作。
根目录
在Linux系统中,只有一个根目录,路径是“/”,其它的分区只是挂载在根目录下的文件夹,根文件系统通常挂载在根目录下。
只要创建了一个用户,那么系统就会在/home这个目录下创建一个以这个用户名命名的文件夹,这个文件夹就是这个用户的根目录,所谓的用户根目录其实就是“/” 下的一个文件夹。
根目录下的文件只有root用户才有权限修改。
根目录下的重要文件夹:
/bin:存储一些二进制可执行命令文件,/usr/bin 也存放了一些基于用户的命令文 件。
/sbin:存储了很多系统命令,/usr/sbin 也存储了许多系统命令。
/root:超级用户root的根目录文件。
/home:普通用户默认目录,在该目录下,每个用户都有一个以本用户名命名的文件夹。
/boot:存放 Ubuntu 系统内核和系统启动文件。
/mnt:通常包括系统引导后被挂载的文件系统的挂载点。
/dev:存放设备文件,学习Linux 驱动主要是跟这个文件夹打交道。
/etc:保存系统管理所需的配置文件和目录。
/lib:保存系统程序运行所需的库文件,/usr/lib 下存放了一些用于普通用户的库文件。
/lost+found:一般为空,当系统非正常关机以后,此文件夹会保存一些零散文件。
/var:存储一些不断变化的文件,比如日志文件。
/usr:包括与系统用户直接有关的文件和目录,比如应用程序和所需的库文件。
/media:存放 Ubuntu 系统自动挂载的设备文件。
/proc:虚拟目录,不实际存储在磁盘上,通常用来保存系统信息和进程信息。
/tmp:存储系统和用户的临时文件,该文件夹对所有的用户都提供读写权限。
/opt:可选文件和程序的存放目录。
/sys:系统设备和文件层次结构,并向用户程序提供详细的内核数据信息。
U-Boot
Bootloader(启动加载程序)是操作系统在上电后、运行之前执行的第一段代码,先是初始化DDR、CPU等硬件设备,然后将内核从flash复制到DDR中,最后启动内核(最主要的工作)。
Bootloader可总结为四点:
- 初始化软硬件环境:Bootloader会初始化硬件设备,如内存、处理器等,并建立内存空间映射图,从而将系统的软硬件环境带到一个合适状态。
- 引导加载操作系统内核:Bootloader会将操作系统内核加载到内存中,并为其准备好正确的运行环境。
- 给Linux内核传参:Bootloader还可以向Linux内核传递参数,这些参数定义了内核的启动方式和行为。
- 执行用户命令:在系统启动时,Bootloader会进入一个倒计时模式。如果在倒计时结束前按下任意键,Bootloader会进入交互模式,允许用户执行一些特定的命令
不同的处理器架构都有不同的Bootloader,Bootloader不但依赖于CPU的体系架构,而且依赖于嵌入式系统板记设备的配置,所有即使使用同一种处理器,一般也需要修改Bootloader源程序,需要针对特定的硬件平台编写,而U-Boot是使用最广泛的一种Bootloader软件。
对于ZYNQ而言,在引导过程中,先运行FSBL来设置PS,然后运行U-Boot来加载内核镜像并引导Linux。所以U-Boot对ZYNQ来说是第二阶段引导程序,FSBL是第一阶段引导程序。
设备树
为什么需要设备树?
- 在设备树出现以前,硬件的细节被编码到内核中,内核中就会存在大量对板级信息描述的代码,对于内核而言,这些代码绝大多数属于垃圾冗余,会导致内核代码臃肿,难以维护。每次更改设备,都需要重新编译内核代码。引入设备树后,对于同一SOC的不同主板,只需更换设备树文件,即可实现不同主板的无差异支持,而不需更换内核文件。
设备树是一种描述硬件资源的数据结构,它通过Bootloader将硬件资源传给内核,使得内核和硬件资源相对独立。
U-boot会把内核和设备树文件都加载到内存,然后启动内核。在启动内核时会把设备树在内存中的地址传给内核。
dts:设备树源文件,ASCLL文本格式的描述,适合用户阅读,用于增删相关的硬件细节,一般一个.dts文件对应一个ARM。
dtb:被编译后的dts,二进制格式的描述,通过Bootloader引导,内核会将dtb文件加载到内存并进行解析,这样就可以动态地将板级信息写入到内核中。
dtc:设备树编译器,通过dtc将dts文件编译为dtb文件。
dtsi:一个SOC可能有多个不同的电路板,每个电路板都有一个dts文件,这些dts势必存在许多共同部分,为了减少代码冗余,设备树将这些共同部分保存在.dtsi文件中,供不同的dts共同使用。dtsi的使用方法类似于C语言,需要include“.dtsi”。
Linux系统启动过程
1.ZYNQ上电后,首先由BootROM对ZYNQ进行初始化,然后引导加载FSBL到OCM并启动FSBL;
2.FSBL启动后将uboot(SSBL)加载到DDR并启动uboot;
3.uboot启动后,加载linux内核镜像到DDR并开始执行内核代码;
4.内核挂载根文件系统,加载一些程序,linux启动完成。
目录
~:用户的主目录,存储用户个人的文件等。
/:根目录。
/home:家目录(根目录下的一个子目录),存储普通用户的信息。家目录下可以创建多个用户。
/root:超级用户root的家目录。