Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1266541
  • 博文数量: 482
  • 博客积分: 13297
  • 博客等级: 上将
  • 技术积分: 2890
  • 用 户 组: 普通用户
  • 注册时间: 2009-10-12 16:25
文章分类

全部博文(482)

文章存档

2012年(9)

2011年(407)

2010年(66)

分类: 嵌入式

2011-02-26 23:42:01

当一个任务(进程)执行系统调用而陷入内核代码中执行时,我们就称进程处于内核运行态(内核态)。在内核态下,CPU可执行任何指令。当进程在执行用户自己的代码时,则称其处于用户运行态(用户态)。用户态不能访问内核空间,包括代码和数据。

进程处于用户态时能访问的是用户空间,处于内核态时能访问的称为内核空间。

CPU执行程序所访问的地址都是虚拟地址,MMU 必须通过读取控制寄存器CR3中的值作为当前页面目录的指针,进而根据分页内存映射机制(参看相关文档)将该虚拟地址转换为真正的物理地址才能让CPU真正的访问到物理地址。

进程有4G的寻址空间,其中第一部分为“用户空间”,用来映射其整个进程空间(0x0000 0000-0xBFFF FFFF)即3G字节的虚拟地址;第二部分为“系统空间”,用来映射(0xC000 0000-0xFFFF FFFF)1G字节的虚拟地址。可以看出Linux系统中每个进程的页面目录的第二部分是相同的,所以从进程的角度来看,每个进程有4G字节的虚拟空间,较低的3G字节是自己的用户空间,最高的1G字节则为与所有进程以及内核共享的系统空间。

if(数据在物理内存中) 
        {        虚拟地址转换成物理地址 
                 读数据 } 
        else 
        {     if(数据在磁盘中) 
              { 
                     if(物理内存还有空闲) 
                     {          把数据从磁盘中读到物理内存 
                                 虚拟地址转换成物理地址 
                                 读数据 
                     } 
                     else 
                     {          把物理内存中某页的数据存入磁盘 
                                 把要读的数据从磁盘读到该页的物理内存中 
                                 虚拟地址转换成物理地址 
                                 读数据 
                     } 
              } 
              else 
              {     报错        } }

阅读(752) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2011-03-05 13:11:54

很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com