笔记整理—内核!启动!—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

相关文章

MySQL数据库宕机,启动不起来,教你一招搞定!

作者介绍:老苏,10余年DBA工作运维经验,擅长Oracle、MySQL、PG、Mongodb数据库运维(如安装迁移,性能优化、故障应急处理等)公众号:老苏畅谈运维欢迎关注本人公众号,更多精彩与您分享。 MySQL数据库宕机,数据页损坏问题,启动不起来,该如何排查和解决,本文将为你说明具体的排查过程。 查看MySQL error日志 查看 MySQL error日志,排查哪个表(表空间

springboot3打包成war包,用tomcat8启动

1、在pom中,将打包类型改为war <packaging>war</packaging> 2、pom中排除SpringBoot内置的Tomcat容器并添加Tomcat依赖,用于编译和测试,         *依赖时一定设置 scope 为 provided (相当于 tomcat 依赖只在本地运行和测试的时候有效,         打包的时候会排除这个依赖)<scope>provided

内核启动时减少log的方式

内核引导选项 内核引导选项大体上可以分为两类:一类与设备无关、另一类与设备有关。与设备有关的引导选项多如牛毛,需要你自己阅读内核中的相应驱动程序源码以获取其能够接受的引导选项。比如,如果你想知道可以向 AHA1542 SCSI 驱动程序传递哪些引导选项,那么就查看 drivers/scsi/aha1542.c 文件,一般在前面 100 行注释里就可以找到所接受的引导选项说明。大多数选项是通过"_

数论入门整理(updating)

一、gcd lcm 基础中的基础,一般用来处理计算第一步什么的,分数化简之类。 LL gcd(LL a, LL b) { return b ? gcd(b, a % b) : a; } <pre name="code" class="cpp">LL lcm(LL a, LL b){LL c = gcd(a, b);return a / c * b;} 例题:

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

用命令行的方式启动.netcore webapi

用命令行的方式启动.netcore web项目 进入指定的项目文件夹,比如我发布后的代码放在下面文件夹中 在此地址栏中输入“cmd”,打开命令提示符,进入到发布代码目录 命令行启动.netcore项目的命令为:  dotnet 项目启动文件.dll --urls="http://*:对外端口" --ip="本机ip" --port=项目内部端口 例: dotnet Imagine.M

Linux_kernel驱动开发11

一、改回nfs方式挂载根文件系统         在产品将要上线之前,需要制作不同类型格式的根文件系统         在产品研发阶段,我们还是需要使用nfs的方式挂载根文件系统         优点:可以直接在上位机中修改文件系统内容,延长EMMC的寿命         【1】重启上位机nfs服务         sudo service nfs-kernel-server resta

poj 2976 分数规划二分贪心(部分对总体的贡献度) poj 3111

poj 2976: 题意: 在n场考试中,每场考试共有b题,答对的题目有a题。 允许去掉k场考试,求能达到的最高正确率是多少。 解析: 假设已知准确率为x,则每场考试对于准确率的贡献值为: a - b * x,将贡献值大的排序排在前面舍弃掉后k个。 然后二分x就行了。 代码: #include <iostream>#include <cstdio>#incl