windows内核情景分析-毛德操(第一章)
微内核操作系统的特点内核尽量缩小
windows内核包括了两大部分
操作系统内核(ntoskrnl.exe),另一部分则是迁移到了内核中即系统空间中的视窗服务(win32k.sys)
用户空间和系统空间
8086 80186cpu在寻址技术上还只能支持"实模式",还不能支持现代意义上的内存管理,因而不能支持系统空间与用户空间的划分。
现代意义的操作系统
- 首先 操作系统在内存中的映像必须受到保护,不会因为用户程序的不良行为而受到伤害。也就是说 ,必须让CPU有"系统态(内核态)"和用户态,使得当cpu运行用户态时只能访问预先配置用户态的内存区域,而不能访问操作系统内核所在的内存区域。
用户态 和 系统态 是不对称的,二者之间不是"井水不犯河水"的关系,而是井水不能犯河水但河水可以犯井水。
其次,不同的用户程序之间应该互相防护,不能因一个程序的不良行为或误操作而伤害另一个用户程序。这就是说,用户程序及其数据、堆栈都应该被保护起来,与其他用户的程序、数据和堆栈隔离开来,以防受到别的用户程序的伤害。
最后,除保护之外,用户程序在物理内存的位置应该可以浮动。在多进程的系统中,一般都会有多个应用程序同时在运行,如果这些程序都只能被装载在固定的地址上运行,就会互相牵制,整个系统的运行就受到了限制。80年代中期的事(保护模式)
Windows内核
现代操作系统的一个明显特征就是用户空间和系统空间的划分
UNIX时代
人们一直把存在于系统空间的代码和数据的集合称为"内核",因此内核是有明确边界的。空间的不同,或者说CPU运行模式(系统态和用户态)的不同,是不会被混淆的本质区别。
Windows的术语
微软并不把系统空间的所有代码和数据的集合称为内核,而是把这里面的一部分,即比较低层、与硬件靠得最近而最为核心得一部分称为"内核"即Kernel
位于最高层的是应用软件,就是一般文件扩展名为.exe的可执行程序。除.exe可执行之外,应用软件的开发者和提供者可以(但并非必须)选择把其中的一部分基础性的功能放在若干"动态连接库"DLL里面,这就是文件扩展名为.dll的可执行程序。DLL也是分层次的,相对高的DLL依赖于相对低层的DLL,调用由低层DLL所提供的服务。
在windows操作系统中,整个4GB的虚拟地址空间被对半分成两块,从地址0x80000000开始向上是"系统空间",就是内核所在的地方,下面则是"用户空间",是应用程序所在的地方。系统空间是全局的,而用户空间只属于具体的进程,每个(用户)进程都有自己的用户空间。
Windows的应用程序二进制界面 ABI
ABI 一方面是系统 调用的界面,定义了所有系统调用函数界面的集合,并规定了系统 调用如何进行;另一方面也规定了可执行程序文件的结构和格式。Windows的系统调用界面是不公开的,现在人们所知道的有关信息基本上来自有关的研究和实现,特别是来自逆向工程的研究。
系统态访问权限
CPU必须进入"系统态"才能执行存放在系统空间的程序,访问存放在系统空间的数据。
对用户空间的数据则不论处于"系统态"或"用户态"都能访问。
cpu进入内核的方式三种途径
- 系统调用
- 中断
- 异常。
当CPU运行于内核中时,尽管都是在内核中,有些操作只允许在特定的层次上进行,或者只允许对特定的层次进行。例如在中断处理的内部就不允许线程切换,线程切换只有在完了中断处理以后才能进行。所以,Windows内核规定只有在从所谓的"内核"层(而不是整个内核)退出来才可以进行线程切换。
线程调度/切换的问题上
- 剥夺式(Preemptive):只有优先级更高的线程就绪,哪怕CPU已经在为别的优先级低的线程所用而且无意主动让路,也要立即把它夺过来;
- 非剥夺式(Non-Pressmptive):如果CPU已经在执行别的线程,就先忍一忍,等待适当的机会。什么是机会呢?就是等正在系统空间运行的线程返回用户空间的时候。可是,优先级较高的线程之所以变成就绪,其触发的条件也必为系统调用 、中断或异常其中之一,总之是在CPU运行于系统空间的时候变成就绪的。
其实不是剥夺不剥夺的问题(那取决于调度策略),而是什么时候剥夺的问题
Windows内存管理即虚存技术的的重要内容之一是
windows的物理页面的倒换,就是可以将已有映射但是暂时不受到访问的页面倒换到外存中去,到实际受到访问时候再倒进来,使外存称为内存的扩充。
微软把图形操作系统/视窗服务的实现也搬到了内核中,这就使内核的体积增加了很多。再说每个线程的系统空间堆栈也因此增加了许多,当线程数量很多时也确实不可忽视。有些页面注定不可倒换。例如:与中断和异常有关的代码和数据所在的页面,以及与页面倒换有关的代码和数据,倒换出去,就无法把这些页面倒换回来了。
在Linux中,属于内核的页面无论是用于代码还是数据(用于文件内存缓存的除外),是不受倒换的。因为内核毕竟是全局的,所有进程都是公用同一个系统空间
运行级别
IRQ级别即IRQL。在任一时间中CPU总是运行于其中的某一个级别,这个级别就表明了什么事情可以做,什么事情不可以做
Windows内核函数的命名
Windows的内核函数在命名有一个好的特色,就是函数名都按其所在的层次或模块上加上了特定的前缀。了解了这些前缀,看到一个函数名就可以大致知道这个函数所属的层次和模块,主要的前缀有:
- Ex:管理层,Ex是Executive的开头两个字母。
- Ke: 核心层,Ke是Kernel的开头两个字母。
- Hal:硬件抽象层,Hal是HardwareAbstraction Layer的缩写。
- Ob :对象管理,Ob是Object的开头两个字母。
- Mm:内存管理,Mm是Memory Manager的缩写。
- Se:安全管理,Se是Security的开头两个字母。
- I/O: I/O管理。
- Fs 文件系统,Fs是File System的缩写。
- Cc:文件缓存管理,Cc表示Cache
- Cm:系统配置管理,Cm是Configuration Manager的缩写。
- Pp:"即插即用"管理,Pp表示PnP
- Rtl:运行时程序库,Rtl是Runtime Library的缩写。
一般的函数调用时通过堆栈传递参数的,而快速调用时通过ECX等寄存器传递参数,因为避免了几个堆栈操作而使效率有所提高。说明:KfLowerIrql()是个快速调用函数,这个函数名出现在汇编程序中时则变成@KfLowerIrql@4这里的前缀@表示这是快速调用函数,后缀的@4则表示这个函数带有4字节的参数,即一个参数。当然,这是通过寄存器(因为只有一个参数,所以是ECX)传递的参数,而不是通过堆栈传递的参数。
windows内核情景分析-毛德操(第一章)的更多相关文章
- [1]windows 内核情景分析---说明
本文说明:这一系列文章(笔记)是在看雪里面下载word文档,现转帖出来,希望更多的人能看到并分享,感谢原作者的分享精神. 说明 本文结合<Windows内核情景分析>(毛德操著).< ...
- 几个常用内核函数(《Windows内核情景分析》)
参考:<Windows内核情景分析> 0x01 ObReferenceObjectByHandle 这个函数从句柄得到对应的内核对象,并递增其引用计数. NTSTATUS ObRefer ...
- windows内核情景分析之—— KeRaiseIrql函数与KeLowerIrql()函数
windows内核情景分析之—— KeRaiseIrql函数与KeLowerIrql()函数 1.KeRaiseIrql函数 这个 KeRaiseIrql() 只是简单地调用 hal 模块的 KfRa ...
- [14]Windows内核情景分析 --- 文件系统
文件系统 一台机器上可以安装很多物理介质来存放资料(如磁盘.光盘.软盘.U盘等).各种物理介质千差万别,都配备有各自的驱动程序,为了统一地访问这些物理介质,windows设计了文件系统机制.应用程序要 ...
- [7] Windows内核情景分析---线程同步
基于同步对象的等待.唤醒机制: 一个线程可以等待一个对象或多个对象而进入等待状态(也叫睡眠状态),另一个线程可以触发那个等待对象,唤醒在那个对象上等待的所有线程. 一个线程可以等待一个对象或多个对象, ...
- [4]Windows内核情景分析---内核对象
写过Windows应用程序的朋友都常常听说"内核对象"."句柄"等术语却无从得知他们的内核实现到底是怎样的, 本篇文章就揭开这些技术的神秘面纱. 常见的内核对象 ...
- [11]Windows内核情景分析---设备驱动
设备驱动 设备栈:从上层到下层的顺序依次是:过滤设备.类设备.过滤设备.小端口设备[过.类.过滤.小端口] 驱动栈:因设备堆栈原因而建立起来的一种堆栈 老式驱动:指不提供AddDevice的驱动,又叫 ...
- windows内核情景分析之中断处理(毛德操)[转]
中断处理 每个cpu有一张中断表,简称IDT. IDT的整体布局:[异常->空白->5系->硬](推荐采用7字口诀的方式重点记忆) 异常:前20个表项存放着各个异常的描述符(IDT表 ...
- [15]Windows内核情景分析 --- 权限管理
Windows系统是支持多用户的.每个文件可以设置一个访问控制表(即ACL),在ACL中规定每个用户.每个组对该文件的访问权限.不过,只有Ntfs文件系统中的文件才支持ACL. (Ntfs文件系统中, ...
- [2]windows内核情景分析--系统调用
Windows的地址空间分用户模式与内核模式,低2GB的部分叫用户模式,高2G的部分叫内核模式,位于用户空间的代码不能访问内核空间,位于内核空间的代码却可以访问用户空间 一个线程的运行状态分内核态与用 ...
随机推荐
- Network Science:巴拉巴西网络科学阅读笔记2 第一章图论
第一章:图论 完全图又被称为团. Metcalfe's Law: Metcalfe's law states that the value of a telecommunications networ ...
- 实现异步操作CompletableFuture
多个线程异步操作后统一返回执行结果AtomicReference<RespVo> event = new AtomicReference<>(); AtomicReferenc ...
- MQTT-会话
MQTT会话 为什么需要会话 假如有以下场景,客户端A发送消息到服务端,服务端转发给客户端B,如果这个时候服务端和客户端B的网络连接断开,那么就无法保证消息到达,并且客户端A不知道B连接断开,还会 ...
- Prometheus-Operator使用ServiceMonitor监控配置时遇坑与解决总结
摘要 本文范围: Prometheus-Operator & kube-prometheus 安装:以及在解决使用ServiceMonitor时遇到的坑. Prometheus Operato ...
- 2023-04-22:给你两个正整数数组 nums 和 target ,两个数组长度相等。 在一次操作中,你可以选择两个 不同 的下标 i 和 j , 其中 0 <= i, j < nums.leng
2023-04-22:给你两个正整数数组 nums 和 target ,两个数组长度相等. 在一次操作中,你可以选择两个 不同 的下标 i 和 j , 其中 0 <= i, j < num ...
- 2020-09-26:请问rust中的&和c++中的&有哪些区别?
福哥答案2020-09-26:#福大大架构师每日一题# 变量定义:c++是别名.rust是指针.取地址和按位与,c++和rust是相同的. c++测试代码如下: #include <iostre ...
- 2020-06-11-ASP.NET Core Blazor 子组件父组件数据同步的问题
上一篇写数据绑定的文章,写到最后留了一个坑.当子组件绑定父组件的一个字段,并且子组件修改它的时候父组件不能实时进行同步更新UI的问题,最近终于在Blazui作者的指导下搞定了. UserInfo类要实 ...
- 在程序里如何停止整个python项目的运行
我们的项目无可避免的会遇到一些场景,当出现某个故障或者异常,必须停止整个项目的运行,这时只需要在抛出的异常里执行以下即可: os._exit(0)
- weex create test-app Error: Cannot find module '../package.json'
weex create 报错 D:\YLKJPro>weex create test-app Error: Cannot find module '../package.json' at Fun ...
- IntelliJ IDEA 最新激活码:2023、2022及以下版本通用(亲测有效)
分享一下 IntelliJ IDEA 2023.1 最新激活注册码,破解教程如下,可免费永久激活,亲测有效,下面是详细文档哦~ 申明:本教程 IntelliJ IDEA 破解补丁.激活码均收集于网络, ...