免费注册 查看新帖 |

Chinaunix

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

内核的地址是简单的线性映射这句话怎么理解啊? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-11-15 09:14 |只看该作者 |倒序浏览
对物理地址来说,给定一个虚地址x,其物理地址就是x-page_offset 。
还有这行代码
asm volatile("movl %0,%%cr3"::"r"(_pa(next->pgd)));
说明一个虚地址直接减去位移就得到物理地址了??

那虚地址有1G那么大,物理地址多半没这么大啊?用户空间的地址怎么办?

请哪位大虾指点一下,谢谢

论坛徽章:
0
2 [报告]
发表于 2005-11-15 09:17 |只看该作者
在看《内核情景分析》,多看几遍你就明白来,作者说的很清楚的。

论坛徽章:
0
3 [报告]
发表于 2005-11-15 09:18 |只看该作者
我就是看那个啊,看了好几遍了,

不明白这个物理地址指的是哪个地址

论坛徽章:
0
4 [报告]
发表于 2005-11-15 09:30 |只看该作者

老大们指点一下啊

老大们指点一下啊

论坛徽章:
0
5 [报告]
发表于 2005-11-15 09:33 |只看该作者
Linux内核将这4G字节的空间分为两部分,最高的1G用于内核,称为系统空间。
虽然系统空间占据了每个虚存空间最高的1G字节,但在物理内存中却总是从地址0开始。所以,对内核来说,其地址映射是很简单的线性映射

内核的空间有1G这么多,怎么可能直接就可以映射呢?

论坛徽章:
1
技术图书徽章
日期:2013-12-05 23:25:45
6 [报告]
发表于 2005-11-15 09:37 |只看该作者
  由于计算机系统中所含的实际物理内存容量是有限的。为了能有效地使用这些物理内存,Linux采用了Intel CPU的内存分页管理机制,使用虚拟线性地址与实际物理内存地址映射的方法让所有同时执行的程序共同使用有限的内存。内存分页管理的基本原理是将整个主内存区域划分成4096字节为一页的内存页面。程序申请使用内存时,就以内存页为单位进行分配。
  在使用这种内存分页管理方法时,每个执行中的进程(任务)可以使用比实际内存容量大得多的线性地址空间。对于Intel 80386系统,其CPU可以提供多达4G的线性地址空间。而linux 0.11内核则为每个进程分配了64MB的线性地址空间,见图所示。

  为了使用实际物理内存,每个进程的线性地址通过二级内存页表动态地映射到主内存区域的不同内存页上。因此每个进程最大可用的虚拟内存空间是64MB。
  每个进程的逻辑地址通过加上任务号*64M即可转换为线性地址。不过在注释中,我们通常将进程中的地址简单地称为线性地址。

对于Intel 80386系统,其CPU可以提供多达4G的线性地址空间。对于linux 0.11内核,系统设置全局描述符表GDT中的段描述符项数最大为256,其中2项空闲、2项系统使用,每个进程使用两项。因此,此时系统可以最多容纳 (256-4)/2 + 1=127 个任务,并且虚拟地址范围是 ((256-4)/2)* 64MB 约等于8G。但0.11内核中人工定义最大任务数NR_TASKS = 64个,每个进程虚拟地址(或线性地址)范围是64M,并且各个进程的虚拟地址起始位置是(任务号-1)*64MB。因此所使用的虚拟地址空间范围是 64MB*64 =4G,见图2.7所示。4G正好与CPU的线性地址空间范围或物理地址空间范围相同,因此在0.11内核中比较容易混淆三种地址概念。

1_96.jpg (72.19 KB, 下载次数: 35)

1_96.jpg

论坛徽章:
0
7 [报告]
发表于 2005-11-15 09:40 |只看该作者
可是,在现在的LINUX版本中,内存管理有变化啊

每个进程都有3G的用户空间,然后共享1G的系统空间。
我不明白的是,为什么系统空间的地址到物理地址只要简单的位移映射呢?

论坛徽章:
0
8 [报告]
发表于 2005-11-15 10:48 |只看该作者

顶一下,有人指点吗?

顶一下,有人指点吗?

论坛徽章:
0
9 [报告]
发表于 2005-12-05 12:06 |只看该作者
弱智老人正解

论坛徽章:
0
10 [报告]
发表于 2005-12-05 13:21 |只看该作者
原帖由 menp9999 于 2005-12-5 11:32 发表




从理论上讲,说简单位移映射是没有道理的,完全可以实现系统空间的地址向任何一个物理地址映射(只要这个物理地址没有使用的话),但问题是由虚地址查找物理地址只能依靠查表了,划不来,呵呵,所以大家就 ...


这么说,内核的内存基本在NORMAL zone了。
是不是正是由于这个原因,linux才需要划分出HIMEM zone呢?

这样做有什么优劣?

好处:
简单?高效?

不利:
这样做岂不是限制了对大内存的使用?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP