一、Linux系统构成简单介绍
一个完整的linux系统,通常包含了Uboot、kernel、设备树以及根文件系统。
- U-Boot :一个主要用于嵌入式系统的引导加载程序,可以支持多种不同的计算机系统结构,包括PPC、ARM、AVR32、MIPS、x86、68k、Nios与MicroBlaze。这也是一套在GNU通用公共许可证之下发布的自由软件。 Uboot的全称 Universal Boot Loader,是遵循GPL条款的开源项目, U-Boot的主要作用是用来启动操作系统内核,它分为两个阶段,即boot + loader, boot阶段启动系统,初始化硬件设备,建立内存空间映射图,将系统的软硬件带到一个合适的状态, loader阶段将操作系统内核文件加载至内存,之后跳转到内核所在地址运行。
另外,某些BootLoader可能含有一些高级特性,如校验操作系统镜像,从多个操作系统镜像中选择引导合适的操作系统, 或者添加网络功能,让系统自主从网上寻找合适的镜像并且进行引导等等。
2.Linux内核:
Linux是一种开源电脑操作系统内核。它是一个用C语言写成,符合POSIX标准的类Unix操作系统。 Linux内核是一个用来和硬件打交道并为用户程序提供一个有限服务集的低级支撑软件。一个计算机系统是一个硬件和软件的共生体,它们互相依赖,不可分割。计算机的硬件,含有外围设备、处理器、内存、硬盘和其他的电子设备组成计算机的发动机。但是没有软件来操作和控制它,自身是不能工作的。完成这个控制工作的软件就称为操作系统,在Linux的术语中被称为"内核",也可以称为"核心"。Linux内核的主要模块(或组件)分以下几个部分:进程管理子系统、内存管理子系统、文件子系统、网络子系统、设备子系统等。
3.设备树
设备树是一种描述硬件的数据结构,它把这些硬件设备的信息, 而这个文件,就是Device Tree(设备树),设备树包括设备树源码(Device Tree Source,DTS)文件、 设备树编译工具(Device Tree Compiler,DTC)与二进制格式设备树(Device Tree Blob,DTB), DTS包含的头文件格式为DTSI。
node1 {
a-string-property = "A string";
a-string-list-property = "first string", "second string";
a-byte-data-property = [0x01 0x23 0x34 0x56];
child-node1 {
first-child-property;
second-child-property = <1>;
a-string-property = "Hello, world";
};
};
Uboot和Linux不能直接识别DTS文件, 而DTB可以被内核与BootLoader识别解析,通常在制作NAND Flash、SD Card启动镜像时, 通常会为DTB文件留下一部分存储区域以存储DTB,在BootLoader启动内核时,会先读取DTB到内存,再提供给内核使用。
4.根文件系统
根文件系统(rootfs)是linux在初始化时加载的第一个文件系统, 根文件系统包括根目录和真实文件系统,它包含系统引导和使其他文件系统得以挂载(mount)所必要的文件。 根文件系统包含Linux启动时所必须的目录和关键性的文件,例如Linux启动时必要的初始化文件, 它在init目录下,此外根文件系统中还包括了许多的应用程序bin目录等, 任何包括这些Linux 系统启动所必须的文件都可以成为根文件系统。
在Linux内核启动的初始阶段,首先内核会初始化一个基于内存的文件系 统,如initramfs,initrd等,然后以只读的方式去加载根文件系统(load rootfs), 读取并且运行/sbin/init初始化文件,根据/etc/inittab配置文件完成系统的初始化工作 (提示:/sbin/init是一个二进制可执行文件,为系统的初始化程序,而/etc/inittab是它的配置文件), 在初始化的过程中,还会以读写的方式重新挂载根文件系统,在系统启动后, 根文件系统就可用于存储数据了,存在根文件系统是Linux启动时的必要条件。
我们常见的根文件系统制作工具有 buildroot、Ubuntu、Debian、yocto、busybox,这些工具的优缺点列出如下
二、进入Linux内核源码目录
1.使用命令进入Linux内核配置界面:
- make menuconfig ARCH=arm 这是对32位 ARM 处理器的架构进行内核配置。
- make menuconfig ARCH=arm64 这是对64位 ARM 处理器的架构进行内核配置。
2.Linux内核图形界面的配置
配置项 | Kconfig文件位置 | 功能说明 |
---|---|---|
ARM64架构的默认配置项 | arch/arm64/Kconfig | 指定ARCH为ARM64之后,ARM64的Kconfig会默认帮我们确定众多的配置项,例如CONFIG_64BIT、CONFIG_MMU、CONFIG_OF等等。这些配置项不会体现在menuconfig的菜单中,但可以在最终生成的config文件中看到。 |
General setup | init/Kconfig 位于menu "General setup"和对应的endmenu之间 | 该配置项由"menu ... endmenu"定义,是一个配置菜单,表示一类配置的集合(参考上面图片1,"--->"结尾的配置项都是菜单项,按Enter直接进入对应的菜单界面); 主要用于配置和功能无关的的通用选项,例如kernel的版本号、压缩方式、等等。 |
loadable module | init/Kconfig 由"menuconfig MODULES"定义 | menuconfig和menu不同,是一个可以选择是否开启的菜单(参考图片1中的"[*]"); 用于配置内核"模块"有关的特性。 |
block device | block/Kconfig 由"menuconfig BLOCK"定义 | 内核块设备有关的特性。 |
Platform selection | arch/arm64/Kconfig.platforms 位于menu "Platform selection"和endmenu之间 | 用于配置和具体平台有关的配置项,如SUNIX、HISI等; 自从ARM64把"mach-xxx"目录抛弃之后,这里可能是各个平台可自行发挥的最后一个空间了。 |
PCI Bus support | arch/arm64/Kconfig drivers/pci/Kconfi | PCI总线有关的特性。 |
ACPI support | drivers/acpi/Kconfig | ACPI总线有关的特性。 |
Kernel Features | arch/arm64/Kconfig kernel/Kconfig.preempt kernel/Kconfig.hz mm/Kconfig 位于menu "Kernel Features"和对应的endmenu之间 | Linux kernel的核心功能的配置,如进程管理、内存管理、等等。是Linux kernel配置项中最复杂的一类。 |
Boot options | arch/arm64/Kconfig 位于menu "Boot options"和对应的endmenu之间 | 用于配置和内核启动有关的功能,如默认的Command line、UEFI支持等。 |
Userspace binary formats | arch/arm64/Kconfig fs/Kconfig.binfmt 位于menu "Userspace binary formats"和对应的endmenu之间 | 用于配置用户空间二进制的格式。 |
Power management | arch/arm64/Kconfig kernel/power/Kconfig 位于menu "Power management options"和对应的endmenu之间 | Linux kernel电源管理有关的特性。 |
CPU Power Management | arch/arm64/Kconfig drivers/cpuidle/Kconfig drivers/cpufreq/Kconfig 位于menu "CPU Power Management"和对应的endmenu之间 | CPU有关的电源管理特性,如cpuidle、cpufreq等; 这是新版kernel的一大改进,将CPU有关的电源管理功能,抽象成一个顶层功能,和系统的电源管理并列。 |
Networking support | net/Kconfig | 网络有关的特性。 |
Device Drivers | drivers/Kconfig | 设备驱动有关的配置项。 |
Firmware Drivers | drivers/firmware/Kconfig ... | Firmware有关的配置项。 |
File systems | fs/Kconfig | 文件系统有关的配置项。 |
Virtualization | arch/arm64/kvm/Kconfig | 虚拟化有关的配置项。 |
Kernel hacking | arch/arm64/Kconfig.debug | Kernel调试有关的配置项。 |
Security options | security/Kconfig | 安全特性有关的配置项。 |
Cryptographic API | crypto/Kconfig arch/arm64/crypto/Kconfig | 加密算法有关的配置项。 |
Library routines | lib/Kconfig | 用于配置常用的library,如CRC16等。 |
[menuconfig的一级菜单进行简要的分析] |