首页
学习
活动
专区
圈层
工具
发布

MmGetMdlVirtualAddress返回的是用户模式虚拟地址还是内核模式虚拟地址?

MmGetMdlVirtualAddress返回的是内核模式虚拟地址。

MmGetMdlVirtualAddress是Windows内核中的一个函数,用于获取描述内存页的MDL(Memory Descriptor List)结构对应的虚拟地址。MDL是内核中用于描述物理内存页的数据结构,它包含了一系列描述内存页的指针和长度信息。

由于MmGetMdlVirtualAddress是在内核模式下执行的函数,它返回的是内核模式下的虚拟地址。内核模式虚拟地址是操作系统内核在虚拟地址空间中使用的地址,它与用户模式虚拟地址是相互独立的。

在云计算领域中,内核模式虚拟地址通常用于操作系统内核和驱动程序的开发,用于访问和管理系统资源。它具有直接访问硬件和系统级功能的能力,因此在开发底层系统软件、驱动程序和高性能应用程序时非常重要。

腾讯云提供了一系列与云计算相关的产品和服务,例如云服务器、云数据库、云存储等。这些产品可以帮助用户快速构建和部署各种应用,提供高可用性、可扩展性和安全性。具体的产品介绍和相关链接可以参考腾讯云官方网站:https://cloud.tencent.com/

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

基于WDF的PCIPCIe接口卡Windows驱动程序(2)-开发者需要了解的WDF中的一些重要的概念

1开始计数吧~ 1、用户模式应用程序的虚拟地址空间除了为专用空间以外,还会受到限制。...在用户模式下运行的处理器无法访问为该操作系统保留的虚拟地址。限制用户模式应用程序的虚拟地址空间可防止应用程序更改并且可能损坏关键的操作系统数据; 2、在内核模式下运行的所有代码都共享单个虚拟地址空间。...这表示内核模式驱动程序未从其他驱动程序和操作系统自身独立开来。如果内核模式驱动程序意外写入错误的虚拟地址,则属于操作系统或其他驱动程序的数据可能会受到损坏。...一个用于驱动程序,另一个用于驱动程序包; 10、内核模式下的驱动程序在从用户地址中读取或写入这些地址时必须非常小心!...1)用户应用程序发起设备读取请求,程序提供缓冲区的起始地址以接受数据; 2)内核驱动程序启动读取操作并将控制权返回到其调用程序; 3)设备中断当前运行的任何线程以显示读取操作完成。

1.9K20

Linux内核 MMU的工作原理

这样设定好之后,当CPU 要访问一个VA 时,MMU都会检查CPU 当前处于用户模式还是特权模式,访问内存的目的是读数据、写数据、还是取指令,如果和操作系统设定的页面权限相符,就允许访问,把它转换成PA...用户空间和内核空间 通常操作系统把虚拟地址划分为用户空间和内核空间,例如 X86平台的Linux 系统虚拟地址空间是0x00000000 - 0xFFFFFFFF,前3GB(0x00000000 - 0xBFFFFFFF...用户程序加载到用户空间,在用户模式下执行,不能访问内核中的数据,也不能跳转到内核代码中执行。 这样可以保护内核,如果一个进程访问了非法地址,顶多这一个进程崩溃,而不会影响到内核和整个系统的稳定性。...总结下: 在正常情况下 ,处理器在用户模式执行用户程序,在中断或异常情况下处理器切换到特权模式执行内核程序,处理完中断或异常之后再返回用户模式继续执行用户程序。...段错误 段错误是这样产生的:用户程序要访问一个VA, 经MMU 检查无权访问,MMU 产生一个异常,CPU 从用户模式切换到特权模式,跳转到内核代码中执行异常服务程序。

2.3K20
  • VMM基础_MTM方法

    反之,translate on则实虚拟模式(可能通过多级映射),既上图显示的那种映射模式。...如前所述,每个(用户)进程都有它自己的有效地址空间,内核也有自己的有效地址空间。其中每个进程所涉及到的地址都是有效地址空间内的地址。...对于用户进程,不能把自己的有效地址和物理地址直接映射,因此上图的映射关系是省略了中间一个从虚拟地址到实地址映射环节的最终映射关系,真实情况还要增加一级映射过程,如下图所示: 下面我们来看一下具体的映射过程...还是要先说一些概念: Physical/Real Address Space 物理地址、实地址空间,这是服务器内存条接驳的地址线路标记的地址区间,这个地址空间大小由物理内存大小决定,可以在内核disable...其实有效地址到虚拟地址映射的目的是分割地址空间,增加安全性管理,使得普通进程在CPU处理时缺省就无法越界访问(只能访问自己所在有效空间的数据),而且,普通用户进程通常也无需访问过大的地址空间。

    30510

    内核知识第12讲,SSDT表.以用户模式到系统模式的两种方式.

    内核知识第12讲,SSDT表.以用户模式到系统模式的两种方式. 一丶IDT解析....IDT首地址给出了,其中表项是7ff 我们每一项是8个字节,所以 7ff/8 = 255 项.也就是IDT表中是0-256 其中重要的是有个int 3 我们对其 u,则可以看int 3的指令的....其中微软以前用到的是 2E的区域, 也就是说. 2E的表项是微软放函数地址的地方. 二丶查看int 2E 区域. 对其反汇编....也就是CurrentThread. 3.取得_KThread的 CPU运行模式. 核心代码  其中 EDI是我们传入的调用函数的序号. 首先EDI右移8位. ...而三环的代码段没有保存,原因是,采用GDT表的相邻结构.所以当切换的时候只需要加10或者-xx即可.  176MSR寄存器则保存了EIP 至于参数,当返回的是时候则会放到EDX和ECX中.

    83920

    如何将虚拟机的虚拟地址转化为宿主机的物理地址?

    背景介绍 一般情况下,Linux系统中进程的4GB内存空间被划分为2个部分-------用户空间和内核空间,大小分别为0~3G,3~4G。...用户进程通常,只能访问用户空间的虚拟地址,不能访问内核空间的虚拟地址。 什么是物理内存? 指通过物理内存条获得的内存空间,主要作用为在计算机运行时为操作系统和程序提供临时储存。 什么是虚拟内存?...内存虚拟化过程 虚拟机本质上是Host机上的一个进程,按理说可以使用Host机的虚拟地址空间,但是在虚拟化模式下,虚拟机处于非root模式,无法直接访问 Root 模式下的 Host 机上的内存。...:整个程序的内存空间连续(无论是程序以为的内存空间还是物理内存都是连续的),所以虚拟地址即表明了其是第几个内存空间。...显然 物理地址 = 基地址 + 虚拟地址 当分段时:整个程序的内存空间不再连续,每一段都有自己独特的基地址,但是虚拟地址还是相对于之前只有一个基地址时的值,那么此时虚拟地址就无法直接表示其在第几个内存空间了

    2.8K30

    linux系统编程之基础必备(一):计算机体系结构一点基础知识

    这样设定好之后,当CPU要访问一个VA时,MMU会检查CPU当前处于用户模式还是特权模式,访问内存的目的是读数据、写数据还是取指令,如果和操作系统设定的页面权限相符,就允许访问,把它转换成PA,否则不允许访问...通常操作系统把虚拟地址空间划分为用户空间和内核空间,例如x86平台的Linux系统虚拟地址空间是0x00000000~0xffffffff,前3GB(0x00000000~0xbfffffff)是用户空间...总结一下:在正常情况下处理器在用户模式执行用户程序,在中断或异常情况下处理器切换到特权模式执行内核程序,处理完中断或异常之后再返回用户模式继续执行用户程序....在调用结束之后,CPU再切换回用户模式,继续执行int$0x80的下一条指令,在用户程序看来就像函数调用和返回一样。eax和ebx的值是传递给系统调用的两个参数。...ebx的值是传给_exit的参数,表示退出状态。大多数系统调用完成之后会返回用户空间继续执行后面的指令,而_exit系统调用比较特殊,它会终止掉当前进程,而不是返回用户空间继续执行。

    1.4K50

    MIT 6.828 操作系统工程 lab2 通关指南

    (其实这部分基本的实验还是比较简单的,这些工具我都没用到) 这一点很关键: 从CPU上执行的代码开始,一旦进入保护模式(我们在boot/boot.S中完成的第一件事),就无法直接使用线性或物理地址。...page_lookup(): 返回映射到虚拟地址“ va”的页面。...否则,用户代码中的错误可能会覆盖内核数据,从而导致崩溃或更微妙的故障。用户代码也可能能够窃取其他环境的私有数据。请注意,可写权限位(PTE_W)同时影响用户代码和内核代码!...该地址范围用于向用户环境公开某些内核数据结构。最后,下面的地址空间 UTOP供用户环境使用;用户环境将设置访问该内存的权限。...x86内核通常不采用这种方法,因为x86的一种向后兼容模式(称为虚拟8086模式)已在处理器中“硬接线”以使用线性地址空间的底部.

    67810

    通过 Windows 用户模式回调实施的内核攻击

    KiFastCallEntry 在内核线程栈中存储一个陷阱帧(TRAP_FRAME)来保存当前线程上下文,并使在返回到用户模式时能够恢复寄存器的值。...当处理像“释放后重用”这样的内核堆损坏问题时,确切知道内核堆管理器如何工作是必不可少的。有很多非常好的文章详细说明了用户模式堆机制的内部工作机制 [13][6][9],这些可以在学习内核堆时作为参考。...由于内核和用户模式组件共享同样的虚拟地址空间,攻击者会潜在地能够通过映射零页并控制解引用数据来利用内核空指针解引用漏洞。...修改,但是使用虚拟地址描述符(AVD)似乎是一种更加合适的解决方案 [5]。...在缓解 win32k 中的利用以及 Windows 中的通用内核利用方面的重要的一步,是去除掉在用户和内核模式之间的共享内存区段。

    1.8K40

    虚拟内存 & IO & 零拷贝

    区分内核空间和用户空间本质上是要提高操作系统的稳定性及可用性。 2.1 内核态与用户态 当进程运行在内核空间时就处于内核态,而进程运行在用户空间时则处于用户态。...对于以前的 DOS 操作系统来说,是没有内核空间、用户空间以及内核态、用户态这些概念的。可以认为所有的代码都是运行在内核态的,因而用户编写的应用程序代码可以很容易的让操作系统崩溃掉。...具体过程是先把数据读取到内核空间中,然后再把数据拷贝到用户空间并从内核态切换到用户态。此时应用程序已经从系统调用中返回并且拿到了想要的数据,可以开开心心的往下执行了。...直到数据就绪,然后从内核态拷贝到用户态再返回。...如果你不作任何操作,内核还是会继续通知你。 ET 模式 ET(edge-triggered)是高速工作方式,只支持 no-block socket。

    2.1K20

    内存地址中藏着的学问

    我们可以将其做粗略划分,前两种模式是应用于32位平台,后两种模式是应用于64位平台。...我们还知道,在该地址空间内,不仅有我们的用户程序,还有内核代码(是的,内核代码也映射到了用户进程的虚拟地址空间)。...根据上面定义的虚拟地址的canonical address form,内核将虚拟地址空间进一步划分: ? 其把虚拟地址的47位为0的地址空间划给了用户代码,而47位为1的地址空间划给了内核代码。...这个大可放心,写内核的大神们早已经帮我们想好了兼容方式 ? 简单来说就是默认情况下,内核不会分配47位及其以上的虚拟地址空间给用户,除非用户指定要求,完美。...比如共享相同的内核代码,以及共享库代码,这样这些共用的代码就只占用一份内存,他们会以映射到进程虚拟地址空间的方式,供用户进程使用。

    1.5K20

    Linux下内存空间分配、物理地址与虚拟地址映射

    gfp_t flags:申请的标志(模式) 返回值:申请的空间首地址。...,malloc分配的是用户的内存 2.​ kmalloc保证分配的内存在物理上是连续的,vmalloc保证的是在虚拟地址空间上的连续 3.​ kmalloc能分配的大小有限,vmalloc能分配的大小相对较大...返回值:解除成功返回0,否则返回-1 2.2 Linux内核的mmap接口 2.2.1 内核描述虚拟内存的结构体 Linux内核中使用结构体vm_area_struct来描述虚拟内存的区域,其中几个主要成员如下.../io.h> 功能:将一个IO地址空间映射到内核的虚拟地址空间上去,便于访问; 实现:对要映射的IO地址空间进行判断,低PCI/ISA地址不需要重新映射,也不允许用户将IO地址空间映射到正在使用的RAM...(注意ioaddr是虚拟地址,而mmio_start是物理地址,它是BIOS得到的,肯定是物理地址,而保护模式下CPU不认物理地址,只认虚拟地址),ioaddr+0就是第一个寄存器的地址,ioaddr+

    3.9K31

    技术|Intel 设计缺陷背后的原因是什么?

    这些虚拟地址是连续的——不用担心有空隙——并且合适的大小也更便于操作。32位的程序仅可以看到32位的地址,而不用管物理地址是36位还是更多位。...虽然虚拟地址对每个软件几乎是透明的,但是,处理器最终还是需要知道虚拟地址引用的物理地址是哪个。因此,有一个虚拟地址到物理地址的映射,它保存在一个被称为页面表的数据结构中。...但是使用地址分割之后,用户程序和内核使用了相同的地址范围,并且从原理上来说,一个用户程序有可能去读写内核内存。 为避免这种明显不好的情况,处理器和虚拟地址系统有一个“Ring”或者“模式”的概念。...当运行内核代码时,处理器将处于Ring0——supervisor模式,也称为内核模式。 这些Ring也用于从用户程序中保护内核内存。...其它的一些平台,比如SPARC和IBM的S390,是不受这个问题影响的,因为它们的处理器的内存管理并不需要分割地址空间和共享内核页面表;在这些平台上的操作系统一直就是将它们的内核页面表从用户模式中隔离出来的

    57640

    xv6(3) 内存管理部分

    内存管理部分 内存管理这部分我没有集中在一起叙述,本节只是讲述物理内存如何组织管理,页表的内核部分如何创建的,与地址转换的在启动理论那一块儿说了,虚拟地址空间的用户部分在进程那儿叙述,堆内存管理也在进程那一块儿讲述...用户态部分的我们还没有涉及,用户态下的虚拟地址到物理地址之间没有什么特定的关系,转换就必须要使用页表了,相关部分在进程我们再详述,这里只关注内核部分。...cr3寄存器,cr3存放的是页目录物理地址 } kpgdir 是个全局变量,为内核页表的地址,kvmalloc() 调用 setupkvm() 建立页表,返回的页表地址赋给 kpgdir,然后调用 switchkvm...在切换到正式页表前,因为虚拟地址空间的低地址和高地址都有内核的映射,我们可以说内核处于低地址,也可以说内核处于高地址,没得问题。现在,切换到正式页表,不映射低 4M 的虚拟地址空间,低地址是用户用的。...现在已经建立了正式的内核页表,映射了整个内核部分,有更多的虚拟地址空间可用,所以可以初始化更多的内存了,因此有了 kinit2,初始化的区域是 4M 到 PHYSTOP,这个宏定义可以在一定范围内改变

    43610

    linux之用户空间和内核空间

    Linux简化了分段机制,使得虚拟地址与线性地址总是一致,因此,Linux的虚拟地址空间也为0~4G。Linux内核将这4G字节的空间分为两部分。...而将较低的3G字节(从虚拟地址 0x00000000到0xBFFFFFFF),供各个进程使用,称为“用户空间)。因为每个进程可以通过系统调用进入内核,因此,Linux内核由系统内的所有进程共享。...内核空间中存放的是内核代码和数据,而进程的用户空间中存放的是用户程序的代码和数据。不管是内核空间还是用户空间,它们都处于虚拟空间中。...内核空间和用户空间一般通过系统调用进行通信。 如何判断一个驱动是用户模式驱动还是内核模式驱动? 判断的标准是什么?...用户空间模式的驱动一般通过系统调用来完成对硬件的访问,如通过系统调用将驱动的io空间映射到用户空间等。因此,主要的判断依据就是系统调用。

    4.5K20

    Linux 是如何管理内存的?

    举个例子来说,在 32 位 x86 架构的机器上,栈开始于 0xC0000000,这是用户模式下进程允许可见的 3GB 虚拟地址限制。...prot 决定了映射文件的保护位,保护位可以标记为 可读、可写、可执行或者这些的结合。第四个参数 flags 能够控制文件是私有的还是可读的以及 addr 是必须的还是只是进行提示。...物理和虚拟寻址模式 大多数多功能处理器都支持 物理地址模式和虚拟地址模式的概念。物理寻址模式不需要页表,并且处理器不会在此模式下尝试执行任何地址转换。Linux 内核被链接在物理地址空间中运行。...大多数处理器至少具有两种执行模式:内核态和用户态。你不希望访问用户执行内核代码或内核数据结构,除非处理器以内核模式运行。 ?...KRE 内核模式运行下的代码可以读取页面 URE 用户模式下的代码可以读取页面 KWE 以内核模式运行的代码可以写入页面 UWE 以用户模式运行的代码可以写入页面 页框号 对于设置了 V 位的 PTE,

    2.4K20

    x86虚拟内存和qemu内存虚拟化

    每个进程有自己的页目录,其中page table中关于内核部分指向相同,借用网上的这张图说明一下,假设CPU是32位,内核空间1G,用户态空间3G。 ?...用户态malloc一块内核,用虚拟地址访问发生pagefault,内核找一个page然后对应起来,那内核分配一个page的内存,内核先得到的是这个page的物理地址,然后把物理地址转换成内核虚拟地址,总之内核管理物理内存...也许是因为MMU不是一开始就开启的,内核在CPU处于实模式时创建early_level4_pgt和init_level4_pgt,切换到保护模式才开启MMU了,内核虚拟空间和物理内核一一对应是实模式要求这样的...,如果不这样实模式时就没法操作了,要理解虚拟内存肯定得看懂实模式时代码干的活,否则还是有点虚。...32位CPU可以访问的物理内存最大是4G,但有了PAE就不一样了,一个CPU的虚拟地址空间还是4G,只是这4G不再局限于映射到物理低4G上了,可以访问的最大物理空间总和一定不会超过4G,总的几级页结构换算出来的值一定是

    1.5K10

    Liunux内核内存管理之虚拟地址空间

    其实我们讲的每个进程都有4G虚拟地址空间,讲的都是“可以寻址”4G,意思是虚拟地址的0-3G对于一个进程的用户态和内核态来说是可以访问的,而3-4G是只有进程的内核态可以访问的。...内核用的896M虚拟地址是直接映射的,意思是只要把虚拟地址减去一个偏移量(3G)就等于物理地址。同样,这里指的还是寻址,实际使用前还是要分配内存。而且896M只是个最大值。...进程的虚拟地址空间分为用户区(03G)和内核区(34G), 其中内核区是受保护的, 用户是不能够对其进行读写操作的; 内核区对于所有进程是共享的;系统中所有进程对应的虚拟地址空间的内核区都会映射到同一块物理内存上...这样设定之后,当CPU要访问一个VA(Virtual Address)时,MMU会检查CPU当前处于用户模式还是特权模式,访问内存的目的是读数据、写数据还是取指令执行,如果与操作系统设定的权限相符,则允许访问...在正常情况下处理器在用户模式执行用户程序,在中断或异常情况下处理器切换到特权模式执行内核程序,处理完中断或异常之后再返回用户模式继续执行用户程序。

    1.2K20

    MIT 6.S081 (BOOK-RISCV-REV1)教材第四章内容 --Trap -- 上

    ,并强制将控制权转移到处理该事件的特殊代码上: 一种情况是系统调用,当用户程序执行ecall指令要求内核为其做些什么时; 另一种情况是异常:(用户或内核)指令做了一些非法的事情,例如除以零或使用无效的虚拟地址...如果内核清空SIE,RISC-V将推迟设备中断,直到内核重新设置SIE。SPP位指示陷阱是来自用户模式还是管理模式,并控制sret返回的模式。...trampoline 符号是一个占位符标记,并不包含任何指令地址,它的存在只是为了让代码可以被正确地映射到用户空间和内核空间相同的虚拟地址: uservec用于用户态进入内核态时,进行用户态寄存器上下文环境的保存...xv6使用包含uservec的蹦床页面(trampoline page)来满足这些约束。xv6将蹦床页面映射到内核页表和每个用户页表中相同的虚拟地址。这个虚拟地址是TRAMPOLINE。...在退出的过程中,usertrap检查进程是已经被杀死还是应该让出CPU(如果这个陷阱是计时器中断)。

    68121

    java的线程是用户态还是内核态_内核态和用户态的区别

    大家好,又见面了,我是你们的朋友全栈君。 内核态用户态是什么? 操作系统对程序的执行权限进行分级,分别为用户态和内核态。...用户态相比内核态有较低的执行权限,很多操作是不被操作系统允许的,简单来说就是用户态只能访问内存,防止程序错误影响到其他程序,而内核态则是可以操作系统的程序和普通用户程序 内核态: cpu可以访问计算机所有的软硬件资源...而系统调用的机制其核心还是使用了操作系统为用户特别开发的一个中断来实现,列表liunx的int 80h中断 异常 当cpu在运行在用户态下的程序时,发生了些某些事先不可知的异常,这时会触发由当前运行进程切换此异常的内核相关程序中...,那么这个转换的过程自然也就发生了由用户态到内核态的切换,比如硬盘读写操作完成,系统会切换到硬盘读写的中断处理程序中执行后续操作等 Java线程是用户态还是内核态 Java线程在jdk1.2之前,是基于称为...将栈指针设置指向内核栈地址。 将程序计数器设置为一个事先约定的地址上,该地址上存放的是系统调用处理程序的起始地址。 而之后从内核态返回用户态时,又会进行类似的工作。

    1.5K50

    Linux 中的用户模式和内核模式是什么含义?

    Linux 中的用户模式和内核模式是什么含义?1. 引言在 Linux 系统中,用户模式和内核模式是操作系统的两种不同运行模式。...本文将深入探讨这两种模式的含义、区别以及运行原理,帮助读者更好地理解 Linux 系统的运行机制。2. 用户模式用户模式,也被称为用户空间,是 Linux 系统中应用程序运行的模式。...但是,用户模式下的应用程序不能直接访问系统硬件资源和系统数据,需要通过系统调用接口向操作系统请求服务。3. 内核模式内核模式,也被称为核心空间,是 Linux 系统中操作系统运行的模式。...操作系统接收到应用程序的请求后,在内核模式下处理相应的任务。 操作系统处理完任务后,将结果返回给应用程序。 应用程序接收到操作系统返回的结果后,继续执行相应的操作。...5.3 驱动程序驱动程序是一种特殊的系统软件,用于实现操作系统与硬件设备之间的通信。驱动程序在内核模式下运行,可以访问系统硬件资源。

    1.6K00
    领券