/io过程
进程请求io操作read() -> 使用本地方法执行系统调用read -> 内核程序(由cpu执行)向dma发送io命令 -> dma将数据写
入内核内存缓冲区 -> 缓冲区装满 -> 内核把数据从内核空间的临时缓冲区拷贝到进程执行系统调用read指定的缓冲区
■(本地调用到java内存的过程待弄清)
/虚拟地址与物理地址的映射规则
(1)程序要运行,首先要将源代码编译成可载入内存的目标模块,然后静态或者动态去链接这些模块或所需的函数库,把这
些模块加载进内存,即是 编译-> 链接(静态) -> 装入内存 或者 编译 -> 装入内存 -> 链接(动态)
(2)虚拟地址指程序中使用的地址,这种地址是相对于程序的起始位的,也称为逻辑地址,在程序编译时每个目标模块的虚
拟地址都是从0开始编号,32位cpu对应32位操作系统,在程序中的指针用4字节表示,可映射到4G的虚拟地址空间
(3)内存是由存储单元组成的,存储单元都有编号,这个编号就是物理地址,物理地址是内存的绝对地址
(4)为了保证cpu执行指令时能正确访问存储单元,程序被加载进内存时(静态重定位)或需要执行时(动态重定位)要进行地
址映射,即把虚拟地址映射到物理地址,动态重定位方式使得程序可在内存中移动
/分页
(1)分页机制中,内存的分块的大小由cpu决定,然后由操作系统选择等同的页的大小.
(2)分页的思想是程序运行时用到哪页就为哪页分配内存,没用到的页暂时保留在硬盘上(页表中页与程序文件的映射)。
当用到这些页时再在物理地址空间中为这些页分配内存,然后建立虚拟地址空间中的页和刚分配的物理内存页间的映射(
同样用页表记录映射信息)
(3)当一个PE文件(PE文件是微软Windows操作系统上的程序文件)执行时,操作系统会先为该程序创建一个4GB的进程虚拟
地址空间。前面介绍过,虚拟地址空间只是一个中间层而已,它的功能是利用一种映射机制将虚拟地址空间映射到物理
地址空间,所以,创建4GB虚拟地址空间其实并不是要真的创建空间,只是要创建那种映射机制所需要的数据结构而已,
这种数据结构就是页目和页表。
/整体过程
st1 程序文件被执行
st2 系统建立程序文件与页的映射,即页和页表,4GB虚拟地址空间共可以分成1048576个页,按程序的需要分配
st3 执行程序时cpu发现虚拟地址对应的物理地址不存在 -> 交给操作系统处理
st4 操作系统为对应的页在内存分配一个空间,并将映射信息记录到页表
st5 程序继续执行,此时虚拟地址对应的物理空间已分配,物理空间对应的页对应的文件中的数据已经载入内存空间
详细参考:http://blog.youkuaiyun.com/qingfeng_happy5/article/details/4322723
/相关概念
(1)页面文件,这个是硬盘上的一块空间,在Windows下表现为一个文件。这个页面文件存在的意义就是在物理内存被占用
满以后,将物理内存中的东西移动到硬盘上的这个空间,腾出物理内存给需要的应用程序来使用。
(2)交换区,这个是物理内存和页面文件空间的总和,“交换”的含义,则是指在硬盘文件、CPU和其它IO之间进行数据
的传递和暂存
(3)■程序运行时,其全部信息都装入虚拟存储区,运行需要的信息载入内存,所以可以将程序数据分页或分段,同时将内存
对应划分单元,以块号标识,以页或段为单位进行内存区与虚拟存储区的进程数据调度
(3)系统为每一进程建立一张页表/段表,实现从页号/段号到物理块号的映射
(4)请求分页系统中的外存分为对换区和文件区
(5)unix方式: 与进程有关的文件放在文件区,未运行的页面应从文件区调入,曾经运行但又被换出的页面被放在对换区,
下次调入从对换区调入,进程请求的共享页面可能已被其他进程调入,无需再从对换区调入.
/把内核空间地址与用户空间的虚拟地址映射到同一个物理地址,这样,DMA 硬件(只能访问物理内存地址)就可以填充
对内核与用户空间进程同时可见的缓冲区■
/■虚拟地址和虚拟存储管理的区别