笔记整理—内核!启动!—kernel部分(2)从汇编阶段到start_kernel

2024-09-09 03:52

本文主要是介绍笔记整理—内核!启动!—kernel部分(2)从汇编阶段到start_kernel,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

        kernel起始与ENTRY(stext),和uboot一样,都是从汇编阶段开始的,因为对于kernel而言,还没进行栈的维护,所以无法使用c语言。_HEAD定义了后面代码属于段名为.head .text的段。

        内核起始部分代码被解压代码调用,前面关于uboot的文章中有提到过(eg:zImage)。uboot启动是无条件的,只要代码的位置对,上电就工作,kernel启动由bootloader进行构建。

        ARM体系中,传参用寄存器进行传递其他的方法还有栈传递。

        uboot在最后的the kernel(0,machid,bd->bi_params)传参三个放在寄存器里面,是kernel的启动条件之一。

        由于MMU的关闭,现在处于无页表状态,所以内核前期处于无页表状态,也就是位置无关码。zImage不可以分开加载,但内核必须使用虚拟地址,所以在虚拟地址未开启前,必须使用位置无关码,且操作的是物理地址。__pa()宏是对虚拟地址转物理地址的方法。

        cp15寄存器存放了cpu信息,__error_p是启动失败的标志,每个内核支持有限个CPU,与cp15进行对照。

        __vet_atags:校验uboot给内核传参格式是否正确(memtag,bootargs)。

        __create_page_tables:建立页表。kernel先是建立一个段式页表与uboot建立的页表相似,1M为单位建立的页表,能用但很浪费,所以是临时页表。kernel之后会建立一个以4k为单位的细页表并启用同时废弃这个粗页表。

        __switch_data,建立段页表后,建立这个数组包含一些地址与id号,本章是一个函数指针数组。

        __mmap_swich:复制数据段,清bss段,构建c运行环境,保存有用的变量(cpu_id,机器码,tag传参首地址)。

        b        start_kernel:标志进入c语言运行阶段,汇编结束。因为uboot已经为了启动做了一些事情,所以汇编阶段要比uboot汇编干的活少。

        smp:对称多处理器,同样式多核cpu。

        

        printk,用于在console打印信息,内核编程无法使用标准库函数,所以有了printk函数用于内核打印。printk支持多种打印级别(1~7)从sys(系统级到debug级)。

        printk的打印级别是针对信息进行筛选,无效信息就不打印了。

       0~7级:

        而且linux的控制台也是会根据信息级别进行信息输出的,两相组合就是信息输出过滤机制。

         内核信息打印为:内核启动信息[打印时间]xxx内容。

        在linux中使用grep “xxxx” * -nr 进行内容查找。

        decompress_kernel():解压内核。

        set_arch()架构创建(初始化)。确定当前内核架构,cpu+开发板以确认硬件平台,通过配置使代码在这个平台上运行。

        set_processor:用于查找cpu信息。

        look_machine_type,封装了__lookup_machine_type将描述符链接在一起。

        cmdline指uboot给内核传递的启动参数。

        default_command_line默认命令行,其是一个全局变量。

        CONFIG_CMDLINE:在config定义可在make menuconfig中进行更改,表示一个默认命令行参数。

        内核给自己维护了一个CONFIG_CMDLINE,uboot也给内核传递了一个cmdline。

        内核将优先使用uboot的cmdline,如果没有传这个参数或者传递信息错误,内核将会使用默认的cmdline,这个过程在setup_arch运用。

        parse_early_param和parse_args:用于解析cmdline传参与别的参数,将信息解析为字符串数组。

        rest_init()进行剩余的初始化,与uboot干的事相似。

        总结:start_kernel打印基础信息,内核工作初始化(内存,调度,异常处理),一些模块已经硬件的初始化。

        setup_arch函数:机器码查找,执行后进行cpu相关的初始化与uboot内核传参处理。

        rest_init中调用kernel_thread()启动两个内核线程(1.kernel_init。2.kthreadd)。

        那么什么是线程,这两个线程又干了什么,我们下章再见。

这篇关于笔记整理—内核!启动!—kernel部分(2)从汇编阶段到start_kernel的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1150088

相关文章

SpringBoot通过main方法启动web项目实践

《SpringBoot通过main方法启动web项目实践》SpringBoot通过SpringApplication.run()启动Web项目,自动推断应用类型,加载初始化器与监听器,配置Spring... 目录1. 启动入口:SpringApplication.run()2. SpringApplicat

解决Nginx启动报错Job for nginx.service failed because the control process exited with error code问题

《解决Nginx启动报错Jobfornginx.servicefailedbecausethecontrolprocessexitedwitherrorcode问题》Nginx启... 目录一、报错如下二、解决原因三、解决方式总结一、报错如下Job for nginx.service failed bec

Python学习笔记之getattr和hasattr用法示例详解

《Python学习笔记之getattr和hasattr用法示例详解》在Python中,hasattr()、getattr()和setattr()是一组内置函数,用于对对象的属性进行操作和查询,这篇文章... 目录1.getattr用法详解1.1 基本作用1.2 示例1.3 原理2.hasattr用法详解2.

MyBatis的xml中字符串类型判空与非字符串类型判空处理方式(最新整理)

《MyBatis的xml中字符串类型判空与非字符串类型判空处理方式(最新整理)》本文给大家介绍MyBatis的xml中字符串类型判空与非字符串类型判空处理方式,本文给大家介绍的非常详细,对大家的学习或... 目录完整 Hutool 写法版本对比优化为什么status变成Long?为什么 price 没事?怎

Spring Boot项目如何使用外部application.yml配置文件启动JAR包

《SpringBoot项目如何使用外部application.yml配置文件启动JAR包》文章介绍了SpringBoot项目通过指定外部application.yml配置文件启动JAR包的方法,包括... 目录Spring Boot项目中使用外部application.yml配置文件启动JAR包一、基本原理

解决若依微服务框架启动报错的问题

《解决若依微服务框架启动报错的问题》Invalidboundstatement错误通常由MyBatis映射文件未正确加载或Nacos配置未读取导致,需检查XML的namespace与方法ID是否匹配,... 目录ruoyi-system模块报错报错详情nacos文件目录总结ruoyi-systnGLNYpe

解决hive启动时java.net.ConnectException:拒绝连接的问题

《解决hive启动时java.net.ConnectException:拒绝连接的问题》Hadoop集群连接被拒,需检查集群是否启动、关闭防火墙/SELinux、确认安全模式退出,若问题仍存,查看日志... 目录错误发生原因解决方式1.关闭防火墙2.关闭selinux3.启动集群4.检查集群是否正常启动5.

Python按照24个实用大方向精选的上千种工具库汇总整理

《Python按照24个实用大方向精选的上千种工具库汇总整理》本文整理了Python生态中近千个库,涵盖数据处理、图像处理、网络开发、Web框架、人工智能、科学计算、GUI工具、测试框架、环境管理等多... 目录1、数据处理文本处理特殊文本处理html/XML 解析文件处理配置文件处理文档相关日志管理日期和

Python38个游戏开发库整理汇总

《Python38个游戏开发库整理汇总》文章介绍了多种Python游戏开发库,涵盖2D/3D游戏开发、多人游戏框架及视觉小说引擎,适合不同需求的开发者入门,强调跨平台支持与易用性,并鼓励读者交流反馈以... 目录PyGameCocos2dPySoyPyOgrepygletPanda3DBlenderFife

Springboot项目启动失败提示找不到dao类的解决

《Springboot项目启动失败提示找不到dao类的解决》SpringBoot启动失败,因ProductServiceImpl未正确注入ProductDao,原因:Dao未注册为Bean,解决:在启... 目录错误描述原因解决方法总结***************************APPLICA编