(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再申请时事找不到的。
-------------------- 超喜欢繁体的“亞”字 文章选项: |