Chinaunix首页 | 论坛 | 博客
  • 博客访问: 519957
  • 博文数量: 96
  • 博客积分: 2102
  • 博客等级: 上尉
  • 技术积分: 1695
  • 用 户 组: 普通用户
  • 注册时间: 2012-04-11 22:12
文章分类

全部博文(96)

文章存档

2014年(2)

2012年(94)

分类: C/C++

2012-04-21 12:52:09

     虚存映射:Linux并不将映射装入物理内存,相反,可执行文件被链接到进程的用户空间中。随着进程的运行,被引用的程序部分会由操作系统装入到物理内存,这种将映像链接到进程用户空间的方法成为“虚存映射”
     分类:
  • 共享映射:有几个进程共享这一映射,即一个进程对其进行修改对于其他进程也是可见
  • 私有映射:进程创建这种映射是为了读文件,因此,对于虚存区的写操作不会修改磁盘上的文件,由此可见,私有映射效率比共享映射效率高
  • 匿名映射:映射与文件无关,叫做匿名映射

   对于虚存映射是通过vm_area_struc t的链表或红黑树进行组织的,每一个vm_area_struct 结构代表可执行映像的一部分,可能是可执行代码、初始化的变量、未初始化的数据、也可能是港大恺的一个文件,这些映射通过mmap()系统调用对应的do_mmap 内核函数实现的 。在/proc/进程号/maps中查看虚存区。

   mmap():在进程的用户空间内创建一个新的虚存区

   Linux2.4内核中实现代码: 

  #define  0x10 /* Interpret addr exactly */

   #define     0x20                        /* don't use a file */ 

  #define  0x0800 /* ETXTBSY */

   #define 0x1000                   /* mark it as an executable *

sysmap()

  1. asmlinkage unsigned long sys_mmap (unsigned long addr, unsigned long len, int prot, int flags, int fd, long off, long arg6, long arg7, long stack)
  2. { struct pt_regs *regs = (struct pt_regs *) &stack;
  3.    if ((off & ~PAGE_MASK) != 0)
  4.        return -EINVAL; addr = do_mmap2(addr, len, prot, flags, fd, off >> PAGE_SHIFT);
  5.    if (!IS_ERR((void *) addr))
  6.        regs->r8 = 0; /* ensure large addresses are not mistaken as failures... */
  7. return addr;
  8. }

   do_mmap2()



  1. static inline long do_mmap2(unsigned long addr, unsigned long len,unsigned long prot, unsigned long flags,unsigned long fd, unsigned long pgoff) {
  2.     int error = -EBADF;
  3.     struct file * file = NULL;
  4.     flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE);
  5.     if (!(flags & MAP_ANONYMOUS)) {/*使用文件映射*/
  6.     file = fget(fd);/*获取该文件描述符对应的struct file 的结构体,并且对文件计数加一*/
  7.     if (!file)
  8.     goto out;
  9.     }
  10.    down(&current->mm->mmap_sem);/*P操作:减少一个信号量资源,保证当前进程的用户空间信息的统一*/
  11.    error = do_mmap_pgoff(file, addr, len, prot, flags, pgoff);
  12.    up(&current->mm->mmap_sem);/*V操作:增加一个信号量的资源*/
  13.    if (file)
  14.       fput(file);/*对于文件计数减一,如果最后为0,则将该结构体资源进行释放*/
  15.   out:
  16.      return error;
  17. }
  主要实现机制在:do_mmap_pgoff(file, addr, len, prot, flags, pgoff)
                                  根据file、len、pgoff与相应条件进行判断
                                                                  |
                                                                  |
                                 判断标志位flag:SHARED 、 PRIVATE or 匿名
                                                                  |
                                                                  |
                                                 
& ==0
                                                                  |
                                                                  |                                 
                                    = (, )
                                                                  |
                                                                  |
                      = (, );       
                                                                  |
                                                                 
|                                                                               
                                                      初始化变量vma
                                                                  |
                                                                  |
                            如果在以上过程中出错或条件不满足,则进行首位处理,回收资源

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