我想从Linux内核(通过用户空间或内核空间)访问(读写)所有RAM(使用物理地址),可以吗?
用户空间有哪些可能性和限制?
我们可以在多大程度上使用可加载的内核模块来实现这一点?
谢谢和问候,
韦伦德拉纳

最佳答案

您可以使用mmap从用户空间访问物理地址。

#include <sys/types.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>

#define PHY_ADDR 0x807feff

int main()
{
    int i;
    unsigned int *addr;

    int fd = open( "/dev/mem", O_RDWR | O_SYNC );
    if( fd < 0 )
    {
        perror( "Error opening file /dev/mem" );
        return 1;
    }

    addr = (unsigned int *) mmap( 0, getpagesize(), PROT_READ | PROT_WRITE, MAP_SHARED, fd, PHY_ADDR );
    if( addr == NULL )
    {
        perror( "Error mapping" );
        return 1;
    }
    for( i = 0; i < 256 / 4; i++ )
        printf( "addr: %X\tval: %X\n", addr + i, *( addr + i ) );

    if( munmap( addr, getpagesize() ) == -1 )
    {
        perror( "Error unmaping" );
        return 1
    }

    close( fd );
    return 0;
}

关于linux - Linux上的RAM访问,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35307264/

10-12 18:05