免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: comepu
打印 上一主题 下一主题

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

论坛徽章:
0
41 [报告]
发表于 2005-12-15 12:23 |只看该作者
原帖由 dengcainiao 于 2005-12-15 12:20 发表
你们确定ZONE_NORMAL部分的物理页面一定都被映射到3G-4G的线性地址区间了吗?无论什么情况?



ZONE_NORMAL只是一个物理内存区域,能够保持永久映射,应该不是只映射到 1-3G和3G-4G应该都可以映射的。

论坛徽章:
0
42 [报告]
发表于 2005-12-15 12:35 |只看该作者
我怎么理解你说的保持永久映射?

论坛徽章:
0
43 [报告]
发表于 2005-12-15 15:12 |只看该作者

多多看ULK呀,简直是本旷世奇书

位于内核地址空间的内存并不是全部都能换出的呀!只有下面三种情况,和内存映射文件的部分能够被换到磁盘上去(只是后者不是换到交换区,而是换到相应的磁盘文件上去),所以Kmalloc申请的内存是不会换到交换区去的,但是这不代表所有内核空间的内存都不能换到外存去呀,呵呵呵呵呵呵呵呵
Pages that belong to an anonymous memory region of a process

Modified pages that belong to a private memory mapping of a process

Pages that belong to an IPC shared memory region

呵呵呵呵呵呵呵呵........................

论坛徽章:
0
44 [报告]
发表于 2005-12-15 15:13 |只看该作者
原帖由 baskervilles 于 2005-12-8 09:58 发表
楼主混淆了一个基本的概念,就是内核可寻址的物理地址空间,和内核占用的地址空间

大多数情况,内核可以寻址所有的物理地址空间,kernel从BIOS里得到物理地址空间的size,之后就会为这些memory作页映射表,这个 ...


baskervilles 老大就是牛呀!!!
佩服佩服!

论坛徽章:
0
45 [报告]
发表于 2005-12-15 16:45 |只看该作者
看过这个帖子以后忽然觉得通过__alloc_page()申请的内存页面在通过GFP_KERNEL策略申请内存时应该不从高地址内存空间申请物理页面.请看下边:

比如我需要申请一个pte表项,从2.4内核中摘得如下代码:

        pte = (unsigned long) __get_free_page(GFP_KERNEL);//得到一个线性地址
        if (pmd_none(*pmd)) {
                if (pte) {
                        clear_page((void *)pte);
                        set_pmd(pmd, __pmd(_PAGE_TABLE + __pa(pte)));

可见在申请页面表项的时候必须获得一个通过+3G方式直接映射在内核线性地址空间的物理页面该段代码才能正确执行.因为用了__pa()宏操作进行的物理转化.
那么也就是说在分配页面的时候不能考虑高端内存.各位怎么看?

论坛徽章:
0
46 [报告]
发表于 2005-12-15 16:53 |只看该作者
原帖由 dengcainiao 于 2005-12-15 16:45 发表
看过这个帖子以后忽然觉得通过__alloc_page()申请的内存页面在通过GFP_KERNEL策略申请内存时应该不从高地址内存空间申请物理页面.请看下边:

比如我需要申请一个pte表项,从2.4内核中摘得如下代码:

        pte = (u ...


你这是从Kmalloc中摘的代码吗?Kmalloc本来就只能从normal和dma区分配空间,如果要分配high区的内存就必须使用vmalloc才行,这个函数只是在3G+896M以上找空闲区域并建立永久内存映射啊

论坛徽章:
0
47 [报告]
发表于 2005-12-15 16:59 |只看该作者
不是这个代码摘自get_pte_slow(pmd_t *pmd, unsigned long offset)和kmalloc没什么关系.

论坛徽章:
0
48 [报告]
发表于 2005-12-15 17:57 |只看该作者
原帖由 dengcainiao 于 2005-12-15 16:59 发表
不是这个代码摘自get_pte_slow(pmd_t *pmd, unsigned long offset)和kmalloc没什么关系.



很多地方可以看出,switch mm的时候,也是直接一减,这样就假定了页表不能在zone_himem

还是有限制的。2.6内核才真正成熟,才真正支持高端一些的服务器:



在高端内存中存储页表条目

在 32 位机器上页表通常只可以存储在低端内存中。低端内存只限于物理内存的前 896 MB,同时还要满足内核其余的大部分要求。在应用程序使用了大量进程并映射了大量内存的情况下,低端内存可能很快就不够用了。

现在,在 2.6 内核中有一个配置选项叫做 Highmem PTE,让页表条目可以存放在高端内存中,释放出更多的低端内存区域给那些必须放在这里的其他内核数据结构。作为代价,使用这些页表条目的进程会稍微慢一些。不过,对于那些在大量进程在运行的系统来说,将页表存储到高端内存中可以在低端内存区域挤出更多的内存。

[ 本帖最后由 Solaris12 于 2005-12-15 17:59 编辑 ]

论坛徽章:
0
49 [报告]
发表于 2005-12-15 21:15 |只看该作者

逻辑地址和虚拟地址是不是一个概念?

如题

论坛徽章:
0
50 [报告]
发表于 2006-05-15 14:04 |只看该作者
谢谢各位老大的解答,我终于弄明白了,哈哈
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP