社区首页 >问答首页 >为什么在x86_64内核的内存布局中有这么大的虚拟地址

为什么在x86_64内核的内存布局中有这么大的虚拟地址
EN

Stack Overflow用户
提问于 2017-06-27 11:00:43
回答 2查看 215关注 0票数 0

内核的文档/x86/x86_64/mm.txt写道:

代码语言:javascript
代码运行次数:0
复制
ffff880000000000 - ffffc7ffffffffff (=64 TB) direct mapping of all phys. memory

因此,我假设此区域中的地址映射不应大于实际物理DRAM大小。但是在一台16 got内存和内核v4.2.8的x86_64 PC上,我从/sys/ kernel /debug/kernel_page_tables得到了以下结果:

代码语言:javascript
代码运行次数:0
复制
---[ Low Kernel Mapping ]---

......

0xffff88008b3ff000-0xffff88008b400000           4K     RW                 GLB NX pte

0xffff88008b400000-0xffff8800c0000000         844M                               pmd

0xffff8800c0000000-0xffff880100000000           1G                               pud

0xffff880100000000-0xffff880400000000          12G     RW         PSE     GLB NX pud

0xffff880400000000-0xffff88043dc00000         988M     RW         PSE     GLB NX pmd

0xffff88043dc00000-0xffff88043dc25000         148K     RW                 GLB NX pte

0xffff88043dc25000-0xffff88043dc27000           8K     ro                 GLB NX pte

.......

0xffff88045c200000-0xffff88046f000000         302M     RW         PSE     GLB NX pmd

0xffff88046f000000-0xffff880480000000         272M                               pmd

0xffff880480000000-0xffff888000000000         494G                               pud

0xffff888000000000-0xffffc90000000000       66048G                               pgd

你看到有虚拟地址为0xffff88043dc00000的页面条目,在这样的虚拟地址上使用virt_to_phys()将得到0x43dc00000,这显然是非法的,因为它大于实际的内存大小(16‘s正好是0x400000000)。

那么,这些大型虚拟地址的规则是什么?我如何才能为其获取正确的物理地址?

非常感谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-06-27 11:31:23

您的PC不仅有DRAM,而且还有ROM (现在是闪存)和I/O存储器。为了向后兼容,这些地址中的一部分必须映射到20位和32位地址空间,因此RAM的最后一部分最终位于0x400000000以上的某个地址。

票数 0
EN

Stack Overflow用户

发布于 2017-06-27 12:31:21

物理地址不仅仅用于RAM。连接到机器的不同设备也有一些物理地址。处理器简单地将物理地址放在地址总线上,一个或一个设备将对其作出响应。

因此,在您情况下,这些物理地址可能是某些IO设备,如ROM (CD、ROM等)。

此外,RAM的物理地址也可以大于16 of。只是取决于它放在哪里。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44778637

复制
相关文章
虚拟地址空间的内存布局
实际的物理内存程序员是不能直接管理的,在最早期的x86体系结构中。由于实模式,对内存不进行保护,致使病毒蠕虫横飞。出现保护模式以后,提供虚拟地址空间对实际物理内存抽象虚拟,形成一一映射的关系。
lexingsen
2022/02/24
9330
虚拟地址空间的内存布局
【Linux 内核 内存管理】虚拟地址空间布局架构 ① ( 虚拟地址空间布局架构 | 用户虚拟地址空间划分 )
" ARM64 架构 " 中 , Linux 系统的 " 内核虚拟地址 “ 与 ” 用户虚拟地址 " 是等同的 ;
韩曙亮
2023/03/30
7.3K0
【Linux 内核 内存管理】虚拟地址空间布局架构 ① ( 虚拟地址空间布局架构 | 用户虚拟地址空间划分 )
【Linux 内核 内存管理】虚拟地址空间布局架构 ⑦ ( Linux 内核地址空间布局简介 )
" Linux 内核地址空间布局 " 对应代码在 Linux 内核源码的 linux-4.12\arch\arm64\include\asm\memory.h#66 位置 ;
韩曙亮
2023/03/30
1.9K0
【Linux 内核 内存管理】虚拟地址空间布局架构 ⑦ ( Linux 内核地址空间布局简介 )
【Linux 内核 内存管理】Linux 内核内存布局 ② ( x86_64 架构体系内存分布 | 查看 /proc/meminfo 文件 | /proc/meminfo 重要字段解析 )
文章目录 一、查看 x86_64 架构体系内存分布 二、/proc/meminfo 重要字段解析 一、查看 x86_64 架构体系内存分布 ---- 执行 cat /proc/meminfo 命令 , 可以查看 " x86_64 架构体系内存分布 " ; 执行结果参考 : root@ubuntu:~/kernel/linux-5.6.14# cat /proc/meminfo MemTotal: 4001788 kB MemFree: 2312852 kB MemAvaila
韩曙亮
2023/03/30
1.6K0
【Linux 内核 内存管理】虚拟地址空间布局架构 ⑤ ( Linux 内核中对 “ 虚拟地址空间 “ 的描述 | task_struct 结构体源码 )
进程 的 " 虚拟地址空间 " 由 mm_struct 和 vm_area_struct 两个数据结构描述 ;
韩曙亮
2023/03/30
3.7K0
【Linux 内核 内存管理】虚拟地址空间布局架构 ⑤ ( Linux 内核中对 “ 虚拟地址空间 “ 的描述 | task_struct 结构体源码 )
Liunux内核内存管理之虚拟地址空间
虚拟内存就是在你电脑的物理内存不够用时把一部分硬盘空间作为内存来使用,这部分硬盘空间就叫作虚拟内存。
嵌入式Linux内核
2022/09/23
1.2K0
Liunux内核内存管理之虚拟地址空间
为什么MySQL内存占用这么大? for InnoDB
这是 Innodb 引擎最重要的缓存,也是提升查询性能的重要手段。一般是global共享内存中占用最大的部分。在进行 SQL 读和写的操作时,首先并不是对物理数据文件操作,而是先对 buffer_pool 进行操作,然后再通过 checkpoint 等机制写回数据文件。占用的内存启动后就不会自动释放,默认通过LRU的算法镜像缓存淘汰,每次的新数据页,都会插入buffer pool的中间,防止前面的热数据被冲掉,长时间没动静的冷数据,会被淘汰出buffer pool,但是是被其它新数据占用了,所以一般这里不会释放的,除非重启(5.7 开始支持动态调整,默认以128M的chunk单位分配内存块)。innodb_buffer_pool主要包含数据页、索引页、undo 页、insert buffer、自适应哈希索引、锁信息以及数据字典等信息。
elontian田凌翔
2019/11/11
7.7K0
为什么MySQL内存占用这么大? for InnoDB
Linux中查看进程的虚拟地址空间内存布局
要查看一个进程的虚拟地址空间的内存布局,需要设置阻塞。如果没有设置阻塞,当./a.out按下去后,程序执行的速度非常快以至于来不及查看,所以需要设置阻塞。
lexingsen
2022/02/24
4K0
Linux中查看进程的虚拟地址空间内存布局
【Linux 内核 内存管理】虚拟地址空间布局架构 ② ( 用户虚拟地址空间组成 | 内存描述符 mm_struct 结构体源码 )
⑤ 堆内存 : 通过 malloc brk vmalloc 等函数 申请的 动态分配 的内存 ;
韩曙亮
2023/03/30
6710
【Linux 内核 内存管理】虚拟地址空间布局架构 ② ( 用户虚拟地址空间组成 | 内存描述符 mm_struct 结构体源码 )
ARM32 内核内存布局
Linux内核在启动时会打印出内核内存空间的布局图,下面是ARM Vexpress平台打印出来的内存空间布局图:
233333
2020/05/18
1.6K0
ARM32 内核内存布局
【Linux 内核 内存管理】Linux 内核内存布局 ③ ( Linux 内核 动态分配内存 系统接口函数 | 统计输出 vmalloc 分配的内存 )
Linux 内核 " 动态分配内存 " 是通过 " 系统接口 " 实现的 , 下面介绍几个重要的 接口函数 ;
韩曙亮
2023/03/30
5.2K0
【Linux 内核 内存管理】Linux 内核内存布局 ③ ( Linux 内核 动态分配内存 系统接口函数 | 统计输出 vmalloc 分配的内存 )
ARM64内核内存布局图
ARM64架构处理器采用48位物理寻址机制,最大可以寻找到256TB的物理地址空间。对于目前的应用来说已经足够了,不需要扩展到64位的物理地址寻址。虚拟地址也同样最大支持48位支持,所以在处理器的架构设计上,把虚拟地址空间划分为两个空间,每个空间最大支持256TB。Linux内核在大多数体系结构中都把两个地址空间划分为用户空间和内核空间。
233333
2020/05/18
2.6K0
ARM64内核内存布局图
微博的力量为什么这么大?
最近听闻「杨超越杯编程大赛」很是火热~ 网友纷纷评论,原来追星还可以这么硬核,没点实力还不敢追了。 本期,小F通过爬取新浪微博评论,来看看大家对此次大赛有什么看法。 在此之前,先查阅一下相关资料,发现从微博的手机端和移动端入手,效果还可以。 网页版的微博,想都不用想,去了就是自讨苦吃。 微博的反爬甚是厉害,我可不想去大动干戈... 虽然最后由于种种原因,还是没能够获取到完整的评论,不过也拿到了挺多数据。 还是可以拿来一窥的。 / 01 / 网页分析 网页端微博直接不看,先看一下手机端。 网址为 https:
龙哥
2019/04/25
8350
微博的力量为什么这么大?
【Linux】虚拟地址空间 --- 虚拟地址、空间布局、内存描述符、写时拷贝、页表…
1. 从程序的运行结果可以看出一些端倪,就是一个全局变量在地址并未改变的情况下,竟然出现了不同的值,这说明什么呢?首先一个变量肯定是只能有一个值的,但是地址只有一个,而变量的值却出现了两个,那么就必须说明一个结论,现在在内存中应该出现了两个变量了,因为一个变量是绝对不可能出现两个值的,所以我们可以推导出的结论就是内存中现在一定出现了两个全局变量global_value。
举杯邀明月
2023/04/12
1.5K0
【Linux】虚拟地址空间 --- 虚拟地址、空间布局、内存描述符、写时拷贝、页表…
Git目录为什么这么大
本文围绕git的目录过大,从git进行版本控制底层存储出发,简要分析Git目录过大的原因,以及如何处理
仙人技术
2021/08/31
1.3K0
Git目录为什么这么大
Redis 的数据被删除,内存占用还这么大?
通过 CONFIG SET maxmemory 100mb或者在 redis.conf 配置文件设置 maxmemory 100mb Redis 内存占用限制。当达到内存最大值,会触发内存淘汰策略删除数据。
码哥字节
2022/10/28
1.4K0
Redis 的数据被删除,内存占用还这么大?
Linux虚拟地址空间布局
在多任务操作系统中,每个进程都运行在属于自己的内存沙盘中。这个沙盘就是虚拟地址空间(Virtual Address Space),在32位模式下它是一个4GB的内存地址块。在Linux系统中, 内核进程和用户进程所占的虚拟内存比例是1:3,而Windows系统为2:2(通过设置Large-Address-Aware Executables标志也可为1:3)。这并不意味着内核使用那么多物理内存,仅表示它可支配这部分地址空间,根据需要将其映射到物理内存。
sunsky
2020/10/28
3.3K0
Linux虚拟地址空间布局
Linux 内核 VS 内存碎片 (上)
(外部)内存碎片是一个历史悠久的 Linux 内核编程问题,随着系统的运行,页面被分配给各种任务,随着时间的推移内存会逐步碎片化,最终正常运行时间较长的繁忙系统可能只有很少的物理页面是连续的。由于 Linux 内核支持虚拟内存管理,物理内存碎片通常不是问题,因为在页表的帮助下,物理上分散的内存在虚拟地址空间仍然是连续的 (除非使用大页),但对于需要从内核线性映射区分配连续物理内存的需求来说就会变的非常困难,比如通过块分配器分配结构体对象 (在内核态很常见且频繁的操作),或对不支持 scatter/gather 模式的 DMA 缓冲器的操作等,会引起频繁的直接内存回收/规整,导致系统性能出现较大的波动,或分配失败 (在慢速内存分配路径会根据页面分配标志位执行不同的操作)。
PingCAP
2020/12/11
3.5K0
Linux 内核 VS 内存碎片 (上)
【Linux 内核 内存管理】虚拟地址空间布局架构 ⑥ ( mm_struct 结构体源码 | vm_area_struct 结构体源码 )
mm_struct 结构体 , 定义在 Linux 内核源码的 linux-4.12\include\linux\mm_types.h#359 位置 ;
韩曙亮
2023/03/30
4450
【Linux 内核 内存管理】虚拟地址空间布局架构 ⑥ ( mm_struct 结构体源码 | vm_area_struct 结构体源码 )
点击加载更多

相似问题

为什么我的C程序中虚拟地址这么大?

10

为什么巨蟒熊猫dataFrame的内存消耗这么大?

12

TLB中的内核内存(虚拟地址条目)?

24

为什么我的围棋程序的内存波动这么大?

23

内核虚拟地址空间中的高内存映射

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文