Неожиданные изменения в данных, записанных в адрес физической памяти
Платформа - MIPS, а ядро - Linux 2.6.31.
Во-первых, я резервирую 8МЗ ОЗУ из общего объема ОЗУ 64М, поэтому ядро использует только 56МЗЗ. Во-вторых, я использую ioremap()
функция для преобразования физического адреса в виртуальный адрес в ядре, а затем записать мои данные. Как это:
void *virt_addr = (void *)ioremap(0x83800000,0x800000);//0x83800000 is the start physical address of 8M
memset_io(virt_addr,0,0x800000);
memcpy_toio(virt_addr,buf,0x800000);
iounmap(virt_addr);
Затем я читаю данные в uboot: сохраняя питание и перезагружая систему, я вхожу в uboot. Uboot использует физический адрес, поэтому я читаю данные, начиная с 0x83800000. Вот проблема: при 0x83800000(0M) один байт данных неверен, при 0x83c00000(4M) один байт данных неверен, а при 0x84000000(8M) один байт данных неверен. Но все остальные данные верны, так же, как buf! Так странно!! Я не знаю причину, кто может мне помочь? Спасибо...