首页 | 互联网 | IT动态 | IT培训 | Cisco | Windows | Linux | Java | .Net | Oracle | 软件测试 | C/C++ | 嵌入式开发 | 存储世界 | 服务器
网络设备 | IDC | 安全 | 求职招聘 | 数字网校 | 网页设计 | 平面设计 | 技术专题 | 电子书下载 | 教学视频 | 源码下载 | 搜索 | 博客 | 论坛
中国IT实验室Linux频道
Google
首页 入门 Linux编程 系统管理 网络管理 Linux认证 Unix/BSD Linux数据库 Linux集群 Linux手册 Linux下载 Ubuntu 论坛 专题 RSS
您现在的位置: 中国IT实验室 >> Linux >> 系统管理 >> 内核技术 >> 正文

Linux操作系统内存管理的源码实现

 

  看到其中调用了两个函数,find_empty_process and copy_process,这两个函数在fork.c文件里实现的。find_empty_process是为将要创建的新进程找一个pid,保存在last_pid里,然后调用copy_process,这是sys_fork真正的主程序,其中有如此句:


77         p = (struct task_struct *) get_free_page();


  先为新进程分配一张物理页面,用来存放进程的PCB结构,即task_struct结构。光给新进程一张物理页面来存放它的task_struct,显然是不能满足它的。我们知道,在创建之初,新进程是和其父进程共享代码和数据的。这是人为定的,不过这样的好处不言而喻。因此在创建的时候就没有必要将其代码和数据全部copy到新内存地址里,而只为新进程创建页目录项和页表就可以了。代码如下:


115         if (copy_mem(nr,p)) { /*copy_mem调用memory.c里的copy_page_tables*/
116                 task[nr] = NULL;
117                 free_page((long) p);
118                 return -EAGAIN;
119         }


  copy_mem为新进程分配页表空间,并把父进程的页表内容copy到新进程的页表空间里,这样新进程的页表的每一项指向的物理页面和其父进程页表的相应每一项指向的物理页面是一样的。少说了一些,不能只copy页表就完事了。32位线性地址转换为物理地址的时候,最先要找到32位线性地址对应的页目录项,再用页目录项找到页表地址。新进程有了自己的页表,并且页表也都指向了物理地址,现在少的就是页目录项了。新进程在创建的时候,在4G线性空间里给其分配了64M的线性空间,是通过设置LDT来完成的:


130    set_ldt_desc(gdt+(nr<<1)+FIRST_LDT_ENTRY,&(p->ldt));


  这64M的线性地址是从nr*64M的地址处开始的,这个地址正好可以被映射到页目录里的一项,这项的地址是:((nr*64M)>>20)&0xffc。只要从这里开始,在页目录里建一些页目录项,指向新创建的进程的页表地址(copy_mem调用copy_page_tables()来做的)。到这里,copy_mem的工作可以说是完成了,不过一定不能少了这一句:


177                      this_page &= ~2; (memory.c)

  由于新进程和其父进程共享物理内存页面,因此把这些物理页面重新都设成只读是必要的。上面这句是放在copy_page_tables函数里面的循环中的。copy_mem主要是靠调用这个程序来完成工作的。分析到这里,我终于可以小舒一口气了。不如回顾一下:系统初始化的时候在内存起始处建一张页目录(page_dir),以后所有的进程都使用这张页目录。并为系统建了4张页表。以后每有新进程产生,便为之分配空间存放PCB(即struct task_struct),然后为之通过复制父进程的页表来创建自己的页表,并创建相应的页目录项。

上一页  [1] [2] [3] [4] [5] [6] [7] 下一页

【责编:Kittoy】
中国IT教育
相关产品和培训
文章评论
 友情推荐链接
 专题推荐

 ·防范Linux病毒 打造没有病毒的乐土…
 ·Linux Shell编程实用指南…
 ·Linux日志分析与管理
 ·揭密Linux内存管理
 ·邮件服务Sendmail应用配置
 ·Linux 安全管理…
 ·Linux 下DNS服务器架设攻略…
 ·Linux 下的路由的配置与应用…
 ·专题:Apache实用手册
 ·全面剖析Linux文件系统
 今日更新
 认证培训
 频道精选
 Windows频道导航