Windows内核--读懂源代码的特殊“标志“(1.4)
Windows内核代码严谨而富有逻辑,毕竟Kernel不是简单的Hello World,为了让代码更易于阅读和维护,加入了不少具有编译器特性和协助程序员的代码,同时对于错误和异常,内核必须合适处理,保证稳定和安全。
似乎没有实际意义(对于生成二进制指令)的宏
编译器根据"__in/__out/OPTIONAL"的标志知道它代表输入/输出/可选参数。
程序员根据这些符号清晰地了解参数的特性,避免误用。
函数开始的"PAGED_CODE"
内核不像普通应用程序,不用太关心硬件和操作系统内部状态,OS本身就需要管理这些。抽象出了IRQ和IRQL, 支援分页内存,任何内核API都必须清晰地确认当前处于哪种中断级别。
PAGED_CODE宏就在判断当前代码是否可运行于可分页内存,否则,debug版本就会抛出异常发现问题。
Windows内核只有PASSIVE和APC使用分页内存 ,更高IRQL只能跑在非分页内存。
APC类似于Unix的Signal, DPC代表线程调度级别。
到处可见的"NT_SUCCESS"
内核把大于等于0定义为成功的返回值。
内核必须要处理任何Fail返回值以保证内核正确和安全。
创建Object失败:
从句柄找指针失败:
创建内存地址空间失败:
等等,数不胜数。
Windows定义了4种不同的NT Status, 用高位Bit简洁地用一个数值代表不同状态类型。
NT_SUCCESS (最高两个bit: 00)
NT_INFORMATION (最高两个bit: 01)
NT_WARNING (最高两个bit: 10)
NT_ERROR (最高两个bit: 11)
使用 NTSTATUS 值 - Windows drivers | Microsoft Learn
使用全局变量
比如进程工作集Min/Max变量。
经常写上层应用的可能会疑惑,全局变量不是不推荐的吗? 为什么Kernel还明目张胆地使用? 事实上,当你理解内核为何是内核时,就会懂得全局变量其实是内核的基本属性, 用全局变量来表达也许是唯一或最恰当的选项。
各式各样的"#pragma"宏
#pragma代表编译器指令,可以"指导"编译器做处理。
Pragma 指令与 __pragma 和 _Pragma 关键字 | Microsoft Learn (Pragma大全)
#pragma alloc_text(PAGE, ...)表示代码段加入到分页内存。
#pragma alloc_text(INIT, ...)表示初始化后就不需要了,可以移除。
#pragma data_seg("PAGEDATA")表示data放入分页内存。
data_seg pragma | Microsoft Learn
系统调用开始调用KeGetPreviousMode和Probe操作
一般来说,系统调用会接收用户模式的参数,内核当然默认不信任用户模式,所以会有ProbeXXXX确认参数真的合法。
为什么还要判断是否之前Mode是否是KernelMode呢? 因为此系统调用函数很可能被Kernel或Driver直接调用,默认内核空间是可信赖的,此时就会忽略参数检查,以提高性能。
内核内部使用和私有API
有些API以i后缀代表是内部使用,以p后缀代表是私有不可为外部调用。比如,Ki代表内核管理内部API, Psp代表进程/线程私有API.
内核中还有很多有趣的语言或编译器特性,以后带大家不断领略。
Windows内核--读懂源代码的特殊“标志“(1.4)相关推荐
- Windows 内核(WRK)简介
引子 WRK 是微软于 2006 年针对教育和学术界开放的 Windows 内核的部分源码, WRK(Windows Research Kernel)也就是 Windows 研究内核, 在 WRK 中 ...
- 一起谈.NET技术,Windows 内核(WRK)简介
引子 WRK 是微软于 2006 年针对教育和学术界开放的 Windows 内核的部分源码,WRK(Windows Research Kernel)也就是 Windows 研究内核,在 WRK 中不仅 ...
- Windows 内核(WRK)编译
引子 WRK 是微软于 2006 年针对教育和学术界开放的 Windows 内核的部分源码, WRK(Windows Research Kernel)也就是 Windows 研究内核, 在 WRK 中 ...
- 鸿蒙内核源码分析系列 | 读懂HarmonyOS内核源代码!
本系列从HarmonyOS架构层视角整理成文, 并用生活场景及讲故事的方式试图去解构内核,一窥究竟.帮助你读懂并快速理解鸿蒙操作系统源码. 1.鸿蒙内核源码分析(调度机制篇) 2.鸿蒙内核源码分析(进 ...
- windows路由表完全掌握(内容:路由表解析,读懂路由表)
一.Windows路由表完全解析 时间能够以这样的方式过去令人感到惊异.人们倾向于认为计算机技术属于高科技,但是,TCP/IP协议在过去的三十年里以各种形式出现,无所不在.因此,TCP/IP协议有 ...
- 如何读懂网页中的源代码?
要读懂网页中的源代码,需要了解 HTML.CSS 和 JavaScript 等相关技术. HTML:网页的结构和内容都是由 HTML 代码构建的,因此要读懂网页,需要先了解 HTML.可以通过学习 H ...
- openFoam代码读懂笔记
1. sed口令 sed -i "/method/s/manual/simple/g" decomposeParDict 是不是指:将文件decomposeParDict内meth ...
- 从根上理解高性能、高并发(七):深入操作系统,一文读懂进程、线程、协程
本文引用了"一文读懂什么是进程.线程.协程"一文的主要内容,感谢原作者的无私分享. 1.系列文章引言 1.1 文章目的 作为即时通讯技术的开发者来说,高性能.高并发相关的技术概念早 ...
- 如何快速读懂开源代码?
文章目录 **RUN起来** **调试** **把控关键数据结构和函数** **从小的开始** **关注一个模块** **工具** **一.阅读开源代码存在的一些误区** 二.阅读代码的心态 **三. ...
最新文章
- Windows安全策略
- utf-16 java_Java、Unicode、UTF-8、UTF-16之间的关系
- mac安装win10_mac制作win10启动盘教程
- 深入浅出Fetch API
- AI算法连载16:统计之聚类
- flutter上拉抽屉效果 flutter拖动抽屉效果
- oracle解锁用户实例,在Oracle 11G R2里启用示例帐户scott
- windows server 2012 动态访问控制
- mysql中locate和substring函数使用
- Nginx系列(5):Web服务器分析之Linux I/O(理论中)
- 50岁的哆啦A梦“撞”上63岁的卡西欧,阿里云数据中台告诉你火花能有多大
- Ubuntu 朗文不发音问题
- 萌新入坑第一课——如何写技术博客
- 多商家父订单子订单_70多份订单被退回,商家查看信息傻眼了,美团:封店180天...
- Github上的开源项目5
- 网站维护需要做些什么?
- 欧文分校的计算机科学博士,2020年加州大学欧文分校博士含金量
- 【Ubuntu】虚拟摄像头,并应用在Teams上
- 完成计算机的界面并实现其功能,计算机组成原理-第1章-马永强.pdf
- L2-039 清点代码库(Python3)
热门文章
- 散列表的平均查找长度
- matlab数字填图游戏,数字填色游戏下载-数字填色游戏安卓版下载(Paint By Number) v1.7.3-11773手游网...
- 数据科学家是干什么的,成为一名数据科学家,主要划分为哪几个步骤?
- 初中计算机word试题,初中信息技术考试试题及答案Word.docx
- 不粘锅不粘锅不粘锅不粘锅不粘锅
- html5 canvas基础
- java 万年历绪论,基于FPGA的万年历设计
- Boom 3D for Mac(音效增强软件)
- mymps蚂蚁分类信息系统5.8SE UTF8开源优化无BUG版新增功能介绍
- 程序员请注意,这个Python思维误区会致命!