【问题标题】:Access permissions of /dev/mem/dev/mem的访问权限
【发布时间】:2011-09-02 08:40:26
【问题描述】:

我有一组关于/dev/mem的问题:

  1. 网上很多文章,好像把/dev/mem作为"Physical RAM"的网关。但如果我是对的,/dev/mem 是处理器的"Physical Address Space" 的网关,它可能包括许多硬件外设的控制寄存器,而不仅仅是 RAM?如果我错了,请纠正我!

  2. 为了防止攻击者滥用/dev/mem 和更改内核内存,需要启用标志CONFIG_STRICT_DEVMEM,以防止用户应用访问超过1MB 的物理地址空间。我检查了我的电脑(Ubuntu)上的配置文件,发现CONFIG_STRICT_DEVMEM = y。我写了一个程序,它试图读取超过 1 MB 的物理内存,我能够读取!没有分段错误或任何Operation NOT Permitted 错误。这怎么可能?

我的程序大致是这样的:

fd = open ( "/dev/mem", O_RDWR);
ptr = (int*) mmap(0, MAP_SIZE, PROT_READ, fd, myAddress & (~MAP_MASK));
printf("%d", *ptr);

【问题讨论】:

  • 您实际上是在阅读还是只是在映射它?

标签: linux memory linux-kernel


【解决方案1】:

下面的结果是什么:

cat /dev/mem | wc

我明白了:

cat: /dev/mem: Operation not permitted
   1908   11791 1048576

所以对我来说它确实停止在 1MB。

请注意,cat 使用的是 open,而不是 mmap,因此它不是一个相同的测试。

您确定您正在阅读超过 1MB 的内容吗?

【讨论】:

  • 这是我正在运行的程序 link 然后我运行 'code'sudo ./a.out 0xFFFF0000'code' 并得到输出为 'code'/dev/mem 打开。内存映射在地址 0x7fbf1409f000。地址 0x0 (0x7fbf1409f000) 处的值:0xF000E819'code'
  • 我需要编写一个 /dev/mem 驱动程序来访问所有物理内存,这是一个内存诊断工具。如果我将 CONFIG_STRICT_DEVMEM 更改为 =N,将允许访问所有 phy.记忆?我必须重建内核还是只重建内存驱动模块?谢谢
【解决方案2】:
  1. 是的,你是对的,/dev/mem 允许你映射任何物理地址,包括非 RAM 内存映射的 IO。这对于在不编写内核驱动程序的情况下快速而肮脏地访问某些硬件设备非常有用。

  2. CONFIG_STRICT_DEVMEM 使内核检查 /dev/mem 中的地址,devmem_is_allowed()arch/x86/mm/init.c 中,并且那里的注释解释说:

    * On x86, access has to be given to the first megabyte of ram because that area
    * contains bios code and data regions used by X and dosemu and similar apps.
    * Access has to be given to non-kernel-ram areas as well, these contain the PCI
    * mmio resources as well as potential bios/acpi data regions.
    

    您的地址 0xFFFF0000 很可能是非 RAM,因为 BIOS 通常将 IO 内存设置为略低于 4GB,因此即使使用 STRICT_DEVMEM 也可以映射它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-14
    • 2014-09-04
    相关资源
    最近更新 更多