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)相关推荐

  1. Windows 内核(WRK)简介

    引子 WRK 是微软于 2006 年针对教育和学术界开放的 Windows 内核的部分源码, WRK(Windows Research Kernel)也就是 Windows 研究内核, 在 WRK 中 ...

  2. 一起谈.NET技术,Windows 内核(WRK)简介

    引子 WRK 是微软于 2006 年针对教育和学术界开放的 Windows 内核的部分源码,WRK(Windows Research Kernel)也就是 Windows 研究内核,在 WRK 中不仅 ...

  3. Windows 内核(WRK)编译

    引子 WRK 是微软于 2006 年针对教育和学术界开放的 Windows 内核的部分源码, WRK(Windows Research Kernel)也就是 Windows 研究内核, 在 WRK 中 ...

  4. 鸿蒙内核源码分析系列 | 读懂HarmonyOS内核源代码!

    本系列从HarmonyOS架构层视角整理成文, 并用生活场景及讲故事的方式试图去解构内核,一窥究竟.帮助你读懂并快速理解鸿蒙操作系统源码. 1.鸿蒙内核源码分析(调度机制篇) 2.鸿蒙内核源码分析(进 ...

  5. windows路由表完全掌握(内容:路由表解析,读懂路由表)

    一.Windows路由表完全解析   时间能够以这样的方式过去令人感到惊异.人们倾向于认为计算机技术属于高科技,但是,TCP/IP协议在过去的三十年里以各种形式出现,无所不在.因此,TCP/IP协议有 ...

  6. 如何读懂网页中的源代码?

    要读懂网页中的源代码,需要了解 HTML.CSS 和 JavaScript 等相关技术. HTML:网页的结构和内容都是由 HTML 代码构建的,因此要读懂网页,需要先了解 HTML.可以通过学习 H ...

  7. openFoam代码读懂笔记

    1. sed口令 sed -i "/method/s/manual/simple/g" decomposeParDict 是不是指:将文件decomposeParDict内meth ...

  8. 从根上理解高性能、高并发(七):深入操作系统,一文读懂进程、线程、协程

    本文引用了"一文读懂什么是进程.线程.协程"一文的主要内容,感谢原作者的无私分享. 1.系列文章引言 1.1 文章目的 作为即时通讯技术的开发者来说,高性能.高并发相关的技术概念早 ...

  9. 如何快速读懂开源代码?

    文章目录 **RUN起来** **调试** **把控关键数据结构和函数** **从小的开始** **关注一个模块** **工具** **一.阅读开源代码存在的一些误区** 二.阅读代码的心态 **三. ...

最新文章

  1. Windows安全策略
  2. utf-16 java_Java、Unicode、UTF-8、UTF-16之间的关系
  3. mac安装win10_mac制作win10启动盘教程
  4. 深入浅出Fetch API
  5. AI算法连载16:统计之聚类
  6. flutter上拉抽屉效果 flutter拖动抽屉效果
  7. oracle解锁用户实例,在Oracle 11G R2里启用示例帐户scott
  8. windows server 2012 动态访问控制
  9. mysql中locate和substring函数使用
  10. Nginx系列(5):Web服务器分析之Linux I/O(理论中)
  11. 50岁的哆啦A梦“撞”上63岁的卡西欧,阿里云数据中台告诉你火花能有多大
  12. Ubuntu 朗文不发音问题
  13. 萌新入坑第一课——如何写技术博客
  14. 多商家父订单子订单_70多份订单被退回,商家查看信息傻眼了,美团:封店180天...
  15. Github上的开源项目5
  16. 网站维护需要做些什么?
  17. 欧文分校的计算机科学博士,2020年加州大学欧文分校博士含金量
  18. 【Ubuntu】虚拟摄像头,并应用在Teams上
  19. 完成计算机的界面并实现其功能,计算机组成原理-第1章-马永强.pdf
  20. L2-039 清点代码库(Python3)

热门文章

  1. 散列表的平均查找长度
  2. matlab数字填图游戏,数字填色游戏下载-数字填色游戏安卓版下载(Paint By Number) v1.7.3-11773手游网...
  3. 数据科学家是干什么的,成为一名数据科学家,主要划分为哪几个步骤?
  4. 初中计算机word试题,初中信息技术考试试题及答案Word.docx
  5. 不粘锅不粘锅不粘锅不粘锅不粘锅
  6. html5 canvas基础
  7. java 万年历绪论,基于FPGA的万年历设计
  8. Boom 3D for Mac(音效增强软件)
  9. mymps蚂蚁分类信息系统5.8SE UTF8开源优化无BUG版新增功能介绍
  10. 程序员请注意,这个Python思维误区会致命!