- 博客(405)
- 资源 (7)
- 收藏
- 关注
原创 ReactOS 4.2 OBJECT_TYPE_INITIALIZERj结构体的实现
一般对象的ParseProcedure 都是很简单的,因为都是在对象目录中寻找目标对象,但是文件对象的 ParseProcedure 是个特例,文件对象的寻找涉及文件系统,需要转入文件目录中寻找。这个函数根据“申请单”创建起新对象类型的数据结构,然后将其挂入对象目录。对象类型的数据结构是OBJECT_TYPE,其内部有个成分TypeInfo也是OBJECT_TYPE_INITIALIZER数据结构,“申请单”的内容将被复制到OBJECT_TYPE数据结构内部的Typelnfo中。
2024-11-09 20:24:14
980
原创 WINDOWS XP ReactOS 4.2 对象类型
系列文章目录文章目录系列文章目录4.2 对象类型OBJECT_TYPE_INITIALIZERExpInitializeTimerImplementation()ObpInsertEntryDirectory()ObInit()IopCreateObjectTypes()4.2 对象类型对象是分类的,因而是有“类型(Type)”的,前面列举了许多常用的Windows 对象类型。但是要列举所有的对象类型则不可能,因为Windows对象类型的集合(对于内核)是开放的,内核函数可以向这个集合中加入新的对象
2024-11-09 20:21:46
1049
原创 4.1 WINDOWS XP,ReactOS对象与对象目录----2
三个部分按特殊的方式连成一片。按地址由低到高,首先当然是OBJECT_HEADER,它的上方是具体对象类型的数据结构本身;然而附加信息不是在具体对象类型的数据结构上方,也不是在这二者之间,而是在OBJECT_HEADER的下面。这些附加信息是可选项,可以有也可以没有。关于耗用内存配额的信息。
2024-11-06 20:10:52
180
原创 4.1 WINDOWS XP,ReactOS对象与对象目录----1
系列文章目录文章目录系列文章目录4.1 对象与对象目录OBJECT_HEADERObpLookupEntryDirectory()NtCreateTimer()4.1 对象与对象目录“对象(Object)”这个词现在大家都已耳熟能详了,但是对象到底是什么呢?广义地说,对象就是“目标”,行为的目标,或者说行为的受体。所以,广义地说,任何客观存在着的物体都可以成为对象。但是,在计算机技术里,“对象”是个专有名词,其定义是:一个(或一组)数据结构和定义于其上的(若干)操作。这里所谓操作是指实现某种功能的函
2024-11-06 20:09:12
1118
1
原创 3.5 WINDOWS XP ,ReactOS系统 3.5 系统空间的缓冲区管理
首先,用户空间的堆是属于进程的:而内核中的池则是全局的,属于整个系统。其次,用户空间的堆是“批发/零售”的机制,零售完了还可以再向内核进货,堆的大小是可以扩充的:而内核中的池的大小则基本上是固定的,用光了就没有了。另一种是所占页面可以倒换的,这种池的大小倒是可以扩充,因为(已分配而)暂时不受访问的(虚存)页面可以被倒换到作为后备的页面倒换文件中。如果不同的程序在分配缓冲区时都加上不同的标签,并说明是通过哪一个函数分配的缓冲区,把这些信息都记录在缓冲区的头部,那对于程序调试当然是大有好处的。
2024-11-05 22:58:50
731
原创 windows XP,ReactOS系统3.4 共享映射区(Section)---2
映射区的数据结构中必须有指向目标文件对象的指针,这是不言而喻的。如果目标文件是可执行映像文件,那就要有个指针指向另一个数据结构,即MM_IMAGE_SECTION_OBJECT,在那里有个映射段结构指针的数组,还有个字段说明段的数量,因为可执行映像文件里面段的数量是不固定的。这又是一个数组,数组的大小NR_SECTION_PAGE_ENTRIES也定义为1024,也占一个页面显然,映射段页面目录和映射段二级页面表构成了映射段的页面映射表,在形式上与内存的页面映射表一致。
2024-11-04 19:57:24
722
原创 windows XP,ReactOS系统3.4 共享映射区(Section)---1
系列文章目录文章目录系列文章目录3.4 共享映射区(Section)NtCreateSection ()MmCreateSection ()MmCreateDataFileSection()NtMapViewOfSection()MmNotPresentFaultSectionView()3.4 共享映射区(Section)对于用户空间的映射,一个物理页面通常只属于一个进程,即只被映射到一个进程的用户空间,因而其页面号只出现在一个进程的页面映射表中。注意这里说的是用户空间,至于系统空间的页面则本来就
2024-11-04 19:53:32
1179
原创 3.3 windows,ReactOS系统中页面的换出----2,结构体PHYSICAL_PAGE
例如:第一章 Python 机器学习入门之pandas的使用。
2024-11-03 20:56:26
234
原创 3.3 windows,ReactOS系统中页面的换出----1
凡是有了倒换页面的物理页面,其PHYSICAL PAGE结构中的SavedSwapEntry字段就指向这个倒换页面,现在一方面将该字段的内容转移到相应的页面映射表项中(并将其PAPRESENT标志位清0),另一方面通过 MmSetSavedSwapEntryPage()将这个字段清 0。如前所述,所谓内存“消费者”并不是指实际占用着物理页面的进程,而是指各种不同的用途例如用户空间的页面映射,内核中的可倒换物理页面池、不可倒换物理页面池,磁盘上扇区内容的高速缓存等。换言之,另两种用途的页面是不让修剪的。
2024-11-03 20:53:14
1074
1
原创 3.2 页面异常-1
所谓建立映射,就是要将物理页面号和页面保护模式(读/写/执行),以及访问权限DPL(0环或3环)等信息组合起来,形成一个最低位为1(表示页面在位)的页面映射表项 PTE(的值):再把这个值写到页面映射表中与给定虚存地址相对应的表项中(如果所属的目录项为0,则还要分配相应的二级映射表,并修改目录项)。显然,只有已经交割的区块才可以被访问。倒换描述项的高8位(实际上是高7位)是倒换文件号,低24位则是页面在文件内部的位移不过这个位移是以页面为单位的位移,所以实际上是页面号,实际的字节位移则还要乘上页面的大小。
2024-11-02 10:24:23
1090
原创 3.1.6 系统调用NtAllocateVirtualMemory()--2--结构体
【代码】3.1.6 系统调用NtAllocateVirtualMemory()--2--结构体。
2024-11-01 08:15:45
163
原创 3.1.6 系统调用NtAllocateVirtualMemory()1
用户空间的虚拟存储区间是进程的财产,不同的进程有不同的用户空间,为进程A分配其用户空间的某个虚存区间,不等于进程B、进程C的用户空间中的同一区间也受到了分配。当然,所分配的仅限于用户空间,用户空间的程序是无法要求内核分配系统空间的。回到 NtAllocateVirtualMemory()的代码,如果用户并未指定区间的起始地址,即参数UBaseAddress为0,或者用户指定的地址尚未被分配,即在目标空间中找不到包含这个地址的已分配区间,那就要由内核为之分配一块大小合适的区间。
2024-11-01 08:09:02
1173
原创 3.1.5 系统空间的映射1
这是初始化进程的页面映射表,其内容是系统初始化的产物。凡是缓存在 TLB 中的映射表项,只要这个标志位为1就不受整体的冲刷。一部分即系统空间是公共的,其内容来自全局的内核映射表,这一部分的页面映射是常驻的,不受进程切换的影响。第一个是地址PAGETABLE_MAP所属的目录项,这个目录项应该指向页面目录所在的页面,原来当然是指向 MmGlobalKemelPageDirectory[]里面的某个页面,但是现在则要使其指向子进程的页面目录所在的页面,就是刚才所分配的页面Pfn[0],所以要修改这个目录项。
2024-10-31 18:08:47
879
原创 3.1.4 Hyperspace 的临时映射2
所以,如果要为一个进程的页面映射表创建映射,在虚存空间就大可采用单层的、大小为1M的连续的数组,占1024个虚存页面就1024个虚存页面。在前面的代码中我们看到,如果内核即系统空间的映射有所变化,则该变化首先是反映在内核映射目录 MmGlobalKermelPageDirectory]中,然后才复制到当前目录的页面目录中,这是因为所有进程的系统空间基本上都是公共的,只有PAGETABLE_MAP和HYPERSPACE这两块地方例外。如果放在地址为0的地方,那么第一个页面就是特殊的,就是页面目录。
2024-10-29 12:53:23
562
原创 3.1.4 Hyperspace 的临时映射1
这里所用的算法是:根据物理页面号中的Bit0将所有的物理页面号分成两个集合,如果物理页面号的Bit10为1就从(Page%1024)开始向上搜索,搜索到HYPERSPACE的上沿以后再折回到HYPERSPACE,的下沿,继续向上搜索:Bit0为0则相反,即从(Page % 1024)开始向下搜索。因此,一旦发现某个虚拟页面空闲,这个页面的映射表项即已被设置成所需的内容,下面所需要的就是通过_invlpg(Address)冲刷该表项在TLB中的映像,并通过指针 Address 返回虚拟页面的起始地址了。
2024-10-29 12:45:41
1126
原创 3.1.3 看对于“肮脏”页面的处理
只要整个PTE非0,就说明在某个倒换文件的某个页面中,此时的高31位就是倒换文件号与页面号的组合。显然,这个组合不能为0,这就是为什么这个组合中的页面号实际上是(文件内)页面号加1的原因。当内核调度一个进程运行时,需要将控制寄存器CR3设置成指向这个进程的页面映射表,此时使用的是页面映射表的物理地址,这样MMU才能找到当前进程的页面映射表,并进而将具体的表项PTE装入其高速缓存TLB。当然,对于不同的当前进程,这个虚拟地址会映射到不同的物理页面中,不同进程的页面映射表所在的物理页面当然是不同的。
2024-10-28 20:53:18
273
原创 3.1.3 虚存页面的映射
3.1.3 虚存页面的映射文章目录3.1.3 虚存页面的映射3.1.3 虚存页面的映射MmCreateVirtualMapping()MmCreateVirtualMappingUnsafe()MiFlushTlb()MmDeleteVirtualMapping()MmPageOutVirtualMemory()MmDeleteVirtualMapping()3.1.3 虚存页面的映射有了虚存页面和物理内存页面,下一步就是建立二者之间的映射了。所谓页面映射,是指从虚存页面到物理页面的映射。多个虚存
2024-10-28 20:46:18
998
原创 3.1.1平衡二叉树中 判断这棵AVL树的每个结点的地址是否合法: MmVerifyMemoryAreas
【代码】3.1.1ReactOS 判断这棵AVL树的每个结点的地址是否合法: MmVerifyMemoryAreas。
2024-10-26 21:49:15
226
原创 3.1.1 平衡二叉树中改变区块属性,并分裂区块保持属性一致:MmSplitRegion()
【代码】3.1.1 平衡二叉树中改变区块属性,并分裂区块保持属性一致:MmSplitRegion()
2024-10-26 21:45:00
420
原创 ReactOS系统中平衡二叉树。给定地址超导其所属区块MmFindRegion()
【代码】ReactOS系统中平衡二叉树。给定地址超导其所属区块MmFindRegion()
2024-10-24 12:20:07
493
原创 ReactOS系统中平衡二叉树,在一个空间中寻找与给定地址范围重合或部分重合的(已分配)区间
【代码】ReactOS系统中平衡二叉树,在一个空间中寻找与给定地址范围重合或部分重合的(已分配)区间。MmLocateMemoryAreaByRegion
2024-10-24 12:14:45
695
原创 平衡二叉树AVL搜索目标地址所在的节点
【代码】平衡二叉树AVL搜索目标地址所在的节点。MmLocateMemoryAreaByAddress()
2024-10-23 12:35:41
601
原创 ReactOS系统中平衡二叉树按从左到右的顺序找到下一个结点
【代码】ReactOS系统中平衡二叉树按从左到右的顺序找到下一个结点。MmIterateNextNode()
2024-10-23 12:31:23
495
原创 3.1.1ReactOS系统中搜索给定长度的空间地址区间函数的实现
/搜索给定长度的空间地址区间PMADDRESS_SPACE AddressSpace,//该进程用户空间ULONG_PTR Length,//寻找的空间间隔大小ULONG_PTR Granularity,//粒度位,表明空间起点的对齐要求,注意是起点地址函数的定义:PVOIDNTAPIMmFindGap(
2024-10-20 16:25:48
657
原创 3.1.1 ReactOS系统中二叉树创建一个MEMORY_AREA节点
二叉树中创建一个MEMORY_AREA节点:参数AddressSpace是MADDRESS SPACE结构指针,所指向的数据结构代表着一个进程的用 户空间。参数BaseAddress是个指针,用来给定和返回内存区块的基地址。
2024-10-20 16:18:52
619
原创 3.1.1 内核对用户空间的管理2,搜索目标地址所在的节点
3.1.1 内核对用户空间的管理2.搜索目标地址所在的节点,MmLocateMemoryAreaByAddress()函数的实现。
2024-10-19 19:57:33
356
原创 3.1.1 内核对用户空间的管理MADDRESS_SPACE,MEMORY_AREA结构体的声明
3.1.1 内核对用户空间的管理MADDRESS_SPACE,MEMORY_AREA结构体的声明。
2024-10-19 19:39:51
391
原创 windows内核-调用门的实现
调用门无参的实现提示:以下是本篇文章正文内容,下面案例可供参考一、windbg查看GDTR表,查看cs=1b即18出的描述符00cffb000000ffff5.4调用门用指令eq 修改C0处用于构建调用门,还要修改c8处的内容,从1B中复制过来,调用门要跳到C8处指向1,这里如果不进行调用门的调整,指向是没法执行的,如果大家不装windbg本代码,执行汇报05从错误2,本套课程需要有汇编基础。
2024-10-17 12:50:19
359
原创 2.6.ReactOS系统中从内核中发起系统调用
上面我们已经可以看到用户空间(R3)进行系统调用的全过程即两种方法的具体实现。系统调用一般时从R3发起的。其实window也运行从内核进行系统调用,不过,一般而言在内核里面不能直接调用NtReadFile()一类函数。这方面是因为windows内核并不导出这些函数。另一方面也是应为这些函数往往要求在系统空间队长上有一个属于本次调用的自陷框架,从而内核中直接调用这些函数时显然没有这么一个口昂加,诚然。既然CPU已经运行在内核中,系统空间堆栈上就已经有这样的框架了。那可能时自陷框架,中断框架或者异常框架。
2024-10-17 12:24:01
826
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人