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

news2025/5/15 23:49:40

        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)。

        屌用schedule开启内核调度系统,证明linux开始运行。rest_init最终调用cpu_idle将结束整个内核的启动阶段,内核结束于此,但为了让内核不会跑飞,所以内核cpu_idle while(1)。

        while(1):有事情干——>干活——>进程。没事情干——>空跑——>这也是一个进程(空闲进程)。有没有事情看,主要看调度系统,调度系统会对进程进行考评。

        什么是内核线程,首先要分清什么是进程,什么是线程。进程:一个在运行的程序是一个进行,一个独立的程序可被内核单独调用执行(运行/挂起)。线程:与进程相似,也是一个独立的个体,但是一个进程能够包含多个线程。

        kernel_thead运行一个函数,起始就是创建了一个内核线程,运行、被内核调度,完成调度与注册。

        目前为止,一共涉及到3个内核进行/线程:1.kernel_init。2.kthread。3.cpu_idel。操作系统以数字进行表示进程0、1、2,构成了进程号,其从0开始进行分配。PS:进程0不是用户进程。

        进程0:idle 是空进程(while(1);)不会终止,内核进程,用户一般不可见。

        进程1:kernel_init称为init进程。

        进程2:kthreadd内核守护进程,维护内核运转,保证内核所需。

        三个进程保证内核稳定,支持调度。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2129150.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

labview串口大数据量报错的一种解决思路(通过tcp进行写入和读取串口数据)

因为项目要求,用labview给客户开发了一个上位机,在现场给客户调试上位机时,发现了几种奇怪的现象 1:客户样件有两路串口,一路串口可以多字节进行发送数据,一路只能单字节发送数据,每次单字节数据…

k8s--pod控制器--1

Pod控制器介绍 Pod是kubernetes的最小管理单元,在kubernetes中,按照pod的创建方式可以将其分为两类: 自主式pod:kubernetes直接创建出来的Pod,这种pod删除后就没有了,也不会重建 控制器创建的pod&#xf…

Vue: 创建vue项目

目录 一.创建项目 二.项目添加 三.添加成功 一.创建项目 打开本机终端输入npm create vuelatest 二.项目添加 1. 项目名称: Project name: one_vue 2.是否添加TypeScript支持:Add TypeScript? Yes 3.是否添加JSX支持:Add JSX Suppor…

基于SpringBoot的点餐平台网站

你好呀,我是计算机学姐码农小野!如果有相关需求,可以私信联系我。 开发语言:Java 数据库:MySQL 技术:SpringBoot框架,Java技术 工具:IDEA/Eclipse、Navicat、Maven、Tomcat 系统…

【JAVA入门】Day41 - 字节缓冲流和字符缓冲流

【JAVA入门】Day41 - 字节缓冲流和字符缓冲流 文章目录 【JAVA入门】Day41 - 字节缓冲流和字符缓冲流一、缓冲流的体系结构二、字节缓冲流2.1 字节缓冲流提高效率的底层原理 三、字符缓冲流 在IO流体系中,FileInputStream,FileOutputStream,F…

Java企业面试题2

1.语言的分代: 第1代:机器语言 机器语言是最底层的计算机编程语言,它是由二进制数构成的一系列指令,直接与计算机硬件交互。每个二进制位模式代表一条特定的指令或数据地址。因为它是直接在硬件上执行的,所以运行效率…

如何增加Google收录量?

想增加Google收录量,首先自然是你的页面数量就要多,但这些页面的内容也绝对不能敷衍,你的网站都没多少页面,谷歌哪怕想收录都没办法,当然,这是一个过程,持续缓慢的增加页面,增加网站…

如何使用ArcGIS Pro绘制三维地图

如何使用ArcGIS Pro将栅格数据用三维的形式进行表达?在ArcGIS里可以使用ArcScene来实现,ArcGIS Pro实现原理跟ArcScene一致。由于Esri未来将不再对ArcGIS更新,所以可以尽快把ArcGIS Pro熟悉起来了~ 下面介绍一下如何将栅格数据以三维形式展示…

《澳门新攻略》诚意收官 澳门文旅综艺缔造新高度

日前刚刚收官的芒果TV综艺《澳门新攻略》,开辟新的视角将节目重点聚焦在了澳门北区的社区美食上。把应接不暇的美食美景和最本土的人文融合在一起,带火了澳门当地旅游业又一黑马行程——澳门深度社区游。随着线上综艺有趣、保姆级打卡攻略的呈现&#xf…

【C++】——vector

文章目录 vector介绍vector的使用vector的构造vector迭代器vector空间增减vector增删查改 vector介绍 vector是一个动态数组,可以根据需求变大变小vector支持随机访问vector会自动管理内存分配和释放vector在尾部添加和删除的效率非常高,中间和头部插入较…

reader-lm:小模型 html转markdown

参考: https://huggingface.co/jinaai/reader-lm-0.5b 在线demo: https://colab.research.google.com/drive/1wXWyj5hOxEHY6WeHbOwEzYAC0WB1I5uA#scrollTo0mG9ISzHOuKK 输入网址:https://www.galaxy-geely.com/E5 结果: 代码…

搭建ipv6并发代理池

声明 本文章中所有内容仅供学习交流,抓包内容、敏感网址、数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除! 学习目标 ipv6代理池学习…

UI自动化测试痛点解决方案

前言 UI自动化测试可以快速、准确地执行大量的测试用例,减少人工测试所需的时间和劳动力。能够在短时间内完成多个测试用例的执行,提高测试的效率和速度。但是UI自动化有个最大的痛点。当前端界面发生变化时,往往页面元素定位也会改变&#…

ultralytics实现DeepSort之级联匹配

前面博客中说过,通过Market-1501数据集的训练后可以得到特征提取模型,这个模型最终的输出值为(bs,num_class),但在DeepSort算法应用中的输出结果并非如此,其输出的是特征信息。 特征提取 通过训练后的特征…

通信工程学习:什么是PDF策略决策功能

PDF策略决策功能 PDF策略决策功能(Policy Decision Function, PDF)在通信网络中,特别是在IP多媒体子系统(IMS)中,扮演着至关重要的角色。以下是对PDF策略决策功能的详细解释: 一、定义与功能概…

C语言——课设万能模板、实战项目——学生信息管理系统

本人无偿奉献学生管理系统的所有代码,包括.h头文件和.c文件,要源码私信,或者评论,希望点个关注。可以完整运行。 介绍一下这个系统,该系统包括八个功能: printf("1.录入学生信息\n"); print…

软考中级软件设计师-【计算机系统】必考题汇总

🤹‍♀️潜意识起点:个人主页 🎙座右铭:得之坦然,失之淡然。 💎擅长领域:前端 是的,我需要您的: 🧡点赞❤️关注💙收藏💛 是我持…

中原地产:人力资源数字化创新实践分享

近日,法大大与人力资源智享会(以下简称“智享会”)联合发布了《第七届人力资源共享服务中心研究报告》(点击阅读及下载:最新!《第七届人力资源共享服务中心研究报告》重磅来袭),该报…

2024【华为战报】8月HCIP考试战报!

了解更多往期考试→点 【考试战报】 华为认证 HCIP 8月 微思 | HCIP 考试战报 HCIP 最新开班 厦门面授 全国直播 每月循环开班 点击查看【华为认证 HCIP】 END 微思网络,始于2002年 专业IT认证培训22年,面向全国招生! 微思-主要课程有&a…

【App】

1. 移动App的开发模式 原生开发 - 原生App > Android、IOS、Windows混合开发 - 混合App > React Native、Weex、Flutter React Native 是基于 React 语法开发的一个混合开发框架Weex 是基于 Vue 语法开发的一个混合开发框架Flutter 是 Google 推出来的一款混合开发框架比…