免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1620 | 回复: 3
打印 上一主题 下一主题

[内核入门] 内核代码中的地址映射问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-07-18 10:26 |只看该作者 |倒序浏览
本帖最后由 wswfc 于 2012-07-18 10:37 编辑

最近看linux 0.11的代码,其中的sys_fork的操作中有一些不明白的地方,还请各位帮忙解答:

sys_fork会调用copy_process函数,进行一些初始化工作,而其中有为新进程的管理结构申请空间的操作:

  1. 68 int copy_process(int nr,long ebp,long edi,long esi,long gs,long none,
  2. 69                 long ebx,long ecx,long edx,
  3. 70                 long fs,long es,long ds,
  4. 71                 long eip,long cs,long eflags,long esp,long ss)
  5. 72 {
  6. 73         struct task_struct *p;
  7. 74         int i;
  8. 75         struct file *f;
  9. 76
  10. 77        p = (struct task_struct *) get_free_page();
  11. 78         if (!p)
  12. 79                 return -EAGAIN;
  13. 80         task[nr] = p;
  14. 81         *p = *current;  /* NOTE! this doesn't copy the supervisor stack */
  15. 82         p->state = TASK_UNINTERRUPTIBLE;
  16. 83         p->pid = last_pid;
  17. 84         p->father = current->pid;
复制代码
其中的
  1. p = (struct task_struct *) get_free_page();
复制代码
获得一个空闲页面,但是返回值应该是绝对的物理地址
  1. 59 /*
  2. 60  * Get physical address of first (actually last :-) free page, and mark it
  3. 61  * used. If no free pages left, return 0.
  4. 62  */
  5. 63 unsigned long get_free_page(void)
  6. 64 {
  7. ……
复制代码
后续直接在这个物理地址上操作了!有点费解啊!

按理说目前代码应该运行在父进程的内核空间中,父进程有自己的页表和页目录项,但这里却直接操作一个物理地址,这是怎么可能的呢?

update:

看了一些资料,似乎内核态时,使用的页表不是用户态时使用的页表,而是开机最开始初始化时(head.s文件)初始化的页表,该页表是直接1:1映射到物理地址的,所以在内核态时,线性地址==物理地址。不知我的理解对不对……

论坛徽章:
0
2 [报告]
发表于 2012-07-19 00:17 |只看该作者
   我不知道0.1.1中get_free_page的实现,但在2.6的内核代码中,get_free_page并不返回绝对物理地址,而是返回内核态的虚拟地址,这个地址跟绝对物理地址之前存在固定偏移

论坛徽章:
0
3 [报告]
发表于 2012-07-20 11:21 |只看该作者
本帖最后由 omycle 于 2012-07-20 11:22 编辑

在mmu enabled的情况下,软件(操作系统以及其上的应用进程)处理的都是虚拟地址。

论坛徽章:
0
4 [报告]
发表于 2012-07-21 13:04 |只看该作者
楼上说的没错

“Get physical address of first (actually last ”这个说的物理地址并不是总线地址而是虚拟地址,只不过这个虚拟地址是内核空间的,不会产生缺页异常。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP