Как правильно распределить определенную область памяти, используя mmap в C?Я прочитал / proc / self / maps, чтобы определить, доступна ли эта область.
Я пробовал следующее, но происходит сбой при попытке записи в выделенную память:
// rdram is defined in header as: #define rdram ((unsigned int *)0x80000000)
printf( "rdram=0x%x", (int)rdram );
printf( "munmapping" );
munmap ((void*)0x80000000, 0x800000);
printf( "mmapping" );
if(mmap ((void*)0x80000000, 0x800000,
PROT_READ | PROT_WRITE,
MAP_FIXED | MAP_PRIVATE | MAP_ANONYMOUS,
-1, 0) <= 0)
{
printf( "mmap(0x80000000) failed" );
}
else
{
for (i=0; i<(0x800000/4); i++)
{
printf( "writing a zero at 0x%x", (0x80000000 + i) );
rdram[i]=0; // <<---------CRASH HERE--------<<
}
printf( "done writing zeros" );
}
В моем предыдущем вопросе (который был закрыт из-за отсутствия четкой формулировки) было предложено, чтобы я неправильно определял, когда произошел сбой mmap, и что мне следует использовать posix_typed_mem_open вместо -1 для параметра fildes.Я подумал, что попробую следующее (пожалуйста, дайте мне знать, если с этим что-то не так):
int m;
int p;
printf( "rdram=0x%x", (int)rdram );
printf( "munmapping" );
munmap ((void*)0x80000000, 0x800000);
printf( "posix_typed_mem_open" );
p = posix_typed_mem_open( "/memory/ram", O_RDWR, POSIX_TYPED_MEM_ALLOCATE_CONTIG );
printf( "mmapping" );
m = (int) mmap ((void*)0x80000000, 0x800000,
PROT_READ | PROT_WRITE,
MAP_FIXED | MAP_PRIVATE | MAP_ANONYMOUS,
p, 0);
if( m == (int) MAP_FAILED )
{
printf( "mmap failed" )
}
else
{
for (i=0; i<(0x800000/4); i++)
{
printf( "writing a zero at 0x%x", (0x80000000 + i) );
rdram[i]=0;
}
printf( "done writing zeros" );
}
Это выполняется на одном из моих тестеров (отображение памяти на моем устройстве).не подходит), поэтому я хотел бы знать, что это имеет смысл, прежде чем я заставлю его запустить его, чтобы посмотреть, какой вывод он получит.