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)
观看地址: http://www.qqread.com/linux/2007/07/y323323.html相关专题
- Office技巧专区 (7169篇文章)
- 系统优化大全 (18186篇文章)
- Linux安全应用宝典 (8088篇文章)
- Linux基础知识 (8446篇文章)
- Linux数据库宝典 (13195篇文章)
- Linux频道 (8088篇文章)
- 内存管理相关技巧 (19篇文章)
- 内存管理相关文章 (18篇文章)
- Linux应用 (863篇文章)
- Linux应用技巧 (1099篇文章)
- 安装qmail全套功略 (18次浏览)
- TurboLinux 入门教程:第七课 TurboLinux简介 (18次浏览)
- Linux系统管理员秘技:用快捷命令一招制胜 (18次浏览)
- Linux系统命令分类详解 (1) (18次浏览)
- Linux下使用aMsn详解 (18次浏览)
- 你会在Linux下用POP3收Web电子邮箱吗? (18次浏览)
- 在Linux中用三款工具轻松制作网页 (18次浏览)
- Linux上的偷窺裝置 (1394的使用) (18次浏览)
- 深入浅出分析Linux内核漏洞的问题 (18次浏览)
- Linux内核调试工具:Kdb应用指南(4) (18次浏览)



