uboot & Linux内核
文章目录
uboot是一种通用的引导加载程序,它可以用于多种嵌入式系统,支持多种操作系统,如Linux, Android, NetBSD等。
uboot的主要作用是将操作系统内核从存储设备(如Flash, SD卡等)==> 加载到内存中,并执行 内核代码。
1.1 为什么需要用uboot?
- 因为芯片内部的资源是有限的(RAM&ROM太少了),需要借助外部的裸机程序(uboot)
==>内存初始化 ==> 引导(加载)
linux
内核
-
boot/ 放启动代码
-
XIP设备是指一种可以直接在存储器中执行程序代码的设备,即芯片内执行
1、uboot
1.2 uboot启动过程
U-Boot的启动流程通常可以分为以下几个步骤:
硬件初始化 ==> 加载引导程序 ==> 引导加载内核镜像 ==> 设置内核启动参数 ==> 启动操作系统
在整个启动流程中,U-Boot扮演着关键的角色,负责初始化硬件、加载引导程序和内核映像,并设置必要的启动参数,从而顺利地启动操作系统。
- 硬件初始化:设置设备的基本硬件参数,如时钟和存储控制器。
- 加载引导程序:从预设的存储介质(如闪存、SD卡)中加载引导程序。
- 引导加载内核镜像:加载操作系统内核到内存中。
- 设置内核启动参数:设置内核启动所需的参数,如内存布局、命令行参数。
- 启动操作系统:跳转到内核入口点,传递参数启动操作系统。
2、内核编译
2.1 linux操作系统框架
2.2 linux内核的主要功能
Linux内核的主要功能:进程管理、内存管理、驱动、系统调用
arch/ | |||
---|---|---|---|
x86/ | arm/ | ||
boot/ | lib/ | mm/ | include/ |
启动代码 | 库函数 | 内存管理 | 头文件 |
-
Linux的目录结构
-
test@test:~/orangepi-build/kernel/orange-pi-5.16-sunxi64$ ls arch include mm scripts block init modules.builtin security certs ipc modules.builtin.modinfo sound COPYING Kbuild modules-only.symvers System.map CREDITS Kconfig modules.order tools crypto kernel Module.symvers usr Documentation lib net virt drivers LICENSES README vmlinux export.txt MAINTAINERS README.md vmlinux.o fs Makefile samples vmlinux.symvers.
目录 | |
---|---|
arch/ | 这个目录包含了不同架构处理器的代码,如x86,arm,mips等,。每个架构都有自己的子目 录,如arch/x86/,arch/arm/等。 |
block/ | 这个目录包含了块设备的代码,如硬盘,光驱等。block/目录中主要包含了块设备的基本框 架和I/O调度算法,以及一些通用的块设备驱动 |
crypto/ | 这个目录包含了加密算法的代码,如AES,SHA1,MD5等 |
drivers/ | 这个目录包含了设备驱动程序的代码,如键盘,鼠标,网卡,声卡,摄像头等。drivers/目 录中的代码按照设备的类别进行分类,如char/,block/,input/,i2c/,spi/,pci/,usb/等 |
fs/ | 这个目录包含了文件系统的代码,如ext4,fat,ntfs,nfs,cifs等 |
include/ | 这个目录包含了内核所需的头文件,如linux/,asm/,uapi/等。 |
init/ | 这个目录包含了内核初始化的代码,如main.c,version.c,do_mounts.c等。 |
ipc/ | 这个目录包含了进程间通信的代码,如sem.c,msg.c,shm.c等。进程间通信是指在不同的进程 之间传递数据和信号的方法,它们可以让进程之间实现协作和同步。ipc/目录中的代码实现了一些常用的 进程间通信机制,如信号量,消息队列,共享内存等 |
kernel/ | 这个目录包含了内核的核心代码,如sched/,irq/,time/,fork.c,exit.c,signal.c等。 kernel/目录中的代码实现了一些内核的基本功能和服务,如进程调度,中断处理,时间管理,进程创 建,进程终止,信号处理等 |
lib/ | 这个目录包含了内核需要引用的一些库函数的代码,如string.c,vsprintf.c,crc32.c等 |
mm/ | 这个目录包含了内存管理的代码 |
net/ | 这个目录包含了网络协议的代码,和网卡驱动不相关代码 |
scripts/ | 这个目录包含了内核编译所需的一些脚本,如Makefile,Kconfig,checkpatch.pl等 |
tools/ | 这个目录包含了一些和内核交互的工具,如perf/,ftrace/,cpupower/,objtool/等。工具是 用于分析和调试内核的程序,它们可以让内核的性能和稳定性更加优化和提高 |
2.3 Linux根文件系统
根文件系统也叫roofs,Linux 根文件系统是指整个文件系统的最顶层,以 “/” 来表示。它是内核启动时 所挂载的第一个文件系统,包含了系统运行所必需的目录和文件:
根文件 | |
---|---|
/bin | 下存放着系统需要的可执行文件比如ls、mv、cp等命令,现在新根文件系统的像ubuntu等 debian系的rootfs, 基本都是软链接到/usr/bin目录下 |
/dev | 下面存放着的文件都与设备有关,此目录下的文件都是设备文件。 |
/etc | 存放Linux下所必须的库文件 |
/mnt | 临时挂载目录,可以在从目录下创建空的子目录 |
/proc、sys | Linux虚拟文件系统,由内核生成各类节点 |
/sbin | 一般软链到/usr/sbin下,一般存放一些root权限才能执行的命令 |
/lib | 软链接到/usr/lib目录,用于存放库文件 |
/usr | 存放lib bin sbin目录, 另外的share目录里面存放的是共享、只读的程序和数据 |
/tmp | 存放临时文件或目录 |
/root | 系统管理员(root)的主文件夹,即是根用户的目录,与此对应,普通用户的目录 是/home下的某个子目录。 |
/var | 与/usr目录相反,/var目录中存放可变的数据,比如log文件\临时文件等。 |
/home | 系统默认的**用户文件夹,**它是可选的,对于每个普通用户,在/home目录下都有一个 以用户名命名的子目录,里面存放用户相关的配置文件。 |
欢迎大家一起交流讨论!