前言

引用:《内核珠玑:/proc/iomem的作用》

“大师,今天天气真好,公园里的花也红了,树也绿了。”
“人也多。”
“大师,咱们毕竟是第一次来,先去看看导览图吧?”
“路过个街心公园要什么导览图?”
“好吧。。其实人家想去厕所。”
“先忍一会,既然你提到导览图,为师就考考你,知道 /proc/iomem 的作用么?”
“知道,/proc/iomem 提供了系统的物理布局概览。”
“这个概览有什么用呢?”
“当然有用,/proc/iomem 提示了系统中设备的物理布局,比如网卡占据了总线的物理地址 0x1000 - 0x2000,就需要通过申请资源来表明这块物理地址区间是网卡使用,如果想要与网卡交互,就要来访问这块地址哦。”
“觉不觉得很像公园导览图的作用?”
“的确,所以 /proc/iomem 很有用啦。”
“那么你想想看,如果没有它,会出什么问题呢?”
“那我就找不到厕所在哪里了。。”
“再想想?”
“唔。。甚至我会走错地方,本来想去厕所,结果闯进了冷饮店。。”
“再想想呢。”
“大师,我想到了更可怕的事,我不敢说。”
“无妨。”
“误入女厕所。。”
“不错,那么 iomem 下面提供了哪些有用信息呢。”
“刚才我就说了,提示了设备占用的物理地址。”
“还有呢?”
“还有 System RAM,这表明对应的是 DDR 物理内存。”
“System RAM 下面还有什么呢?”
“系统会使用其中一部分自用,放置 text,data 和 bss,所以这些部分会作为 System RAM 的子节点存在,提示这些物理内存已经被使用了。”
“还算不错,所以 iomem 中的信息必须准确,如果不小心写错,或者被恶意篡改,后果会很严重。”
“是啊,搞不好就误入女厕所了。”
“甚至还可能走进冷饮店,但买到的却是坨坨。”
“大师,别说冷饮了,我。。”
“快去快去,看你表现不错,为师买 2 个甜筒等你。”
“( •̀ ω •́ )y”

地址空间

有必要解释“地址空间(address space)”这一概念:地址空间就是能看到得存储器范围。地址空间的大小不由具体存储器的容量决定,而是指 CPU 或其它控制器能访问到的存储单元的范围,由电路的“位”来决定。例如 32 位的 CPU 的地址空间(不论虚拟的地址空间还是物理的地址空间)通常情况下就是 0~4G(2^32),即使内存只有 1G。如果为 32 位 CPU 配上 8G 的内存条,超出了地址空间的 4G 存储单元就无法被 CPU 直接访问。

虚拟内存地址空间:
64 位系统的地址空间,不是 2^32,也不是 2^64,而一般是 2^48。
物理内存地址空间:
64 位系统的地址空间,一般有 2^40 ,2^46 ,2^48 几种情况

实例 1,Ubuntu 20.04 虚拟机
48 bits physical, 48 bits virtual

$ cat /proc/cpuinfo
processor   : 0
vendor_id   : AuthenticAMD
cpu family  : 23
model       : 96
model name  : AMD Ryzen 7 4800H with Radeon Graphics
stepping    : 1
microcode   : 0x6000626
cpu MHz     : 2894.558
cache size  : 512 KB
physical id : 0
siblings    : 4
core id     : 0
cpu cores   : 4
apicid      : 0
initial apicid  : 0
fpu     : yes
fpu_exception   : yes
cpuid level : 16
wp      : yes
flags       : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt rdtscp lm constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid tsc_known_freq pni pclmulqdq ssse3 cx16 sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx rdrand hypervisor lahf_lm cmp_legacy cr8_legacy abm sse4a misalignsse 3dnowprefetch ssbd vmmcall fsgsbase avx2 rdseed clflushopt arat
bugs        : fxsave_leak sysret_ss_attrs null_seg spectre_v1 spectre_v2 spec_store_bypass retbleed
bogomips    : 5789.11
TLB size    : 3072 4K pages
clflush size    : 64
cache_alignment : 64
address sizes   : 48 bits physical, 48 bits virtual
power management:

实例 2,CentOS 7.5.1804 云服务器
46 bits physical, 48 bits virtual

# cat /proc/cpuinfo
processor   : 0
vendor_id   : GenuineIntel
cpu family  : 6
model       : 94
model name  : Intel(R) Xeon(R) Gold 6133 CPU @ 2.50GHz
stepping    : 3
microcode   : 0x1
cpu MHz     : 2499.998
cache size  : 28160 KB
physical id : 0
siblings    : 2
core id     : 0
cpu cores   : 2
apicid      : 0
initial apicid  : 0
fpu     : yes
fpu_exception   : yes
cpuid level : 13
wp      : yes
flags       : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_tsc rep_good nopl eagerfpu pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch invpcid_single fsgsbase bmi1 hle avx2 smep bmi2 erms invpcid rtm mpx rdseed adx smap clflushopt xsaveopt xsavec xgetbv1 arat
bogomips    : 4999.99
clflush size    : 64
cache_alignment : 64
address sizes   : 46 bits physical, 48 bits virtual
power management:processor  : 1
vendor_id   : GenuineIntel
cpu family  : 6
model       : 94
model name  : Intel(R) Xeon(R) Gold 6133 CPU @ 2.50GHz
stepping    : 3
microcode   : 0x1
cpu MHz     : 2499.998
cache size  : 28160 KB
physical id : 0
siblings    : 2
core id     : 1
cpu cores   : 2
apicid      : 1
initial apicid  : 1
fpu     : yes
fpu_exception   : yes
cpuid level : 13
wp      : yes
flags       : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_tsc rep_good nopl eagerfpu pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch invpcid_single fsgsbase bmi1 hle avx2 smep bmi2 erms invpcid rtm mpx rdseed adx smap clflushopt xsaveopt xsavec xgetbv1 arat
bogomips    : 4999.99
clflush size    : 64
cache_alignment : 64
address sizes   : 46 bits physical, 48 bits virtual
power management:

为什么不用 2^64 大小呢?因为在可预见的时间内,都用不到大那么大的空间。

/proc/iomem

环境:Ubuntu 20.04 虚拟机,内存 14G

$ sudo cat /proc/iomem
00000000-00000fff : Reserved
00001000-0009fbff : System RAM
0009fc00-0009ffff : Reserved
000a0000-000bffff : PCI Bus 0000:00
000c0000-000c7fff : Video ROM
000e2000-000e2fff : Adapter ROM
000f0000-000fffff : Reserved000f0000-000fffff : System ROM
00100000-dffeffff : System RAM
dfff0000-dfffffff : ACPI Tables
e0000000-fdffffff : PCI Bus 0000:00e0000000-e3ffffff : 0000:00:02.0e0000000-e3ffffff : vmwgfx probef0000000-f01fffff : 0000:00:02.0f0000000-f01fffff : vmwgfx probef0200000-f021ffff : 0000:00:03.0f0200000-f021ffff : my_pci_driverf0400000-f07fffff : 0000:00:04.0f0400000-f07fffff : vboxguestf0800000-f0803fff : 0000:00:04.0f0810000-f081ffff : 0000:00:0c.0f0810000-f081ffff : xhci-hcdf0820000-f0821fff : 0000:00:0d.0f0820000-f0821fff : ahci
fec00000-fec00fff : Reservedfec00000-fec003ff : IOAPIC 0
fee00000-fee00fff : Local APICfee00000-fee00fff : Reserved
fffc0000-ffffffff : Reserved
100000000-38cafffff : System RAM20ee00000-20fe025c7 : Kernel code210000000-210a87fff : Kernel rodata210c00000-2110455ff : Kernel data211393000-2119fffff : Kernel bss
38cb00000-38fffffff : RAM buffer

这个列表把物理地址空间的分布暴露得一丝不挂。
System RAM 代表 DDR 物理内存,内存条。
从中可以窥探如下几点信息:

  • DDR 物理内存,在物理地址空间上,并不是连续分布的
  • DDR 物理内存,不一定位于物理地址空间的开头
  • 物理地址空间,除了 DDR 物理内存,还存在其它如 PCI Bus、System ROM 这些 I/O 内存区域

/proc/iomem相关推荐

  1. Linux /proc/iomem与/proc/ioports

    文章目录 前言 一./proc/iomem 1.1 简介 1.2 ioremap 1.3 mmap 二.struct resource 三.System RAM 3.1 System RAM 简介 3 ...

  2. /proc文件夹介绍

    Linux系统上的/proc目录是一种文件系统,即proc文件系统.与其它常见的文件系统不同的是,/proc是一种伪文件系统(也即虚拟文件系统),存储的是当前内核运行状态的一系列特殊文件,用户可以通过 ...

  3. linux分配iomem,Linux中__iomem

    这是个IO map的问题,根据系统的具体情况,把寄存器映射到虚拟地址的特定位置,这样,访问寄存器就可以像访问普通内存一样简单方便了. __iomem是linux2.6.9内核中加入的特性.是用来个表示 ...

  4. Linux系统proc详解

    原文链接:https://www.cnblogs.com/liushui-sky/p/9354536.html 目录 一.        进程目录中的常见文件介绍 1.1 cmdline 1.2.cw ...

  5. iomem—I/O映射方式的I/O端口和内存映射方式的I/O端口

    Linux将基于I/O映射方式的I/O端口和基于内存映射方式的I/O端口资源统称为"I/O区域"(I/O Region).I/O Region仍然是一种I/O资源,因此它仍然可以用 ...

  6. 深入理解linux系统下proc文件系统内容

    另外,可以参考这个http://www.centos.org/docs/5/html/5.1/Deployment_Guide/ch-proc.html 内容摘要:Linux系统上的/proc目录是一 ...

  7. Linux的proc文件系统详解

    引用自:http://bbs.chinaunix.net/thread-2002769-1-1.html Linux系统上的/proc目录是一种文件系统,即proc文件系统.与其它常见的文件系统不同的 ...

  8. linux /proc 详解

    linux /proc 详解 本文整理了一下 linux /proc下的几个常用的目录和文件,可供查阅,之后在学习工作中有别的用到的话会再补充. /proc 简介 Linux系统上的/proc目录是一 ...

  9. linux /proc文件系统(1)

    Proc文件系统 proc文件系统是linux 中比较重要的的一个文件系统,在sysfs文件系统没有出现之前,它可以说是用户层获取内核层信息的唯一方式,它是一个一种特殊的.由软件创建的文件系统,pro ...

最新文章

  1. 毕业论文答辩老师最想听到什么?最关注的问题是什么?
  2. Java多线程之线程池的使用示例
  3. boost program_options
  4. requireJS的基本使用
  5. Spring Boot 整合 Shiro
  6. Java文件类boolean isDirectory()方法(带示例)
  7. C语言排序方法-----选择排序法
  8. 在linux系统下安装oracle前的准备工作(配置oracle环境变量)
  9. 张同学会是男版李子柒吗?
  10. 使用Eclipse创建的第一个javabean,cannot resolved to a type
  11. C# 异步调用中使用回调方法
  12. Python pip卸载包
  13. plot函数二维绘图
  14. html中按钮怎么设置渐变色,CSS3渐变色按钮
  15. 使用Matlab读取二进制数据文件
  16. ASP第一章IIS发布站点
  17. html、css 实现轮播图的静态样式
  18. 解决无线网卡工作一段时间USB就自动断开连接(by liukun321咕唧咕唧)
  19. TI公司TTL/CMOS/LVTTL,74LS/74S/74ALS/74AS/74F/74HC/74HCT/74AC/74ACT/74BCT/74ABT/74LV/74LVC/74LV区别与对比
  20. 查询本机IP及精确地理位置

热门文章

  1. 强化学习3——基于强化学习的四足机器人运动控制
  2. 对themida(1.8.5.5)加密VC++程序的完美脱壳
  3. Word控件Spire.Doc 【邮件合并】教程(四):如何使用邮件合并合并图像值
  4. Pixhawk PID参数整定
  5. Ipv6的三种表示方法
  6. 撤销正在审核的和已经通过审核的app
  7. zabbix配置详解---为新手入门而写
  8. Zabbix6 通过zabbix-agent2监控MySQL
  9. python西游之路
  10. 贪心算法---跳楼梯问题