字符驱动cdev下的--------虚拟内存机制、用户空间与内核地址空间(基本知识2)

Linux 操作系统和驱动程序运行在内核空间应用程序运行在用户空间,两者不能简单地使用指针传递数据,因为Linux使用的虚拟内存机制,用户空间的数据可能被换出,当内核空间使用用户空间指针时,对应的数据可能不在内存中。

虚拟内存机制:Windows中应用程序实际用到的内存,主要由两种介质构成:1、物理内存 2、硬盘上的页面交换文件(swap){MMU把虚拟内存映射到实际内存和SWAP},这两种介质在存储的数据上的区别在于:页面交换文件中存储的数据为内存中相对来说不常用的数据。由于该措施对应用程序来说是透明的,下文所说的“物理内存”即同时包含了这两种介质,不作区分。
程序启动的步骤:
当使用普通读写函数时(WriteFile及ReadFile等),系统为应用程序分配4G的虚拟地址空间,这时分配的仅是地址空间,并没有实际的数据。当执行第一行代码时,系统将读取文件的部分内容(不同的系统读取的数量不同,但在同一个系统中读取的大小是固定的,应为页大小的整数倍)并加载到物理内存中,之后将要执行的虚拟地址空间中的虚拟地址与之前读入的物理内存中的地址建立一个映射(利用页表),然后就可以开始执行虚拟地址空间中的代码了。
程序代码执行的步骤:
由于虚拟地址中的代码总有物理地址与之对应,在执行虚拟地址中的代码时会根据页表里的值来找到对应的物理地址,若物理地址在物理内存(这里指的是真正的物理内存,不包含页面交换文件)中,则直接读取执行,否则引发一个缺页中断,去硬盘上的页面交换文件中读取数据,当然这个过程对于应用程序来说也是透明的。

1、内存在计算机中的作用很大,电脑中所有运行的程序都需要经过内存来执行,如果执行的程序很大或很多,就会导致内存消耗殆尽。为了解决这个问题,Windows中运用了虚拟内存技术,即拿出一部分硬盘空间来充当内存使用,当内存占用完时,电脑就会自动调用硬盘来充当内存,以缓解内存的紧张。

硬盘上的页面交换文件:老式的操作系统中,物理存储器被认为是机器中内存的总量。换句话说,如果一台机器装有16 MB内存,那么应用程序最多可以使用16 MB内存。当今的操作系统能让磁盘空间看起来像内存一样。磁盘上的文件一般被称为页交换文件(paging file),其中包含虚拟内存,可供任何进程使用。

虚拟地址空间只是操作系统为进程“虚拟”出来的一块地址区域,并不代表任何实际的空间。而“页交换文件”却对应了实际的空间,这个空间一般是磁盘上名为“pagefile.sys”的文件

虚拟地址空间、页交换文件、物理内存三者的关系如下图:

发布了165 篇原创文章 · 获赞 26 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/weixin_42269817/article/details/103896375