Chinaunix首页 | 论坛 | 博客
  • 博客访问: 335505
  • 博文数量: 102
  • 博客积分: 2510
  • 博客等级: 少校
  • 技术积分: 1146
  • 用 户 组: 普通用户
  • 注册时间: 2010-01-21 22:33
文章分类

全部博文(102)

文章存档

2011年(8)

2010年(94)

我的朋友

分类: LINUX

2010-03-16 13:40:44

 | | | | | | |

 
   >> 
此话题阅读次数: 133

  加到“个人收藏夹”   |    打印

(addict)
10-03-13 20:08
 内核线程线性地址范围与物理内存大小啥关系?

是不是会受限于物理内存大小呢? 
比方说物理内存大小512mb,那么kernel thread永远没法使用>(3g+512mb)的线性地址? 

>896mb物理内存的情况,使用高端内存时, master kernel page global directory页表会被修改,这样其他进程会defered修改这部分页表。 

这种情况下<896的页表和物理内存是512MB的不同在于,512MB的时候,页表中512~896之间的entries 是空的,没有物理内存对应嘛。。。所以肯定没有这部分线性地址存在? 

无论如何,<896的页表在初始化完成后,就不会改动了,对吧? 




--------------------
做kernel,求内推,长期有效 

文章选项: 打印   将这篇文章放置于备忘录中,待有空时回覆   好友分享   通知版主


(stranger)
10-03-14 15:06
 Re: 内核线程线性地址范围与物理内存大小啥关系? []

内核在初始化的时候根据物理内存大小,建立相应的线性映射,具体的映射的大小保存在变量high_memory,紧接着有8M的hole,然后就是VMALLOC_START 
#define VMALLOC_START (((unsigned long)high_memory + VMALLOC_OFFSET) & ~(VMALLOC_OFFSET-1)) 随后的地址能够使用,但是内核线程代码只能运行在前面这段确定的线性地址处了 
我的理解不知道对不对

文章选项: 打印   将这篇文章放置于备忘录中,待有空时回覆   好友分享   通知版主


(addict)
10-03-14 17:55
 Re: 内核线程线性地址范围与物理内存大小啥关系? []

我记得vmalloc区除了映射高端内存,还可以做IO-MEMORY映射吧。 
这样的话,即使Physical RAM < 896,kernel仍然能够使用VMALLOC区域,就是说有>(3g+896mb)的线性地址存在。 

现在开始反思,自己看内存管理这部分不系统,知识很零散,导致这种概念性的问题也犯晕。。。比如我会犯傻: 

如果user space 进程申请了物理内存区域A,kernel thread又直接访问A,会不会冲突呢? 




--------------------
做kernel,求内推,长期有效 

文章选项: 打印   将这篇文章放置于备忘录中,待有空时回覆   好友分享   通知版主


(stranger)
10-03-15 10:25
 Re: 内核线程线性地址范围与物理内存大小啥关系? []

vmalloc可以为内核分配物理地址不连续但线性地址连续的空间,vmalloc使用的线性地址就在物理地址映射结束到898M之间。 
内核当然可以访问用户分配的空间。内核页表对所有物理页面都有映射的(不考虑高端内存)。

文章选项: 打印   将这篇文章放置于备忘录中,待有空时回覆   好友分享   通知版主


(veteran)
10-03-15 13:48
 Re: 内核线程线性地址范围与物理内存大小啥关系? []

怎么会冲突呢? 

另外,你说的“直接”访问,是什么意思? 
内核线程想访问肯定是能访问得了,只要有页表项,但它不知道用户那边是哪个进程正好上来了。 


--------------------
愿我来世,得菩提时,身如琉璃,内外明澈,净无瑕秽。

文章选项: 打印   将这篇文章放置于备忘录中,待有空时回覆   好友分享   通知版主


(addict)
10-03-15 22:15
 Re: 内核线程线性地址范围与物理内存大小啥关系? []

"直接"是说kernel thread访问区域线性地址区域L,而L对应的物理区域A已经被别的进程申请了。 
这种情况应该不合法的,访问L前会先申请,不会和A有重复的。 

贴一下水木网友的答复: 

发信人: dongmjdu (dongmjdu), 信区: KernelTech 
标 题: Re: 内核线程线性地址范围与物理内存大小啥关系? 
发信站: 水木社区 (Mon Mar 15 16:23:15 2010), 转信 

wxc200: 
内核线性地址范围为3G-4G,共1G。分为:内核直接映射空间(最大896M),内核动态映射空间。 
那么,物理内存(phymemsize)小于等于896M时,可以直接映射到线性空间为3G---3G+phymemsize,这段线性内存和物理内存有对应关系,即线性内存减去3G就可以计算出物理内存。3G+phymemsize --- 4G这段是内核动态映射空间,这段空间和物理地址没有直接的计算关系,需要查页表获得。 

phymemsize大于896M时,直接映射地址空间为3G-3G+896M 



【 在 wxc200 (伊泽) 的大作中提到: 】 
: 是不是会受限于物理内存大小呢? 
: 比方说物理内存大小512mb,那么kernel thread永远没法使用>(3g+512mb)的线性 
: 地址? 
: ................... 

-- 
The world won't care about your selfesteem. The world will expect you to accomplish something before you feel good about yourself. 



--------------------
做kernel,求内推,长期有效 

文章选项: 打印   将这篇文章放置于备忘录中,待有空时回覆   好友分享   通知版主


(veteran)
10-03-16 10:29
 Re: 内核线程线性地址范围与物理内存大小啥关系? []

抱歉我还是没明白,你在内核里把地址给下去,就硬要访问那里了,怎么会访问不了。 


--------------------
愿我来世,得菩提时,身如琉璃,内外明澈,净无瑕秽。

文章选项: 打印   将这篇文章放置于备忘录中,待有空时回覆   好友分享   通知版主


(addict)
10-03-16 11:26
 Re: 内核线程线性地址范围与物理内存大小啥关系? []

不好意思,我没有表述清晰。 

kernel 进程访问>3g 的线性地址用的是上一个进程的页表,而这些进程>3g的页表项是从master kernel page table拷贝的。在初始化的时候,根据物理内存大小对这个master 页表建立。 

user space进程P0申请到物理pages A 后填充其page table entry.我迷惑的就是假如此时kernel thread p1也访问page A对应的线性地址会如何? 

可能上面的假设不成立,正确的流程是 p1在会先申请page,而这个page不会和前面的page A冲突的。 




--------------------
做kernel,求内推,长期有效 

文章选项: 打印   将这篇文章放置于备忘录中,待有空时回覆   好友分享   通知版主


(old hand)
10-03-16 12:14
 Re: 内核线程线性地址范围与物理内存大小啥关系? []

“user space进程P0申请到物理pages A 后填充其page table entry.我迷惑的就是假如此时kernel thread p1也访问page A对应的线性地址会如何? “ 

P1访问不到PAGE A的。 

因为PAGE A被P0申请到后,P1再申请时事找不到的。 


--------------------
超喜欢繁体的“亞”字

文章选项: 打印   将这篇文章放置于备忘录中,待有空时回覆   好友分享   通知版主

  加到“个人收藏夹”   |    打印

前往讨论区  

阅读(1504) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~