企业营销型网站建设哪家公司好无锡市规划建设局网站
企业营销型网站建设哪家公司好,无锡市规划建设局网站,python报修网站开发源码,iis怎么建网站Linux 内核启动是 “固件→Bootloader→内核→用户空间” 的控制权移交过程#xff0c;核心链路为 “上电→固件自检→Bootloader 加载内核 /initramfs→内核早期初始化→start_kernel→挂载根文件系统→启动 1 号进程→进入用户态”。
一、固件初始化#xff08;BIOS/UEFI&…Linux 内核启动是 “固件→Bootloader→内核→用户空间” 的控制权移交过程核心链路为 “上电→固件自检→Bootloader 加载内核 /initramfs→内核早期初始化→start_kernel→挂载根文件系统→启动 1 号进程→进入用户态”。一、固件初始化BIOS/UEFI上电复位CPU 从固定地址如 x86 的 0xFFFF0执行固件代码初始化时钟、电压、DRAM 等关键硬件。硬件自检POST检测 CPU、内存、存储、显卡等异常则告警自检通过后定位启动设备硬盘 / SSD / 网络。引导加载BIOS 从 MBR主引导记录512 字节加载 Bootloader 第一阶段UEFI 从 ESP 分区读取 bootloader如 GRUB2 的 grubx64.efi并执行支持更大磁盘与安全启动。二、Bootloader 阶段GRUB2/U-BootBootloader 负责加载内核与 initramfs、传递参数并移交控制权以 GRUB2 为例阶段 1MBR/ESP加载 stage1.5core.img提供文件系统驱动以访问 /boot 分区。阶段 2/boot/grub加载 grub.cfg显示菜单用户选择内核后加载 vmlinuz压缩内核与 initramfs 到内存并传递内核参数如 rootUUIDxxx、ro、quiet。移交控制权设置好内核入口与环境后跳转到内核起始地址执行。三、内核早期初始化汇编阶段无论何种架构早期初始化都遵循固定执行链路按 “控制权接收→硬件基础初始化→环境准备→跳转到 C 入口” 执行且仅运行在主核Primary Core多核的从核Secondary Core会被暂时挂起直到start_kernel后期才被唤醒。整体链路内核解压压缩内核vmlinuz自解压到内存x86 调用 startup_32/startup_64ARM64 调用 el2_entry/el1_entry初始化栈与页表启用 MMU 进入保护 / 长模式。架构相关初始化初始化 CPU、中断控制器GIC/APIC、异常向量表设备树加载ARM64Bootloader 传递 dtb内核解析硬件拓扑与配置替代传统板级代码。早期控制台earlycon初始化串口 / 控制台输出内核启动日志便于调试。核心特点Linux 内核早期初始化的核心是 **「架构底层环境的最小化搭建」**从 Bootloader 接收裸机控制权完成压缩内核解压若有以汇编为核心完成 CPU、栈、MMU / 页表、异常向量表的初始化切换到受保护的 64 位模式和虚拟地址空间初始化 earlycon 实现早期日志解析内核参数和硬件描述E820/DTB获取内存和硬件布局主核完成所有初始化后跳转到 C 层入口setup_arch()最终衔接start_kernel从核则保持挂起状态全程无 C 库、无驱动模型、无进程调度是内核最 “裸” 的阶段也是架构相关代码最集中的部分。早期初始化的核心难点是地址一致性加载地址 / 链接地址 / 虚拟地址和多核同步而调试核心是开启earlycon和使用硬件调试器这也是内核开发中调试早期启动问题的必备技能。无虚拟内存初期运行在物理地址MMU 开启后切换到虚拟地址无进程环境无调度、无 PID仅为纯裸机执行流极简资源仅初始化 CPU 核心、内存控制器、串口earlycon无外设初始化压缩内核专属步骤vmlinuz 为压缩内核需先自解压到物理内存再执行入口vmlinux 为未压缩内核直接跳过解压。早期控制台earlycon早期初始化中唯一的日志输出方式核心作用是在printk缓冲区初始化前直接将日志写入串口便于调试早期启动崩溃如 MMU 开启失败、页表错乱。启用方式内核参数添加earlyconxxx如 x86earlyconuart,0x3f8ARM64earlyconuart8250,mmio32,0x12340000核心代码drivers/tty/serial/earlycon.c无驱动模型直接操作串口寄存器特点无中断、无缓冲纯轮询方式写串口仅支持输出不支持输入。内核参数解析bootargsBootloader 传递的内核参数如 rootUUIDxxx、ro、quiet、earlycon在早期初始化中被解析保存到内核全局变量为后续初始化提供配置核心x86参数保存在 E820 表旁的物理内存区域setup_arch()中读取并解析ARM64参数保存在 DTB 的/chosen/bootargs节点setup_arch()中解析 DTB 获取解析函数init/main.c中的parse_early_param()早期初始化仅解析early 参数如 earlycon、earlyprintk普通参数在start_kernel中解析。主核 / 从核分离早期初始化仅主核执行完整流程从核启动后会进入挂起状态核心原因早期初始化仅初始化全局资源页表、栈、异常向量表无多核同步机制从核无独立的早期栈和页表无法独立执行初始化唤醒时机start_kernel中执行smp_init()通过IPI 中断处理器间中断唤醒从核从核执行secondary_init()完成自身初始化加入调度器。临时页表与正式页表的区别早期初始化的临时页表是极简映射与start_kernel中建立的正式页表有本质区别特性临时页表正式页表映射范围仅内核核心区域 栈 DTB全物理内存 外设 MMIO 内核区页表层级极简如 ARM64 仅三级完整层级支持所有大页映射方式线性映射 / 恒等映射线性映射 虚拟地址布局用途仅支持早期初始化 C 代码内核全程使用支持调度 / 外设生命周期start_kernel中被替换内核运行全程有效x86_64 架构的早期初始化核心流程 关键函数 / 地址x86_64 的早期初始化基于实模式→保护模式→长模式的切换受 BIOS/UEFI 固件约束核心代码位于arch/x86/boot/和arch/x86/kernel/分boot 阶段和head 阶段是 x86 独有的分层设计。第一阶段boot 阶段arch/x86/boot/实模式→保护模式由 BootloaderGRUB2启动运行在实模式地址空间 1MB仅完成基础切换核心文件bootsect.S、setup.S、x86_64.Sbootsect.S引导扇区入口读取 setup.S 到内存跳转到 setup.S 执行setup.S检测硬件内存大小、磁盘、串口、解析 Bootloader 传递的内核参数如 root、ro、quiet将参数保存到内存固定区域切换到32 位保护模式开启分段机制关闭实模式的 1MB 地址限制加载 GDT全局描述符表建立分段映射跳转到 x86_64.S进入 64 位准备阶段。第二阶段head 阶段arch/x86/kernel/保护模式→长模式运行在长模式64 位是 x86_64 早期初始化的核心完成 MMU 开启、虚拟地址映射核心文件head_64.S、trampoline_64.S栈初始化创建内核初始栈init_stack保存在task_struct的 init_task0 号进程雏形中为后续 C 代码提供栈环境页表初始化创建临时页表一级页表 PGD、二级 PUD、三级 PMD、四级 PTE仅映射内核核心区域物理地址 0→虚拟地址 0xffffffff80000000即内核线性地址和当前 CPU 的栈区域临时页表仅用于早期初始化start_kernel中会被替换为正式页表开启 MMUCR0 寄存器 PG 位置 1切换到虚拟地址空间此后所有指令均使用虚拟地址物理地址仅在内核内存管理中使用加载 IDT中断描述符表初始化空 IDT早期仅处理异常不处理外设中断建立异常向量表处理页错误、通用保护错误等核心异常解析 E820 内存映射从固件BIOS/UEFI获取 E820 表保存内存的可用区域、保留区域、BIOS 区域为后续内存管理伙伴系统提供物理内存布局earlycon 初始化解析内核参数earlyconuart,0x3f8初始化串口如 COM1开启早期日志输出此时可通过printk输出早期信息无缓冲区直接写串口跳转到 C 层入口调用setup_arch()arch/x86/kernel/setup.c传递内核参数和 E820 表进入 x86_64 的架构相关 C 层初始化为start_kernel铺路。x86_64 关键标记与地址内核链接地址0xffffffff80000000内核线性地址起始物理地址 0 直接映射临时栈地址init_stack编译时固定位于内核数据段入口函数压缩内核解压后跳转到startup_64head_64.S内核参数保存地址0x20000物理内存64 位专用。ARM64 架构的早期初始化核心流程 关键函数 / 设备树ARM64 的早期初始化无实模式 / 保护模式切换直接运行在EL1内核态若 Bootloader 运行在 EL2会先从 EL2 切换到 EL1无分层设计核心代码位于arch/arm64/kernel/设备树DTB是核心替代 x86 的 E820 表和板级代码核心文件head.S、entry.S、setup.c。ARM64 的 Bootloader如 U-Boot会完成EL2→EL1的特权级切换并将DTB 地址、内核参数传递到寄存器x0-x3内核入口直接接收寄存器参数这是与 x86 的核心区别。核心流程head.S 为入口EL1 执行特权级与模式检查检测当前 CPU 运行在 EL1若为 EL2/EL3跳转到对应切换代码强制切到 EL1ARM64 内核仅运行在 EL1关闭非核心功能关闭 MMU、Cache、TLB、中断DAIF 位置 1保证裸机执行环境干净栈初始化为主核创建早期内核栈init_stack栈地址为编译时固定的虚拟地址ARM64 内核编译时已开启地址随机化 KASLR若开启 KASLR会先计算随机偏移再重定位栈地址页表初始化创建临时页表ARM64 为三级页表PGD、PUD、PMD无 PTE仅映射内核文本段、数据段、栈段和 DTB 所在的物理内存区域临时页表为恒等映射或线性映射物理地址 虚拟地址 - 偏移量如 0xffffff8000000000开启 MMUCacheTLB设置 SCTLR_EL1 寄存器M 位 1 开启 MMUC 位 1 开启数据 CacheI 位 1 开启指令 Cache切换到虚拟地址空间此后执行虚拟地址指令异常向量表初始化将异常向量表vectorsentry.S 中定义的地址加载到 VBAR_EL1 寄存器建立同步异常、异步异常IRQ/FIQ、SError的处理入口早期仅处理同步异常如页错误IRQ/FIQ 暂不使能DTB 解析与重定位从寄存器 x0 获取 Bootloader 传递的 DTB 物理地址将 DTB 重定位到内核可用的虚拟地址解析 DTB 的 **/memory节点获取物理内存布局替代 x86 的 E820 表解析/chosen** 节点获取内核参数如 root、earlyconearlycon 初始化解析 DTB 中的serial节点或内核参数earlycon初始化 UART 串口开启早期日志支持printk输出CPU 特性检测读取 MIDR_EL1、ID_AA64ISAR0_EL1 等 CPU 寄存器检测 ARM64 特性如 NEON、CRC32、原子指令初始化 CPU 特性掩码为后续内核子系统提供特性支持跳转到 C 层入口调用setup_arch()arch/arm64/kernel/setup.c传递 DTB 虚拟地址和内核参数进入 ARM64 的 C 层初始化后续衔接start_kernel。ARM64 关键特性与标记特权级内核运行在 EL1HypervisorKVM运行在 EL2安全世界运行在 EL3页表默认三级页表支持 4KB/2MB/1GB 大页临时页表仅用大页映射提升效率KASLRARM64 默认开启内核地址随机化早期初始化会计算随机偏移重定位内核所有虚拟地址DTB核心硬件描述文件所有硬件信息内存、串口、PCIe、I2C均来自 DTB无板级代码从核挂起从核启动后会执行secondary_startuphead.S进入无限循环直到start_kernel中smp_init()通过自旋锁 / IPI 中断唤醒。与 start_kernel 的衔接早期初始化的最终目标是为start_kernelinit/main.c提供可执行 C 代码的完整环境衔接点为setup_arch()setup_arch()是架构相关的 C 层入口由早期初始化的汇编代码调用setup_arch()完成内存布局初始化、内核参数最终解析、DTB/E820 表处理、CPU 特性初始化setup_arch()执行完成后直接调用start_kernel()进入内核通用初始化阶段内存管理、调度器、中断系统等早期初始化的所有全局变量如内存布局、CPU 特性、DTB 地址均会被start_kernel中的子系统初始化使用。早期初始化的调试要点早期初始化是内核启动中崩溃率最高的阶段且无完整日志调试难度大核心调试方法earlycon 必开任何早期调试都需先开启 earlycon否则无法获取任何崩溃信息串口打印断点在关键汇编步骤后添加early_printk逐步定位崩溃点如 MMU 开启前 / 后各加一个打印JTAG/BDM 硬件调试通过硬件调试器如 ARM DS-5、x86 JTAG挂载 CPU直接查看寄存器、内存、页表是最有效的调试方式关闭 KASLRARM64/x86_64 开启 KASLR 后虚拟地址随机化会增加调试难度内核参数添加nokaslr关闭未压缩内核使用 vmlinux未压缩替代 vmlinuz跳过解压步骤直接定位内核入口减少调试环节栈回溯早期初始化的栈是固定的崩溃后可通过硬件调试器查看栈指针rsp/xsp回溯执行流页表检查MMU 开启后崩溃大概率是页表映射错误通过硬件调试器查看页表寄存器CR3/x86TTBR0_EL1/ARM64检查页表项是否正确。四、内核核心初始化start_kernelstart_kernel 是内核 C 代码入口init/main.c完成全子系统初始化核心子系统初始化内存管理mm_init () 建立页表、初始化伙伴系统、slab 分配器启用虚拟内存。中断系统init_IRQ () 初始化中断控制器注册异常处理函数。进程管理sched_init () 初始化调度器创建 0 号进程idle初始化 PID 命名空间。总线与驱动初始化 PCIe、ACPI、I2C 等总线加载内置驱动枚举设备。时间子系统初始化时钟源TSC/HPET、定时器为进程调度与延迟操作提供基础。挂载 initramfs内核将 initramfs 作为临时根文件系统rootfs执行 /init 脚本加载磁盘、文件系统驱动如 NVMe、ext4、btrfs。切换根文件系统initramfs 脚本探测并挂载真实根分区/dev/sda1 等执行 pivot_root 切换到真实根卸载 initramfs 释放内存。五、用户空间初始化创建 1 号进程内核调用 kernel_init () 启动 PID1 的用户态进程现代系统为 systemd传统为 /sbin/init同时创建 kthreaddPID2负责内核线程管理。系统服务启动systemd 按单元文件.service并行启动关键服务udev、network、sshd、docker 等并处理依赖关系。运行级别与挂载systemd 按默认 target如 multi-user.target初始化执行 fstab 挂载额外分区启动 getty/login 进程进入用户登录界面。关键节点与文件阶段关键文件 / 函数作用固件MBR/ESP、grubx64.efi启动 BootloaderBootloadervmlinuz、initramfs、grub.cfg加载内核与临时根内核早期startup_64、earlycon解压内核早期日志内核核心start_kernel、mm_init、sched_init子系统初始化用户空间/init、systemd、fstab挂载根启动服务内核启动流程总结固件完成硬件自检并加载 Bootloader。Bootloader 加载内核与 initramfs传递参数后移交控制权。内核汇编阶段初始化 CPU/MMU进入 C 代码执行 start_kernel。内核初始化内存、中断、调度、总线等通过 initramfs 挂载真实根。启动 1 号进程systemd初始化系统服务并进入用户态。