Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3934612
  • 博文数量: 93
  • 博客积分: 3189
  • 博客等级: 中校
  • 技术积分: 4229
  • 用 户 组: 普通用户
  • 注册时间: 2009-02-02 13:29
个人简介

出没于杭州和青岛的程序猿一枚,对内核略懂一二

文章分类

全部博文(93)

文章存档

2016年(2)

2015年(3)

2014年(11)

2013年(29)

2012年(16)

2011年(5)

2010年(5)

2009年(22)

分类: LINUX

2009-08-14 14:59:04

看linux内存机制好几遍了,总算是对内存机制有了基本的认识。
下面就说一个我刚看内存是的一个问题:
 
用户态进程的虚拟地址如何转换成物理地址?
 
区分一个进程,我们都知道最简单就是进程的pid。我们就从(pid,virtualaddress)来看看如何将一个进程的虚拟地址转换为物理地址phyaddress。
 
首先根据pid我们可以得到这个进程的task_struct,进而通过task_struct得到mm,通过mm得到pgd。
好了,现在我们有pgd和virtualaddress.
通过pgd和virtualaddress我们可以得到页表pte.
 
有了pte和virtualaddress,我们就可以计算物理地址了
phyaddress=(pte_val(pte)&PAGE_MASK)|(virtualladdress&~PAGE_MASK)
 
 
物理地址既然出来了,访问这个地址的值就比较简单了,只需要将物理地址转换为内核线性地址就行。
*phyaddress=*((char *)phyaddress+PAGE_OFFSET)
 
 
 
有说的不对的地方,请不吝指教。
阅读(6481) | 评论(1) | 转发(1) |
给主人留下些什么吧!~~

Bean_lee2012-11-13 12:32:56

mark 下,回去看