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

  • 网上许多文章似乎都将/dev/mem称为"Physical RAM"的网关。但是,如果我是正确的话,/dev/mem是通往处理器"Physical Address Space"的网关,它可能包括许多硬件外设的控制寄存器,而不仅仅是RAM?请纠正我,如果我错了!
  • 为了防止攻击者滥用/dev/mem和更改内核内存,需要启用标志CONFIG_STRICT_DEVMEM,这将阻止用户应用访问1MB以上的物理地址空间。我在PC(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);
    

    最佳答案

  • 是的,您是对的,/dev/mem允许您映射任何物理地址,包括非RAM内存映射的IO。这对于快速而又肮脏的黑客无需编写内核驱动程序即可访问某些硬件设备很有用。
  • CONFIG_STRICT_DEVMEM使用devmem_is_allowed()中的arch/x86/mm/init.c在/dev/mem中使内核检查地址,并且其中的注释说明:
    * 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也可以映射它的原因。
  • 关于linux -/dev/mem的访问权限,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6134984/

    10-11 16:45