windows 内核原理之内核名字及相关概念 一、先建立Windows内核总图你以后所有知识都放进这张图用户程序 ↓ CreateFile DeviceIoControl ReadFile WriteFile ↓ Ntdll.dll ↓ Syscall ↓ 进入内核 I/O Manager Memory Manager Process Manager Object Manager Security Manager Cache Manager ↓ 驱动程序 (WDM/KMDF) ↓ 硬件二、用户态和内核态用户态Ring3权限最低不能访问页表 访问寄存器 访问硬件 执行特权指令例如MessageBox() CreateFile()都在用户态。内核态Ring0权限最高。可以访问所有内存 访问硬件 处理中断 修改页表例如ntoskrnl.exe 驱动程序运行于内核态。三、系统调用流程经典面试题。例如ReadFile()发生什么ReadFile ↓ Kernel32.dll ↓ Ntdll.dll ↓ NtReadFile ↓ syscall指令 ↓ 切换Ring3→Ring0 ↓ SSDT ↓ NtReadFile内核实现 ↓ I/O Manager ↓ IRP ↓ 驱动 ↓ 硬件 ↓ 返回四、进程和线程进程资源容器。内核对应EPROCESS保存页表 句柄表 Token 线程链表线程执行单元。内核对应ETHREAD保存栈 寄存器 优先级 状态关系EPROCESS ├──ETHREAD ├──ETHREAD └──ETHREAD五、虚拟内存为什么存在因为物理内存有限。而程序觉得自己拥有4GB或者128TB虚拟地址空间。CPU访问VA Virtual Address经过页表(Page Table)转换PA Physical Address六、Page Table这是地址翻译表。例如VA 0x12345678 ↓ Page Table ↓ PA 0x87654321保存于内存。问题来了每次查页表很慢。于是七、TLBTranslation Lookaside Buffer地址翻译缓存。CPU内部。没有TLBVA ↓ 页表 ↓ PA有TLBVA ↓ TLB ↓ PA直接命中。快几十倍。面试经典TLB是什么答CPU缓存最近使用页表项的高速缓存。加速地址转换。八、Cache和TLB区别很多人答错。Cache缓存数据例如int a100;缓存这个100。TLB缓存地址映射关系例如VA→PA一句话Cache缓存数据 TLB缓存地址映射九、Page Fault缺页异常。CPU访问0x12345678发现页表无效触发#PFPage Fault进入KiPageFault↓Mm Memory Manager↓加载页面↓更新PTE↓恢复执行面试为什么DPC不能访问Paged Memory因为Page Fault需要阻塞。而DISPATCH_LEVEL禁止阻塞。直接蓝屏。十、IRQL面试出现率极高。全称Interrupt Request LevelWindows优先级体系。PASSIVE_LEVEL ↓ APC_LEVEL ↓ DISPATCH_LEVEL ↓ DIRQL ↓ HIGH_LEVEL作用控制谁能抢占谁十一、ISRInterrupt Service Routine中断服务程序。硬件触发网卡 磁盘 串口↓CPU中断↓ISR特点运行DIRQL 时间必须极短十二、DPCDeferred Procedure Call延迟过程调用。ISR里不能干重活。于是ISR ↓ KeInsertQueueDpc ↓ DPC ↓ DISPATCH_LEVEL例如网卡收1000个包。ISR只记录来包了真正处理DPC。十三、APCAsynchronous Procedure Call异步过程调用。运行APC_LEVEL主要内核向线程插任务例如ReadFile完成通知线程。十四、ISR、DPC、APC、IRQL关系面试经典。硬件中断 ↓ ISR DIRQL ↓ DPC DISPATCH_LEVEL ↓ APC APC_LEVEL ↓ 线程 PASSIVE_LEVEL记住这张图。十五、IRP驱动面试必问。IRPI/O Request Packet所有IO请求载体。例如ReadFile变成IRP_MJ_READDeviceIoControl变成IRP_MJ_DEVICE_CONTROL十六、IO_STACK_LOCATIONIRP内部的一层。驱动栈应用 ↓ 文件系统 ↓ 过滤驱动 ↓ 磁盘驱动每层一个IO_STACK_LOCATION保存本层参数十七、IOCTL设备控制码。用户层DeviceIoControl()↓驱动IRP_MJ_DEVICE_CONTROL↓解析IOCTL_XXX十八、MDLMemory Descriptor List面试高频。作用描述用户缓冲区。例如用户层char buf[4096];驱动需要DMA。不能直接访问。于是buf ↓ MDL ↓ 锁页 ↓ 获得物理页十九、FastIO一种绕过IRP机制。普通Read ↓ IRP ↓ 文件系统FastIORead ↓ FastIO ↓ 返回少一次IRP。更快。二十、Cancel IRP取消请求。用户CancelIoEx()↓IRP取消↓Cancel Routine↓驱动清理↓完成IRP二十一、KMDF对象模型核心思想一切皆对象。WDFDRIVER ↓ WDFDEVICE ↓ WDFQUEUE ↓ WDFREQUEST二十二、引用计数KMDF自动管理。WDMObReferenceObject ObDereferenceObject自己维护。KMDFWdfObjectReference WdfObjectDereference自动释放。二十三、WDFQUEUE请求队列。模式Sequential 顺序 Parallel 并行 Manual 手工二十四、EvtIoDeviceControlKMDF最重要回调。收到DeviceIoControl()最终EvtIoDeviceControl()二十五、PnP状态机设备生命周期。AddDevice ↓ StartDevice ↓ Working ↓ StopDevice ↓ RemoveDevice二十六、Power状态机电源管理。设备状态D0 工作 D1 D2 D3 睡眠系统状态S0 工作 S1 S2 S3 睡眠 S4 休眠 S5 关机二十七、VADVirtual Address Descriptor面试高级题。管理进程虚拟内存区域例如VirtualAlloc()↓创建VAD二十八、PTEPage Table Entry页表项。保存物理页号 权限 Present位 Dirty位二十九、SSDTSystem Service Dispatch Table系统调用表。NtOpenProcess NtReadFile NtCreateFile全部登记在SSDT三十、Object ManagerWindows万物皆对象。例如Process Thread File Event Mutex Device都有对象头。统一引用计数 句柄管理 命名空间由 Object Manager 管理。名词了解顺序表IRQL ↓ ISR ↓ DPC ↓ APC ↓ IRP ↓ IOCTL ↓ Page Fault ↓ TLB ↓ PTE ↓ EPROCESS ↓ ETHREAD ↓ VAD