1.R3和R0
用户模式和内核模式
当我们开始一个应用层的程序,操作系统惠威改程序分配一个一个私有的虚拟地址空间和私有句柄表。因为地址空间是私有的,所以一个应用程序不能改变其他的应用程序的数据,每个应用程序都是独立的,当一个应用程序crash了,这个崩溃也仅限于这个程序,其他程序不会受影响。
在内核中运行的代码共享一个虚拟地址空间,这意味着内核驱动并不是与操作系统和其他驱动是相互独立的,当内核驱动崩溃了,整个系统也就崩溃了
R3和R0的交互
2.虚拟地址空间
当一个进程读取或写入一个内存位置,是通过虚拟地址来进行寻址的。在读或写的时候,进程将虚拟地址转为物理地址,优点
1.程序可以使用一个连续的虚拟地址来访问一个很大的内存区域,但是这个内存区域并不是连续的物理内存
2.程序使用虚拟地址可以访问远大于可用内存大小的内存缓冲区,随着可用内存的减小,内存管理器保存页面的物理内存到磁盘文件(通常4Kb大小),随着运行的需要,页的数据或代码在物理内存和磁盘间移动。
3.不同进程上的虚拟地址是独立的,一个进程上的代码不能改变其他进程正在使用的物理内存
进程的可用虚拟地址范围为该进程的虚拟地址空间,每个应用程序都有其私有的地址空间,对于32位处理 虚拟地址空间为 0x00000000到0x7FFFFFFF的2G大小。而对于64位为从0x000 0000 0000到0x7FF FFFF FFFF 的8T空间,虚拟地址范围被称为虚拟内存大小
每个进程有自己独立的从0x000 0000 0000到0x7FF FFFF FFFF 的8T虚拟地址空间
Notepad有三个连续的虚拟地址,但是这三个连续的虚拟地址映射的物理地址并不连续,另不同的进程用了同一块虚拟地址,但这个虚拟地址在不同进程映射的物理地址并不相同。
3用户空间和系统空间
像Notepad.exe 和 MyApp.exe都运行在用户态。操作系统和许多驱动都运行在更有优先级的内核态
在32位系统中所有可用的虚拟地址为4G,通常低2G为用户空间 高2G为系统空间
在32位系统中,再启动的时候你可以定义超过2g的内存空间为用户空间,系统空间的虚拟地址将会变小。增加用户空间大小,使用BCDEdit/increaseuserva设置
在64位系统中,理论上可用的虚拟地址大小为2·64位,但是仅仅很小的一部分16Eb可用。从0x000 0000 0000到0x7FF FFFF FFFF 的8TB为用户空间,部分从0xFFFF 0800 0000 0000 到0xFFFF FFFF FFFF FFFF的248TB被称为系统空间
在用户模式下运行的代码可以访问用户空间,但是不能访问系统空间,这个限制能阻止用户模式的代码可以读或者改变被保护的系统数据结构。运行在内核模式的代码可以访问用户空间和系统空间。也就是说,在内核模式运行的代码可以访问系统和当前用户模式进程的虚拟地址空间。
在内核态的驱动必须十分小心的处理直接读和写到用户态的地址中
1.一个用户态的程序发起一个请求去某设备读一些数据,该程序必须提供一个接收数据的缓冲区地址。
2在内核态的设备驱动程序开始读操作并返回给他的调用者一个控制器。
3.之后不论当前线程是否在处理,设备中断发起读操作已完成,中断是在任意线程上运行内核驱动程序处理的,这个过程是属于任意的进程。
4同时,驱动程序不能往步骤一的用户态程序提供的起始地址写数据。这个地址在发起请求的进程的虚拟地址空间中,有可能与当前进程的虚拟地址不同
4.分页池和非页池
在用户空间中,所有的物理地址页可以根据需要换出到磁盘文件,在系统空间中,一些物理地址页也可以被换出,但其他的不能。系统分配的内存空间有两个区域:分页池和非页池。在64位中 分页池是从0xFFFF A800 0000 0000 到0XFFFF A81F FFFF FFFF的128GB 非页池为0xFFFF AC00 0000 0000 到0XFFFF AC1F FFFF FFFF的128GB