btw616 发表于 2011-09-11 11:31

求教:关于/proc/iomem 的一些疑问

执行 cat /proc/iomem | grep "System RAM" 的输出如下:

00010000-0009fbff : System RAM
00100000-7ff9ffff : System RAM

写如下程序计算系统内存大小:

#include <stdio.h>

#define _2GB    ((long long)1 << 31)

int main(void)
{
      long long size = (long long)0x9fbff - 0x10000
                         + 0x7ff9ffff - 0x100000 + 2;

      printf("size = %llx(bytes)\n", size);
      printf("size = %lld(bytes)\n", size);
      printf("size = %llx(bytes)\n", _2GB);
      printf("size = %lld(bytes)\n", _2GB);

      printf("size = %lld(KB)\n", size >> 10);

      return 0;
}

得到的结果如下:

size = 7ff2fc00(bytes)
size = 2146630656(bytes)
size = 80000000(bytes)
size = 2147483648(bytes)
size = 2096319(KB)


但是,使用 free 和 cat /proc/meminfo 得到的输出中的内存的大小分别:

            total      
Mem:       2061860

MemTotal:      2061860 kB

为什么通过命令检测到的内存的大小是 2061860 kB,而通过 /proc/iomem 中计算到的内存的大小是 size = 2096319(KB) 呢?

iomem 这个文件中的数据不是设备在cpu总线上对应的物理地址吗?为什么内存占用的地址范围大小要比检测到的内存容量的大小大呢?为什么不是相等呢?

btw616 发表于 2011-09-11 11:38

我还有的一个疑问是,/proc/iomem 这个文件中的地址,也就是 struct resource 这个结构体中对应的 start、end两个成员变量的值,表示的是在cpu总线上的起始和终止的物理地址。但是这个地址使用来做什么用的呢?在内存的管理中,物理地址到线性地址的映射不是直接从内存的物理地址向线性地址映射的吗?比如低端内存映射到内核空间直接加上 PAGE_OFFSET 就可以得到。那么 /proc/iomem 这个文件中的这个物理地址使用来做什么的呢?偶不了解啊。。。。。

qwac456 发表于 2011-09-11 17:55

btw616 发表于 2011-09-12 21:10

有没有人可以解释一下第一个问题呢。。:'(

kernelinside 发表于 2011-09-16 12:26

楼主, 我也想知道答案,现在你有线索了吗?

btw616 发表于 2011-09-17 18:31

回复 5# kernelinside


    眸有。。给老师发邮件问这个问题,还被老师说这是没有意义的东西。。。

wangzhen11aaa 发表于 2011-09-18 17:29

iomem包括了除去一般意义的内存,还有其他设备的内存空间。

btw616 发表于 2011-09-19 22:06

回复 7# wangzhen11aaa


    这个我也明白。。iomem就是把内核中 struct resource 记录的信息输出了。里边记录的是所有设备对应的地址空间,。我困惑的是这个地址的本意是总线地址还是内存地址呢?当然,在x86平台上,这两个地址是一致的,不过如果是两个地址不一致的平台,它会记录哪个地址呢?还有一个疑问就是两个内存的量计算出的结果不一致。。偶就是因为这个问题被老师鄙视的。{:3_199:} 。。当然,被鄙视的问题还有其他,不过和这个帖子里的内容无关。

kernelinside 发表于 2011-09-20 11:02

>>iomem就是把内核中 struct resource 记录的信息输出了。
我原先以为iomem是根据e820图得到的。因为在dmesg里面的内存探测结果就是e820出来的。
你说的struct resource是个什么结构?

>>当然,在x86平台上,这两个地址是一致的,不过如果是两个地址不一致的平台,
在x86上,物理内存在iomem中是从0开始的,但至少我在arm上看到物理内存是从一个很大的地址开始的。

iomem比free/meminfo大,我个人的理解,是不是iomem=physical mem+ device ram
这里device ram可能还包括显卡自带的ram,硬盘自带的ram,不知道我理解得对不对。

你的老师说没意义----可能因为他也不知道答案。。。哈哈

btw616 发表于 2011-09-22 00:15

回复 9# kernelinside


>>> 你说的struct resource是个什么结构?

在 linux/kernel/resource.c 中,有

33 struct resource iomem_resource = {
34   .name   = "PCI mem",
35   .start= 0,
36   .end    = -1,
37   .flags= IORESOURCE_MEM,
38 };
39 EXPORT_SYMBOL(iomem_resource);

/proc/iomem 就是整理了这个结构中记录的信息输出的把。。这些结构体构成的了一个树形的结构来记录地址资源。。/proc/ioports 对应的是这个文件中上边的那个结构体。

>>> iomem比free/meminfo大,我个人的理解,是不是iomem=physical mem+ device ram

貌似设备分到的地址空间是与物理内存分到的地址空间是不同的,也就是在iomem中对应的诸多的Bus或者控制器之类的项目吧,物理内存分到的部分写的是System RAM,设备对应的应该是不会和物理内存对应的空间搅在一起吧...
页: [1] 2
查看完整版本: 求教:关于/proc/iomem 的一些疑问