Linux系统--进程地址空间之虚拟地址空间

    Linux系统,支持物理内存虚拟化,即进程并不直接在真实物理地址上寻址,而是由Linux内核为每一进程维护了一个特殊的虚拟地址空间(virtual address space)。这个地址空间是线性的,从0开始寻址,到某个最大值(不同操作系统或不同位数的系统可能不一样)。
    虚拟地址空间由许多页(page)组成。典型的页大小是4096 bytes(4K, 32位系统)和8192bytes(8K,64位系统)。每个页面都有有效(valid)和无效(invalid)两种状态,一个valid page和一个物理页或一些二级存储介质相关联,例如一个交换分区或磁盘上的文件。
    一个进程不能直接访问一个存储在二级存储中的页,除非这个页和物理内存中的页相关联的。如果进程尝试进行这样的访问,存储器管理单元(MMU)会产生页错误(page fault),内核会从二级存储换入需要的页面。例如你对磁盘文件进行读取,这就导致IO操作,当然这些操作是内核级的,对用户透明的。当然系统为了满足各进程对内存的需求(物理内存有限),也经常性的将物理页面换出到虚拟地址页面。
    说到这里,笔者联想到了一种开发调试过程中经常遇到错误:段错误(segmentation fault)。造成这种错误的原因是,对无效页面(invalid)的非法访问,它与页错误有根本的区别: 页错误是操作系统的一种机制,而段错误是访问未初始化的页面造成的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章