【学习笔记】小O带你掌握操作系统的心跳-OneOS内核启动
一、简介
内核启动介绍了整个系统从硬件上电如何一步步进入用户程序的过程。一般情况下,启动过程分为硬件上电,首先运行和体系架构相关的启动汇编文件,进行一些最基本硬件的初始化(例如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函数进入用户程序入口

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Enhancer-轻量化的字节码增强组件包
一、问题描述 当我们的业务发展到一定阶段的时候,系统的复杂度往往会非常高,不再是一个简单的单体应用所能够承载的,随之而来的是系统架构的不断升级与演变。一般对于大型的To C的互联网企业来说,整个系统都是构建于微服务的架构之上,原因是To C的业务有着天生的微服务化的诉求:需求迭代快、业务系统多、领域划分多、链路调用关系复杂、容忍延迟低、故障传播快。微服务化之后带来的问题也很明显:服务的管理复杂、链路的梳理复杂、系统故障会在整个链路中迅速传播。 这里我们不讨论链路的依赖或服务的管理等问题,本次要解决的问题是怎么防止单个系统故障影响整个系统。这是一个复杂的问题,因为服务的传播特性,一个服务出现故障,其他依赖或被依赖的服务都会受到影响。为了找到解决问题的办法,我们试着通过5why提问法来找答案。 PS:这里说的系统故障,是特指由于慢调用、慢查询等影响系统性能而导致的系统故障。 Q1 怎么防止单个系统故障影响整个系统? A:避免耽搁系统的故障的传播。 Q2 怎么避免故障的传播? A:找到系统故障的原因,解决故障。 Q3 怎么找到故障的原因? A:找到并优化系统中耗时长的方法。 Q4 怎么找到系...
- 下一篇
见微知著:从企业售后技术支持看云计算发展
售后业务中的细微变化 作为阿里云企业容器技术支持的一员,每天会面对全球各地企业级客户提出的关于容器的各种问题,通过这几年的技术支持的经历,逐步发现容器问题客户的一些惯性,哪些是重度用户,哪些是轻度客户,这些客户大概分布在什么行业等等。 在渐渐地接触过程中,发现有些重度容器使用客户,所提出的问题场景也在逐步变化中,由于涉及法律法规,下面数据无法完整提供,只是提供相关简要说明。 纵向维度 从去年底开始,关于边缘集群的工单数量逐渐开始上升,增长幅度较大。其中涉及问题的边缘集群,超过一半左右来的客户集群规模比较大,集群节点规模数量级在几百个节点,甚至几千个节点规模。 横向维度 客户一: 该用户是目前是国内 ToC 端个性化推荐服务提供商之一,该客户在今年才开始使用 容器服务 Edge 版 ACK Edge 产品,到目前为止边缘集群的节点数已经快速破百。 客户二: 该用户是目前是国内电动汽车行业先驱者,并且一直处于新能源热门话题榜中,该客户第一次使用容器服务 Edge 版 ACK Edge 产品,到目前为止,边缘集群的节点数已经破千,占该客户所有容器集群节点数的近一半。 客户三: 该用户是全球著...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Red5直播服务器,属于Java语言的直播服务器
- CentOS7设置SWAP分区,小内存服务器的救世主
- CentOS7安装Docker,走上虚拟化容器引擎之路
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- CentOS关闭SELinux安全模块
- CentOS7,CentOS8安装Elasticsearch6.8.6
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- Linux系统CentOS6、CentOS7手动修改IP地址
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16