首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

3.2 Windows驱动开发:内核CR3切换读写内存

CR3是一种控制寄存器,它是CPU中的一个专用寄存器,用于存储当前进程的页目录表的物理地址。在x86体系结构中,虚拟地址的翻译过程需要借助页表来完成。...在这个过程中,操作系统会将每个进程的页目录表的物理地址存储在它自己的CR3寄存器中。当进程切换时,操作系统会修改CR3寄存器的值,从而让CPU使用新的页目录表来完成虚拟地址的翻译。...利用CR3寄存器可以实现强制读写特定进程的内存地址,这种操作需要一定的权限和技术知识。在实际应用中,这种操作主要用于调试和漏洞挖掘等方面。...同时,由于CR3寄存器的读写属于有痕读写,因此许多驱动保护都会禁止或者修改CR3寄存器的值,以提高系统的安全性,此时CR3读写就失效了,当然如果能找到CR3的正确地址,此方式也是靠谱的一种读写机制。...接下来,函数使用了汇编指令_disable()来禁用中断,然后调用__readcr3()函数获取当前系统的CR3寄存器的值,保存在变量OldCr3中。

90410

驱动开发:内核CR3切换读写内存

首先CR3是什么,CR3是一个寄存器,该寄存器内保存有页目录表物理地址(PDBR地址),其实CR3内部存放的就是页目录表的内存基地址,运用CR3切换可实现对特定进程内存地址的强制读写操作,此类读写属于有痕读写...,多数驱动保护都会将这个地址改为无效,此时CR3读写就失效了,当然如果能找到CR3的正确地址,此方式也是靠谱的一种读写机制。...Peprocess = NULL;DWORD PID = 6672;NTSTATUS nt = PsLookupProcessByProcessId((HANDLE)PID, &Peprocess);通过CR3...改掉了读取不到该寄存器该如何处理,这里我找到了一段参考代码,可以实现寻找CR3地址这个功能。...保存当前所属进程ID 的对象ULONG64 vTpDataObject = *(PULONG64)vTpDataObjectBase;DebugPrint("数据对象:0x%016llx, 真实CR3

79930
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    内核必须懂(七): Linux四级页表(x64)

    目录 前言 Intel四级页表 实操寻址 获取cr3 获取PGD 获取PUD 获取PMD 获取PTE 获取内容 最后 ---- 前言 Linux四级页表的作用主要就是地址映射, 将逻辑地址映射到物理地址...Linux的四级页表就是依据CPU的四级页表来设计的. 这里主要说的就是Intel x64页面大小为4KB的情况, 如图所示: ?...---- 获取cr3 这之中最关键的是cr3地址以及局部变量地址, 这里看到, 变量地址是0x7ffdcbffaba8, 变量值是0x1234567890ABCDEF. cr3寄存器中地址是0x40c78000...当然了, 按照CPU的图示, cr3肯定是指向PML4E. 在Linux当中, 第一级页表称为PGD, 当然是有历史原因的, 可以自行google....所以Linux的四级页表分别是PGD -> PUD -> PMD -> PTE. ? ---- 获取PGD 想要获取PGD中的内容需要通过计算. 这里先来处理一下局部变量地址.

    7.2K40

    Linux内核分析与应用2-内存寻址

    本系列是对 陈莉君 老师 Linux 内核分析与应用[1] 的学习与记录。...CR3寄存器存放页目录基地址 (对) .x86的保护模式就是来保护操作系统的 (错) . 分页的原理使得每个进程可以拥有自己独立的虚拟内存空间 (对) ....分Linux之所以巧妙地绕过段机制,主要是因为将段的基址设为0,即偏移量等于线性地址 (对) ....D A.CR0 B.CR1 C.CR2 D.CR3 “控制寄存器(Control Register)(CR0~CR3)用于控制和确定处理器的操作模式以及当前执行任务的特性。...CR0中含有控制处理器操作模式和状态的系统控制标志; CR1保留不用; CR2含有导致页错误的线性地址; CR3中含有页目录表物理内存基地址,因此该寄存器也被称为页目录基地址寄存器PDBR(Page-Directory

    22730

    页表工作原理详解

    页表的工作方式 Linux从头学15:【页目录和页表】-理论 + 实例 + 图文的最完全、最接地气详解 地址的简单解释: ​ 物理地址: 物理地址就是内存单元的绝对地址,比如一个 128MB 的 DRAM...【全网首发】深度剖析 Linux 伙伴系统的设计与实现 页表的知识铺垫: 操作系统在加载用户程序的时候,不仅仅需要分配物理内存,来存放程序的内容;而且还需要分配物理内存,用来保存程序的页目录和页表。...CR3寄存器 ​ 现在,所有页表的物理地址被页目录表项指向了,那么页目录的物理地址,处理器是怎么知道的呢❓❓❓ ​ 答案就是通过 CR3 寄存器,也叫做: PDBR(Page Table Base Register...当操作系统调度任务的时候,处理器就会找到即将执行的新任务的 TSS 段信息,然后把新任务的页目录开始地址更新到 CR3 寄存器中。...页处理单元就会从 CR3 寄存器中保存的页目录表开始,把这个线性地址最终转换成物理地址。 当然,处理器中还有一个快表,用来加快从线性地址到物理地址的转换过程。 ​CR3寄存器的格式如下:

    1.4K20

    操作系统的几种地址详解

    文字描述太累,看图直观一些:  如上图, 1、分页单元中,页目录是唯一的,它的地址放在CPU的cr3寄存器中,是进行地址转换的开始点。万里长征就从此长始了。...——运行一个进程,需要将它的页目录地址放到cr3寄存器中,将别个的保存下来。...5.Linux的页式内存管理 原理上来讲,Linux只需要为每个进程分配好所需数据结构,放到内存中,然后在调度进程的时候,切换寄存器cr3,剩下的就交给硬件来完成了(呵呵,事实上要复杂得多,不过偶只分析最基本的流程...——运行一个进程,需要将它的页目录地址放到cr3寄存器中,将别个的保存下来。...5.Linux的页式内存管理 原理上来讲,Linux只需要为每个进程分配好所需数据结构,放到内存中,然后在调度进程的时候,切换寄存器cr3,剩下的就交给硬件来完成了(呵呵,事实上要复杂得多,不过偶只分析最基本的流程

    1.9K10

    Linux内存描述之高端内存--Linux内存管理(五)

    每当一个进程被调度(schedule())即将进入运行态时,Linux内核都要用该进程的PGD指针设 置CR3(switch_mm())。...的改变但会引起堆栈的改变 Linux 简化了分段机制,使得虚拟地址与线性地址总是一致,因此,Linux的虚拟地址空间也为0~4G。...在进程切换时,要将寄存器CR3设置成指 向新进程的页目录PGD,而该目录的起始地址在内核空间中是虚地址,但CR3所需要的是物理地址,这时候就要用__pa()进行地址转换。...next_pgd,通过__pa()转换成物理地址,存放在某个寄存器中,然后用mov指令将其写入CR3寄存器中。...经过这行语句的处理,CR3就指向新进程next的页目录表PGD了。

    12.4K23

    Linux分页机制之分页机制的演变--Linux内存管理(七)

    正在使用的页目录的物理地址存放在控制寄存器CR3中。...但是Linux并没有采用这种机制 正如前面所述,通过设置页目录项的Page Size标志启用扩展分页功能。在这种情况下,分页单元把32位线性地址分成两个字段: Directory:最高10位。...若这个标志为0,只有当CPL小于3(这意味着对于Linux而言,处理器处于内核态)时才能对页寻址;若该标志为1,则总能对页寻址。...第9~11位由操作系统专用,Linux也没有做特殊之用。 ? 80386的每个页目录项指向一个页表,页表最多含有1024个页面项,每项4个字节,包含页面的起始地址和有关该页面的信息。...CR3包含着页目录的起始地址,用32位线性地址的最高10位A31~A22作为页目录的页目录项的索引,将它乘以4,与CR3中的页目录的起始地址相加,形成相应页表的地址。

    1.9K20

    linux内核上下文切换解析

    linux的上下文切换就是进程线程的切换,也就是切换struct task_struct结构体,一个任务的上下文包括cpu的寄存器,内核栈等,由于1个cpu上的所有任务共享一套寄存器,所以在任务挂起的时候需要保存寄存器...但是Linux为了适用更多的cpu架构没使用处理器相关的上下文切换技术,而是大部分通过软件实现。linux上下文切换就在schedule()函数里,很多地方都会调用这个函数。...先看一段linux2.6.18版本还使用O(1)调度算法的schedule函数代码: /* * schedule() is the main scheduler function. */ asmlinkage...= next); //如果next的cpuvm标志位没有置位,说明处于tlb懒惰模式,则需要重新装载 //cr3 if (!...从整体看流程 由schedule函数到context_switch,context_switch主要切换mm(cr3页表寄存器),寄存器,内核栈。

    1.2K31

    一文读懂 HugePages(大内存页)的原理

    在介绍 HugePages 之前,我们先来回顾一下 Linux 下 虚拟内存 与 物理内存 之间的关系。...一、内存映射 我们来看看在 64 位的 Linux 系统中(英特尔 x64 CPU),虚拟内存地址转换成物理内存地址的过程,如图2: 从图2可以看出,Linux 只使用了 64 位虚拟内存地址的前 48...另外,CPU 有个名为 CR3 的寄存器,用于保存 页全局目录 的起始物理内存地址(如图2所示)。...所以,虚拟内存地址转换成物理内存地址的过程如下: 从 CR3 寄存器中获取 页全局目录 的物理内存地址,然后以虚拟内存地址的 39 ~ 47 位作为索引,从 页全局目录 中读取到 页上级目录 的物理内存地址...比如调用 fork 系统调用创建子进程时,内核使用了 写时复制 的技术(可参考《Linux 写时复制机制原理》一文),在父子进程内存发生改变时,需要复制更大的内存页,从而影响性能。

    1.1K20
    领券