【windows kernel源码分析】对初学者友好的底层理解,让你对计算机内核不再迷茫

news/2024/3/29 14:03:00/文章来源:https://blog.csdn.net/weixin_43796670/article/details/127254280

文章目录

  • 🍃概念梳理
    • windows kernel
    • 引导加载程序完成后的RAM内容
  • 🍑实现过程--还是看原文吧= =
  • 🌸参考原文链接

对市面上的文章再做一次整合。给渴望得到内核知识的人提供一些帮助。


🍃博主昵称:一拳必胜客
博主主页面链接:博主主页传送门
博主专栏页面连接:专栏传送门–计算机考研
🍑创作初心:本博客的初心是每天分享记录自己学习的脚步,和各位技术友探讨交流,同时给同样感兴趣的朋友以参考;
博主研究方向:渗透测试、嵌入式、机器学习;
🌸博主寄语:感谢各位技术友的支持,您的支持就是我前进的动力 ;
‘’
 特别鸣谢:木芯工作室
特别鸣谢:木芯工作室 、Ivan from Russia


为什么会写这样一篇“无效水文”,我想是由于我的这样一种强迫症,对于任何的学习,在不理解原理,无法把他与我的已知知识架构产生联系的时候,我会本能地拒绝这种知识,所以由于这种偏执,很多情况下拖慢了自己的进度,因为很多时候无法有效收集到有用的资料,软件实训的时候,老师只会丢给一个配置文件,然后在此基础上做一些修改开发,可以除了可以勉强做一个垃圾出来,没有任何意义。就连再去做一个垃圾的能力都没有。这种情况直到毕业我才感觉无法再继续这样的生活了,于是开始大量学习,阅读专业书籍。这次就想对这些原本困扰我的东西进行一次小的抛砖引玉式的总结,当然也是把别人已经写过的一些文章综合一下,让入门的人对此好奇的人产生初步印象。 总之,人生没有白走的路。五年之前你正在梦想你今天的生活。 还有,当我们在经历冬季的时候,新西兰正被春风吹拂。所以做自己认为对的事情吧。

🍃概念梳理

windows kernel

原文

翻译:RobotCode俱乐部

如果你熟悉类似C的语法,那么源代码是非常易读的,即使你错过了一些细节,你也能大致了解正在发生的事情。主要的障碍是缺少对代码的上下文环境的了解,比如它什么时候运行,为什么运行,或者机器的底层特性。这里我希望提供一些背景知识

Intel x86引导的故事中,此时处理器是在实模式下运行的,能够处理1 MB的内存,RAM对于现代Linux系统是这样的:

在这里插入图片描述

引导加载程序完成后的RAM内容

内核镜像已经由BIOS中的引导加载程序中的I/O服务加载到内存中。此镜像是包含内核文件的副本,例如/boot/vmlinuz-2.6.22-14-server。镜像被分成两部分:一小部分包含实模式内核代码,加载在640K以下;内核的大部分在保护模式下运行,加载在第一个兆字节内存之后。

该操作从上面所示的实模式内核头部开始。这个内存区域用于在 引导加载程序 和 内核 之间实现Linux引导协议。其中一些值是引导加载程序在执行其工作时读取的。比如包含内核版本的可读字符串,也包含其他重要信息,比如实模式内核块的大小。引导加载程序还将值写入该区域,例如用户在引导菜单中给出的命令行参数的内存地址。引导加载程序完成后,它已经填充了内核头部所需的所有参数。现在是跳到内核入口点的时候了。下图显示了内核初始化的程序流程,以及源目录、文件和行号:


🍑实现过程–还是看原文吧= =

一、内核初始化
1.1 系统启动过程简介
对于系统启动过程,已经有太多的资料介绍过了。这里只是稍作温习,为介绍后续内容做准备。这部分的内容参考了http://www.yesky.com/317/1711317.shtml。
系统的启动过程一般分为5个步骤:
(1)预引导过程
[1] 计算机加电自检,同时完成硬件设备的枚举和配置。
[2] BIOS确定引导设备位置,加载引导设备的MBR。
[3] 在MBR中扫描分区表,定位活动分区,并加载活动分区上引导扇区到内存
[4] 加载系统根目录的ntldr。
(2)引导过程
[5] 初始化Ntldr,完成处理器模式切换和文件系统驱动的加载,如果使用SCSI设备,
Ntldr将Ntbootdd.sys加载到内存。
[6] Ntldr读取系统根目录的boot.ini
,在屏幕显示系统启动菜单,等待用户选择所需要加载的操作系统。
[7] Ntldr读取并运行程序Ntdetect.com,完成硬件的检测。
[8] Ntldr根据用户的选择调用系统的硬件配置文件。
(3)内核加载,在[8]后清除屏幕,显示进度条。
[9] 加载执行体ntoskrnl.exe
[10] 加载Hal.dll
[11] 加载%systemroot\System32\Config\System下的注册表项HKEY_LOCAL_MACHINE
SYSTEM。
[12] 选择加载控制集,初始化计算机。
[13] 根据控制集加载低级硬件设备驱动程序。
(4)内核初始化,显示图形界面。
[14] 内核会使用检测到的硬件数据,在注册表中创建HKEY_LOCAL_MACHINE\HARDWA项。
[15] 其次的工作是内核通过复制HKEY_LOCAL_MACHINE\SYSTEM\Select子键Current
项引用的控制集创建Clone控制集。
[16] 内核开始进一步加载和初始化设备驱动程序。
[17] Session Manager(Smss.exe)按顺序启动Windows 2000
更高一层次的子系统和各项服务。
(5)系统登陆过程
[18] 系统首先启动Winlogon.exe。
[19] 启动Local Security Authority(Lsass.exe)
[20] 屏幕显示出登陆对话框。
[21] 系统执行Service Controller(Screg.exe)再次扫描注册表HKEY_LOCAL_MACHINE
SYSTEM\CurrentControlSet\Control项并自动加载其中系统的或用户的服务。
[22] 此时,用户已成功的登陆到了Windows 2000系统,系统随后把Clone控制集拷贝到
LastKnownGood控制集。

1.2 内核初始化
本文所要介绍的重点是ntoskrnl的初始化流程。这个初始化过程大致分为两个阶段:phase0和phase1。对于具体所处的阶段是由一 个全局变量InitializationPhase来标识,当InitializationPhase为0时表示处于phase0,当 InitializationPhase为1时表示处于phase1。
Ntoskrnl在入口函数中调用KiSystemStartup,而KiSystemStartup又依次为每个CPU调用 HalInitializeProcessor和KiInitializeKernel。如果KiInitializeKernel运行在引导CPU上, 则会调用KiInitSystem执行系统范围全局的内核初始化。然后KiInitializeKernel调用 ExpInitializeExecutive函数,负责实现phase0阶段的初始化工作。
(注:引导CPU,即0号CPU,每个CPU都以整数标识,0号CPU是第一个被初始化的CPU。当初始化第1个CPU时需要进行额外的操作,因而称之为引导CPU)
在phase0阶段的初始化过程中首先调用HalInitSystem初始化HAL,然后依次初始化内存管理器、对象管理器、安全引用监视器、进 程管理器和即插即用管理器。其中在调用PsInitSystem执行进程管理器在phase0阶段初始化时,创建了一个新的系统线程即为 Phase1Initialization,用于执行phase1阶段的初始化。由于此时并不允许中断,Phase1Initialization线程并 不立即执行。当完成phase0阶段初始化并返回到KiInitializeKernel时,设置IRQL到DISPATCH_LEVEL并使CPU调度 Phase1Initialization线程,从而进行phase1阶段的初始化。

关于内核初始化流程可以用下图表示,从上到下表示时间顺序:

图示说明:
[1] 关于KiInitializeKernel的具体实现参见2.1小节。
[2] 关于KiInitSystem的具体实现参见2.2小节
[3] 关于phase0阶段ExpInitializeExecutive的具体实现参见2.3小节。
[4] 关于phase0阶段进程管理器初始化(PsInitSystem)的具体实现参见2.4小节。
[5] 关于Phase1Initialization线程实现phase1阶段初始化的具体过程参见2.5小节。


🌸参考原文链接

windows内核编程 谭文_内核启动过程分析

Windows内核源码分析 1.初始化内核与执行体子系统

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

各种平均值:算术平均值,几何平均值,调和平均值等

平均值概述 平均数反映了一组数据的一般水平,最常见的平均数是算术平均数,除了算数平均数外,还有几何平均数,调和平均数,加权平均数等。 算术平均值(Arithmetic Mean) 公式解读:表…

list全部功能模拟实现

目录&#xff1a; list的深度剖析及模拟实现 list底层是双向循环链表 ------而实现list最重要的就是迭代器类的实现 下面我们会重点学习迭代器 list整体接口函数罗列 //模拟实现list底层---全部功能 namespace std {//结点类模拟实现template<class T>struct list_node…

java数据结构-------栈和队列

文章目录1、栈(Stack)1、什么是栈2、栈中常使用的方法3、栈的应用场景1、逆序打印链表2、有效的括号2、队列(Queue)1、什么是队列2、队列的使用3、循环队列目标&#xff1a;1、 栈的概念及使用&#xff0c;2、 队列的概念及使用&#xff0c;3.、相关OJ题1、栈(Stack) 1、什么是…

FISCO BCOS(十五)——— Windows下的go环境配置及beego环境配置并解决bee run报错问题

1、下载地址 https://golang.google.cn/dl/2、双击打开下载的文件&#xff0c;一路按照默认点击下一步&#xff0c;&#xff08;安装位置可选&#xff0c;默认安装在c盘&#xff09; 3、go环境配置&#xff08;很重要的&#xff09; 在系统变量名中新建变量名&#xff1a;GOP…

Java如何生成花里胡哨的二维码

目录一、序言二、找资料1、寻觅文档2、寻觅代码三、代码示例1、简单的二维码2、带颜色的二维码3、带logo的二维码四、工具类封装一、序言 之前在做头马演讲俱乐部哼哈官可视化汇报报告时&#xff0c;为了方便大家移动端查看可视化报告&#xff0c;而不是通过点击链接这种生硬的…

Android 面试java知识小结

1.-1的二进制是多少&#xff0c;怎么算出来的&#xff1f; 1111 1111 在计算机里是以补码的形式存在的&#xff0c;那为什么要使用补码呢&#xff1f; 计算机中的有符号数有三种表示方法&#xff0c;即原码、反码和补码。三种表示方法均有符号位和数值位两部分&#xff0c;符号…

如何使用界面控件DevExpress WinForms自带的UI模板?其实很简单

DevExpress WinForm拥有180组件和UI库&#xff0c;能为Windows Forms平台创建具有影响力的业务解决方案。DevExpress WinForms能完美构建流畅、美观且易于使用的应用程序&#xff0c;无论是Office风格的界面&#xff0c;还是分析处理大批量的业务数据&#xff0c;它都能轻松胜任…

科研工具总结

科研工具总结 1、论文检索网站2、自己收集数据集----并构建数据集2.1数据集来演方式:3种3、怎么进行一个算法的调研?泛读论文:精读论文:1、论文检索网站 Connected papers:一个基于知识图谱的论文检索网站 特点:圆圈的半径越大表示论文越经典,引用数量比较多; 论文的新…

python与人工智能:KNN近邻法识别手写数字

机器学习分类&#xff1f; 1 特征&#xff08;feature&#xff09; 数据是区分事物和事物的关键。 举例&#xff1a;不同类型的书&#xff0c;我们用书的内容来对它进行分类 2 标签&#xff08;label&#xff09; 数据的标签&#xff0c;显示的分类结果。 举例&#xff1a;书属…

每日面试题2道、算法两道

目录 一、 面试题 i、i的自增问题 写一个Singleton实例 二、数组 算法 寻找数组的中心索引 搜索插入位置 一、 面试题 i、i的自增问题 /*** packageName: com.sofwin.mianshi* user: wentao* date: 2022/10/10 14:31* email 1660420659qq.com* description: i、i的 面…

(附源码)计算机毕业设计SSM志愿者活动管理平台

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

pytorch:本地使用tensorboard可视化

摘要&#xff1a; tensorboard是tensorflow用来可视化训练和测试过程的模块&#xff0c;而pytorch并没有可视化模块&#xff0c;但是pytoch1.2.0版本以上开始支持tensorboard。 目录一、 安装tensorboard二、 使用tensorboard1、首先导入模块&#xff1a;2、初始化&#xff1a;…

深度神经网络怎么用

深度学习 对硬件的要求 之前热衷于学习理论知识&#xff0c;目前想跑代码了发现不知道从何下手&#xff0c;自己电脑上搭建的平台基本就是个摆设&#xff0c;因为跑不起来呀。今天我们就来看看想做深度学习应该怎么下手。 首先了解下基础知识&#xff1a;1、深度学习用cpu训练…

2.Jenkins项目创建

Jenkins项目创建1.新建项目 2.创建一个freestyle的项目 3.填写描述信息 4.可以选择丢弃旧的构建 每次构建都会产生一个任务&#xff0c;这个任务想保留多少天&#xff0c;可以设置保留构建的天数 保留最大的个数&#xff1a;例如设置为10个&#xff0c;当任务达到了10个之…

Spring Rest Docs使用

今天给大家分享一个能通过代码自动生成文档技术&#xff0c;Spring Rest Doc过在单元测试中额外添加 API 信息描述&#xff0c;从而自动生成对应的文档片段。 下面通过一个简单的例子演示下如何快速上手的。在Spring Boot项目中添加maven 依赖 <dependency><groupId&g…

Android 使用Jenkins 自动化多渠道打包并且分发到蒲公英、下发到钉钉通知【即拿即用】

前言 一、tomcat 安装启动 二、jenkins war 包下载并安装 三、jenkins 配置教程 四、jenkins items 工程配置 五、android gradle 脚本编码 六、分发到蒲公英脚本编码以及七、通知钉钉逻辑编码 前言 Android 在每个版本测试阶段&#xff0c;通常会因为修复BUG 去验证&#x…

理解vue中的.sync和.$emit

首先来说一下 .sync 修饰符的作用 第一步&#xff1a;先用一句话解释 .sync修饰符可以实现子组件与父组件的双向绑定&#xff0c;并且可以实现子组件同步修改父组件的值。 第二步&#xff1a;具体解释 一般情况下&#xff0c;想要实现父子组件间值的传递&#xff0c;通常使用…

英文论文要怎么查重?

英文论文查重和中文查重一样&#xff0c;只是在渠道选择方面会有些许差别。今天就具体聊聊英文论文怎么查重&#xff0c;并向大家推荐几个比较常用的英文论文查重工具。 英文论文怎么查重&#xff1a; 1、论文为什么要查重 2、论文查重的原理 3、英文论文怎么查重 4、选择…

柳州楼顶种植水稻 国稻种芯·中国水稻节:广西12万亩米飘香

柳州楼顶种植水稻 国稻种芯中国水稻节&#xff1a;广西12万亩米飘香 广西新闻网-南国今报柳江讯&#xff08;记者钟华 通讯员梁睿&#xff09;新闻中国采编网 中国新闻采编网 谋定研究中国智库网 中国农民丰收节国际贸易促进会 国稻种芯中国水稻节 中国三农智库网-功能性农业农…

RabbitMQ常用消息模式

目录 1、RabitMQ工作队列 2、交换机 3、RabbitMQ Fanout 发布订阅--- Fanout exchange(扇型交换机) 3.1、创建连接代码 3.1、生产者代码 3.2、消费者代码 4、Direct路由模式 4.1、生产者代码 4.2、消费者代码 5、Topic主题模式 5.1、生产者代码 5.2、消费者代码 1、…