双核Linux内核的引导

简介: 双核Linux内核的引导

最后再整一篇多核的引导,称热打铁

Linux内核的引导

引导Linux系统的过程包括很多阶段,这里将以引导ARM Linux为例来进行讲解(见图3.11)。

一般的SoC内嵌入了bootrom,上电时bootrom运行

对于CPU0而言,bootrom会去引导bootloader,而其他CPU则判断自己是不是CPU0,不是就进入WFI的状态等待CPU0来唤醒它。

CPU0引导bootloader,bootloader引导Linux内核,在内核启动阶段,CPU0会发中断唤醒CPU1,之后CPU0和CPU1都投入运行。

CPU0导致用户空间的init程序被调用,init程序再派生其他进程,派生出来的进程再派生其他进程。

CPU0和CPU1共担这些负载,进行负载均衡。(这里的运行策略可能不是这么简单,除非核的配置是一样的,一般都不是。)

bootrom是各个SoC厂家根据自身情况编写的,目前的SoC一般都具有从SD、eMMC、NAND、USB等介质启动的能力,这证明这些bootrom内部的代码具备读SD、NAND等能力。(读取这些介质上的文件到RAM去运行)

嵌入式Linux领域最著名的bootloader是U-Boot,其代码仓库位于http://git.denx.de/u-boot.git/

早前,bootloader需要将启动信息以ATAG的形式封装,并且把ATAG的地址填充在r2寄存器中,机型号填充在r1寄存器中,详见内核文档Documentation/arm/booting。

在ARM Linux支持设备树(Device Tree)后,bootloader则需要把dtb的地址放入r2寄存器中。(所以现在不用那个tag符号表了)

当然,ARM Linux也支持直接把dtb和zImage绑定在一起的模式 (内核ARM_APPENDED_DTB选项“Use appended device tree blob to zImage”),这样 r2寄存器就不再需要填充dtb地址了

类似zImage的内核镜像实际上是由没有压缩的解压算法被压缩的内核组成,所以在bootloader跳入zImage以后,它自身的解压缩逻辑就把内核的镜像解压缩出来了。

关于内核启动,与我们关系比较大的部分是每个平台的设备回调函数设备属性信息,它们通常包装在DT_MACHINE_START和MACHINE_END之间,包含reserve()、map_io()、init_machine()、init_late()、smp等回调函数或者属性。

这些回调函数会在内核启动过程中被调用。后续章节会进一步介绍。

用户空间的init程序常用的有busybox init、SysVinit、systemd等,它们的职责类似,把整个系统启动,最后形成一个进程树,比如Ubuntu上运行的pstree:

init─┬─NetworkManager─┬─dhclient
   │              └─2*[{NetworkManager}]
   ├─VBoxSVC─┬─VirtualBox───29*[{VirtualBox}]
   │       └─11*[{VBoxSVC}]
   ├─VBoxXPCOMIPCD
   ├─accounts-daemon───{accounts-daemon}
   ├─acpid
   ├─apache2───5*[apache2]
   ├─at-spi-bus-laun───2*[{at-spi-bus-laun}]
   ├─atd
   ├─avahi-daemon───avahi-daemon
   ├─bluetoothd
   ├─cgrulesengd
   ├─colord───2*[{colord}]
   ├─console-kit-dae───64*[{console-kit-dae}]
   ├─cpufreqd───{cpufreqd}
   ├─cron
   ├─cupsd
   ├─2*[dbus-daemon]
   ├─dbus-launch
   ├─dconf-service───2*[{dconf-service}]
   ├─dnsmasq

这一顿操作,结合前面在bootloader方面从粗到细,从浅到深到浅写了很多。

真的让人对这个bootloader这个部分,起码说宏观上的理解,应该算是比较清晰了。

参考资料:

《Linux设备驱动开发详解》

目录
相关文章
|
1天前
|
Linux 数据库
Linux内核中的锁机制:保障并发操作的数据一致性####
【10月更文挑战第29天】 在多线程编程中,确保数据一致性和防止竞争条件是至关重要的。本文将深入探讨Linux操作系统中实现的几种关键锁机制,包括自旋锁、互斥锁和读写锁等。通过分析这些锁的设计原理和使用场景,帮助读者理解如何在实际应用中选择合适的锁机制以优化系统性能和稳定性。 ####
14 6
|
2天前
|
机器学习/深度学习 负载均衡 算法
深入探索Linux内核调度机制的优化策略###
本文旨在为读者揭开Linux操作系统中至关重要的一环——CPU调度机制的神秘面纱。通过深入浅出地解析其工作原理,并探讨一系列创新优化策略,本文不仅增强了技术爱好者的理论知识,更为系统管理员和软件开发者提供了实用的性能调优指南,旨在促进系统的高效运行与资源利用最大化。 ###
|
4天前
|
算法 Linux 开发者
深入探究Linux内核中的内存管理机制
本文旨在对Linux操作系统的内存管理机制进行深入分析,探讨其如何通过高效的内存分配和回收策略来优化系统性能。文章将详细介绍Linux内核中内存管理的关键技术点,包括物理内存与虚拟内存的映射、页面置换算法、以及内存碎片的处理方法等。通过对这些技术点的解析,本文旨在为读者提供一个清晰的Linux内存管理框架,帮助理解其在现代计算环境中的重要性和应用。
|
2天前
|
缓存 网络协议 Linux
Linux操作系统内核
Linux操作系统内核 1、进程管理: 进程调度 进程创建与销毁 进程间通信 2、内存管理: 内存分配与回收 虚拟内存管理 缓存管理 3、驱动管理: 设备驱动程序接口 硬件抽象层 中断处理 4、文件和网络管理: 文件系统管理 网络协议栈 网络安全及防火墙管理
19 4
|
4天前
|
人工智能 算法 大数据
Linux内核中的调度算法演变:从O(1)到CFS的优化之旅###
本文深入探讨了Linux操作系统内核中进程调度算法的发展历程,聚焦于O(1)调度器向完全公平调度器(CFS)的转变。不同于传统摘要对研究背景、方法、结果和结论的概述,本文创新性地采用“技术演进时间线”的形式,简明扼要地勾勒出这一转变背后的关键技术里程碑,旨在为读者提供一个清晰的历史脉络,引领其深入了解Linux调度机制的革新之路。 ###
|
6天前
|
算法 Linux 定位技术
Linux内核中的进程调度算法解析####
【10月更文挑战第29天】 本文深入剖析了Linux操作系统的心脏——内核中至关重要的组成部分之一,即进程调度机制。不同于传统的摘要概述,我们将通过一段引人入胜的故事线来揭开进程调度算法的神秘面纱,展现其背后的精妙设计与复杂逻辑,让读者仿佛跟随一位虚拟的“进程侦探”,一步步探索Linux如何高效、公平地管理众多进程,确保系统资源的最优分配与利用。 ####
30 4
|
7天前
|
缓存 负载均衡 算法
Linux内核中的进程调度算法解析####
本文深入探讨了Linux操作系统核心组件之一——进程调度器,着重分析了其采用的CFS(完全公平调度器)算法。不同于传统摘要对研究背景、方法、结果和结论的概述,本文摘要将直接揭示CFS算法的核心优势及其在现代多核处理器环境下如何实现高效、公平的资源分配,同时简要提及该算法如何优化系统响应时间和吞吐量,为读者快速构建对Linux进程调度机制的认知框架。 ####
|
10天前
|
缓存 Linux
揭秘Linux内核:探索CPU拓扑结构
【10月更文挑战第26天】
27 1
|
10天前
|
缓存 运维 Linux
深入探索Linux内核:CPU拓扑结构探测
【10月更文挑战第18天】在现代计算机系统中,CPU的拓扑结构对性能优化和资源管理至关重要。了解CPU的核心、线程、NUMA节点等信息,可以帮助开发者和系统管理员更好地调优应用程序和系统配置。本文将深入探讨如何在Linux内核中探测CPU拓扑结构,介绍相关工具和方法。
11 0
|
7天前
|
缓存 算法 Linux
Linux内核中的内存管理机制深度剖析####
【10月更文挑战第28天】 本文深入探讨了Linux操作系统的心脏——内核,聚焦其内存管理机制的奥秘。不同于传统摘要的概述方式,本文将以一次虚拟的内存分配请求为引子,逐步揭开Linux如何高效、安全地管理着从微小嵌入式设备到庞大数据中心数以千计程序的内存需求。通过这段旅程,读者将直观感受到Linux内存管理的精妙设计与强大能力,以及它是如何在复杂多变的环境中保持系统稳定与性能优化的。 ####
14 0
下一篇
无影云桌面