首页 | 互联网 | 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系统的内存管理技巧总结

  1 mem_map[PAGING_PAGES]数组为什么不直接从主存储区开始记录,而从1M开始记录,然后又把1M到主存储区之间的内容置为100

  2 mem_map[i]在那些时候会大于1:同一物理页面被n个(n>1)线性地址共享,如copy_page_table()会影响这里的值

  3 哪些地方需要执行刷新页变换缓冲(invalidate()函数实现):

  3.1 free_page_tables()

  3.2 copy_page_tables()

  3.3 un_wp_page()

  3.4 try_to_share()

  改变页目录项活页表项

  4 写时复制的相关函数

  4.1 copy_page_tables():负责把原始和新的页目录项和页表项都设置为只读

  4.2 do_wp_page():页写保护处理函数

  4.3 un_wp_page():判断页面是否被共享,若没有共享,则把页面设置为可写,然后退出,若共享,则需要重新申请一新页面并复制被写页面的内容,以供写进程单独使用共享被取消

  5 COPY_SPACE(addr)不理解

  6 在free_page_table()函数中,若addr(物理地址)所在的页面由n个(n>=2)线性地址共享(copy_page_table函数可以让一个物理页面被多个线性地址共享),那么在释放addr所在页面时,执行mem_map[addr]——(mm/memory.c Line 96)语句后,并不能让mem_map[addr]的值变为0,而是变为n-1,这并不代表该物理页面已被释放,是不是应该改为mem_map [addr] = 0(mm/memory.c Line 96)呢?还是我那里想错了。

  7 取线性地址addr所对应页目录项的物理地址

  dir = (unsigned long*)((addr>>20)&0xffc)

  说明:首先,addr>>22得出对应页目录项在页目录表中的项号,即表内偏移,因为页目录表的起始地址为物理地址0,而每项大小为4byte,所以,实际物理地址为addr>>20,又因为只右移了20位,最后两位是页表项的内容,所以和0xffc相与把最后两位屏蔽掉,得出最终结果

  8 取线性地址addr所对应页表项的物理地址

  table = ((unsigned long*)(((address >> 0) & oxffc) + (0xfffff000 & *((unsigned long*)((address>>20 & 0xffc)))))

  即,偏移+基址,参考7

  其中有些问题还没有解决,若发现文中有错,或提出相关建议,发送到: xuyufei13@gmail.com

  (内核源代码版本为0.11)

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

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