【学习笔记】小 O 带你掌握操作系统的心跳 - OneOS 内核启动

简介: 一、简介内核启动介绍了整个系统从硬件上电如何一步步进入用户程序的过程。一般情况下,启动过程分为硬件上电,首先运行和体系架构相关的启动汇编文件,进行一些最基本硬件的初始化 (例如 CPU 配置,时钟,栈地址,RAM 等),为内核运行铺垫好环境,然后初始化内核各模块 (例如调度器,定时器等),接着创建系统任务 (例如空闲任务) 和用户任务,最后启动调度和运行用户程序。

一、简介
内核启动介绍了整个系统从硬件上电如何一步步进入用户程序的过程。一般情况下,启动过程分为硬件上电,首先运行和体系架构相关的启动汇编文件,进行一些最基本硬件的初始化 (例如 CPU 配置,时钟,栈地址,RAM 等),为内核运行铺垫好环境,然后初始化内核各模块 (例如调度器,定时器等),接着创建系统任务 (例如空闲任务) 和用户任务,最后启动调度和运行用户程序。

二、自动初始化
自动初始化是指初始化函数不需要被显式调用。

隐式调用(静态调用):将动态链接库和其它源程序文件(或者目标文件)一起参与链接;在介绍内核启动之前,有必要介绍自动初始化的实现机制。

在介绍内核启动之前,有必要介绍自动初始化的实现机制。

显式调用(动态调用):手动调用动态链接库中包含的资源,同时用完后要手动将资源释放。自动初始化的实现是利用编译器的段和段排序的特性,以 GCC 编译器为例具体如下:

在介绍内核启动之前,有必要介绍自动初始化的实现机制。

自动初始化的实现是利用编译器的段和段排序的特性,以 GCC 编译器为例具体如下:

1、通过 GCC 的关键字attribute((section (x))),可以把定义的符号(函数地址或变量地址)放到段名为 x 的段中,段名 x 由用户指定。在自动初始化应用中,段名都包含.init_call 字符串,若采用通配符的表示方法,段名为.init_call,表示任何一串其它一串字符串;

2、在 GCC 的链接脚本中,关键字 KEEP ((SORT (.init_call))) 可以对段名符合.init_call * 形式的段进行排序;

3、若把自动初始化函数的符号(即函数地址)放到符合.init_call * 形式的段中,就可以间接实现函数符号排序,从而可以提供有顺序的执行自动初始化函数的方法。

自动初始化通过宏定义提供了注册初始化函数的接口,接口如下:

提供了段结构的宏定义,根据初始化优先级的不同,有如下宏定义:

编译之后,初始化宏对应的段结构如下:

三、内核启动流程
下图展示了整个系统启动过程和内核启动过程,本节主要介绍内核启动部分。

可见,内核启动主要有下面几个

步骤:

1、系统先从启动文件开始运行,然后进入 OneOS 的内核启动函数 os_kernel_init () 和 os_kernel_start ()

2、os_kernel_init 中调用_k_run_init_call 函数执行 OS_INIT_LEVEL_PRE_KERNEL_1,进行内核启动前的第一阶段的初始化

3、初始化内核各模块,如 tick 队列,调度器,定时器等

4、创建 recycle,idle,timer,sys 系统任务

5、启动调度器,最后会运行 sys 任务,sys 任务调用_k_run_init_call 函数依次执行其他自动化宏注册的函数,最后调用 main 函数进入用户程序入口

相关文章
|
19天前
|
安全 调度 开发者
探索操作系统的心脏:现代内核架构与挑战
【10月更文挑战第7天】 本文深入探讨了现代操作系统内核的复杂性和功能性,从微观角度剖析了内核在系统运行中的核心作用及其面临的主要技术挑战。通过浅显易懂的语言解释专业概念,旨在为读者提供一个关于操作系统内核的全面视角。
27 2
|
6天前
|
安全 Linux 编译器
探索Linux内核的奥秘:从零构建操作系统####
本文旨在通过深入浅出的方式,带领读者踏上一段从零开始构建简化版Linux操作系统的旅程。我们将避开复杂的技术细节,以通俗易懂的语言,逐步揭开Linux内核的神秘面纱,探讨其工作原理、核心组件及如何通过实践加深理解。这既是一次对操作系统原理的深刻洞察,也是一场激发创新思维与实践能力的冒险。 ####
|
2天前
|
存储 Linux 调度
探索操作系统的心脏:内核设计与实现
【10月更文挑战第23天】在这篇文章中,我们将深入探讨现代操作系统的核心—内核。通过浅显易懂的语言和实例,本文旨在揭示操作系统内核的设计哲学、关键组件以及它们如何协同工作以支持复杂的系统功能。无论你是初学者还是有一定基础的开发者,本篇文章将为你打开一扇了解操作系统深层工作原理的大门。
18 8
|
1天前
|
安全 数据安全/隐私保护
探索操作系统的心脏:内核
【10月更文挑战第25天】操作系统是现代计算的核心,而内核则是这个核心中的心脏。本文将深入浅出地探讨内核的设计、功能以及它如何管理计算机资源。我们将通过简单的比喻和实例来理解复杂的技术概念,使读者能够在轻松的氛围中掌握这一主题。
|
1天前
|
存储 调度
探索操作系统的心脏:内核
【10月更文挑战第25天】在数字世界的每一次跳动中,都有一个不可见却至关重要的部分在默默工作——操作系统的内核。它是计算机系统的指挥中心,管理着硬件资源,协调着软件运行。本文将揭开内核的神秘面纱,带你领略其精妙的设计和复杂的功能。从进程管理到内存分配,再到文件系统,我们将一探究竟,看看这个让计算机活起来的“心脏”是如何跳动的。
|
1天前
|
算法 调度
探索操作系统的心脏:内核与进程管理
【10月更文挑战第25天】在数字世界的复杂迷宫中,操作系统扮演着关键角色,如同人体中的心脏,维持着整个系统的生命力。本文将深入浅出地剖析操作系统的核心组件——内核,以及它如何通过进程管理来协调资源的分配和使用。我们将从内核的概念出发,探讨它在操作系统中的地位和作用,进而深入了解进程管理的机制,包括进程调度、状态转换和同步。此外,文章还将展示一些简单的代码示例,帮助读者更好地理解这些抽象概念。让我们一起跟随这篇文章,揭开操作系统神秘的面纱,理解它如何支撑起我们日常的数字生活。
|
3天前
|
安全 物联网 Linux
操作系统的心脏——内核
【10月更文挑战第22天】 本文将深入探讨操作系统的核心组成部分——内核,包括其定义、功能、类型以及在现代计算中的重要性。通过了解内核的工作原理和设计哲学,我们可以更好地理解计算机是如何执行任务和管理资源的。
18 2
|
9天前
|
网络协议 Linux 调度
深入探索Linux操作系统的心脏:内核与系统调用####
本文旨在揭开Linux操作系统中最为核心的部分——内核与系统调用的神秘面纱,通过生动形象的语言和比喻,让读者仿佛踏上了一段奇妙的旅程,从宏观到微观,逐步深入了解这两个关键组件如何协同工作,支撑起整个操作系统的运行。不同于传统的技术解析,本文将以故事化的方式,带领读者领略Linux内核的精妙设计与系统调用的魅力所在,即便是对技术细节不甚了解的读者也能轻松享受这次知识之旅。 ####
|
5天前
|
缓存 算法 安全
深入理解Linux操作系统的心脏:内核与系统调用####
【10月更文挑战第20天】 本文将带你探索Linux操作系统的核心——其强大的内核和高效的系统调用机制。通过深入浅出的解释,我们将揭示这些技术是如何协同工作以支撑起整个系统的运行,同时也会触及一些常见的误解和背后的哲学思想。无论你是开发者、系统管理员还是普通用户,了解这些基础知识都将有助于你更好地利用Linux的强大功能。 ####
13 1
|
10天前
|
存储 资源调度 算法
操作系统的心脏:深入理解内核架构与机制####
【10月更文挑战第16天】 本文旨在揭开操作系统最神秘的面纱——内核,通过剖析其架构设计与关键机制,引领读者一窥究竟。在这篇探索之旅中,我们将深入浅出地讨论内核的基本构成、进程管理的智慧、内存分配的策略,以及那至关重要的系统调用接口,揭示它们是如何协同工作,支撑起现代计算机系统的高效运行。这既是一次技术的深潜,也是对“看不见的手”调控数字世界的深刻理解。 ####
27 3