我想从Linux内核(通过用户空间或内核空间)访问(读取和写入)所有RAM(使用物理地址)我们可以这样做吗? 用户空间有哪些可能性和局限性? 我们可以使用可加载内核模块在多大程度上做到这一点?
谢谢和问候, Veerendranath
答案 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;
}