鱼C论坛

 找回密码
 立即注册

Windows内核学习-采用ReactOS源码(1)

热度 2已有 913 次阅读2014-10-22 23:03 |个人分类:Windows

我前面打了好多,不小心弄没了。就不想再打了。从这里开始吧。
1. Windows系统概述
CPU访问系统空间的途径:
  1. 系统调用
  2. 中断
  3. 异常
在线程调度/切换中有两种模式。一种为剥夺式(Preemptive),即只要有优先级更高的线程就绪,优先级较低的线程就得让路;另一种是“非剥夺式”(Non-preemptive),即在执行别的进程的时候等一等。微软生成Windows是采用剥夺式的。
和Linux不同的是,Windows的内核的相当一部分页面是可倒换的。这里说到的倒换就是指内存管理中的虚拟内存技术。将暂时不会访问的页面倒换到外存中,需要时再换回来。Windows内核层及以下的应该是不允许调换的,例如中断和异常有关的代码和数据的页面。
Windows为CPU的运行状态定义了许多IRQ级别,即IRQL。在任意时间中,CPU总是运行于其中的某一个级别,这个级别表明了什么事情可以做,什么事情不可以做。
在ReactOS的代码目录./include/xdk/.../ke.h中就针对不同的CPU进行了定义,以x86为例
/* Interrupt request levels */
#define PASSIVE_LEVEL           0
#define LOW_LEVEL               0
#define APC_LEVEL               1
#define DISPATCH_LEVEL          2
#define CMCI_LEVEL              5
#define PROFILE_LEVEL           27
#define CLOCK1_LEVEL            28
#define CLOCK2_LEVEL            28
#define IPI_LEVEL               29
#define POWER_LEVEL             30
#define HIGH_LEVEL              31
#define CLOCK_LEVEL             CLOCK2_LEVEL
在./include/ddk/wdm.h以及.include/xdk/kefuncs.h中都有如下测试中断优先级的代码。从下面可以看出,在页面换出问题上,优先级高于APC_LEVEL的便不允许倒换的发生了。
#elif DBG

#if (NTDDI_VERSION >= NTDDI_VISTA)
#define PAGED_ASSERT( exp ) NT_ASSERT( exp )
#else
#define PAGED_ASSERT( exp ) ASSERT( exp )
#endif

#define PAGED_CODE() { \
  if (KeGetCurrentIrql() > APC_LEVEL) { \
    KdPrint( ("NTDDK: Pageable code called at IRQL > APC_LEVEL (%d)\n", KeGetCurrentIrql() )); \
    PAGED_ASSERT(FALSE); \
  } \
}

#define PAGED_CODE_LOCKED() NOP_FUNCTION;

#else

#define PAGED_CODE() NOP_FUNCTION;
#define PAGED_CODE_LOCKED() NOP_FUNCTION;

#endif /* DBG */
书上说是是下面这行代码使编译工具为此函数生成可被倒换的空间的
#pragma alloc_text(PAGE, ...)
2. 开源项目ReactOS
开源项目ReactOS旨在不使用微软泄露出来的源码的情况下开源实现Windows NT的架构。据说主要贡献者来自俄罗斯。
3. 函数名字开头说明:
    Ex: 管理层,Executive 的开头两字母
    Ke: 核心层,Kernerl的开头两字母
    Hal:硬件抽象层,Hardware Abstration Layer 缩写
    Ob :对象管理,Object 
    Mm :内存管理 Memory Manager
    Ps :进程管理 Process
    Se :安全管理 Security
    Io :I/O管理
    Fs :文件管理 File System
    Cc :文件缓存管理 Cache
    Cm :系统配置 Configuration Manager
    Pp :即插即用 Pnp
    Rtl:运行时程序库 Runtime Library
在函数前缀后加上小写的f表明是快速调用的函数,函数会通过ECX等寄存器传递参数。在汇编代码中,函数名前面会加上下划线“_”。例如在生成的hal.dll中会有符号@KfLowerIrql@4,前面的@表示是快速调用函数,后面的@4表示4个字节的参数。

路过

鸡蛋
2

鲜花

握手

雷人

刚表态过的朋友 (2 人)

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 立即注册

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-25 21:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

返回顶部