Linux

时间:2016-02-10 05:09:15

标签: linux linux-kernel embedded-linux kernel-module

我想从Linux内核(通过用户空间或内核空间)访问(读取和写入)所有RAM(使用物理地址)我们可以这样做吗? 用户空间有哪些可能性和局限性? 我们可以使用可加载内核模块在多大程度上做到这一点?

谢谢和问候, Veerendranath

1 个答案:

答案 0 :(得分:1)

您可以使用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;
}