Я хочу написать свой код, который будет обрабатывать пропуски TLB на Microblaze и через это, конечно, таблицы страниц и т. Д. Это все делается на OVPsim.Почему доступ к немаркированному местоположению не генерирует аппаратное исключение (Microblaze)
Как я учусь, как я иду, я написал эту небольшую часть сборки для ссылки на неотображённом месте (0x1000000) - Я бег это, как привилегированный код VM на:
ori r20, r0, 0
ori r12, r0, 0x1000000
/* next line should break it */
sw r20, r12, r0
(Т.е., написать содержание r20 == 0
из адреса, образованный ORing r12 == 0x1000000
и r0 == 0 => 0x1000000
очевидно)
Но вместо того, чтобы прыгать в вектор исключения, сообщает GDB «Программа получила SIGSEV». - что же я не так? У меня нет бит включения включенных аппаратных исключений в MSR, но в руководстве говорится, что вы не можете замаскировать эти исключения в любом случае, так что это не должно быть проблемой.
Дополнительная информация Я не могу получить (например, исключая несоосность) код обработки исключений для выполнения (если только я его явно не назову), независимо от того, использую ли я отладчик. С отладчиком выключения я получаю этот выход из OVPsim (NB я просто изменил тестовый адрес - не существует никакого значения разницы между 0xA000000 и 0x100000 выше):
Processor Exception (PC_PRX) Processor 'platform/cpu0' 0x248: sw r20, r12, r0
Processor Exception (PC_WPX) No write access at 0xa000000
Это весь код запускаемых в привилегированном режиме, поэтому я не вижу явной причины для того, чтобы он не вызывал обработчиков, , если только Я не настроил Microblaze правильно. Я их включил:
icmAddStringAttr(cpu1_attr, "endian", "big");
icmAddDoubleAttr(cpu1_attr, "mips", 100.000000);
icmAddStringAttr(cpu1_attr, "variant", "V8_20");
icmAddBoolAttr(cpu1_attr, "verbose", "true");
icmAddUns32Attr(cpu1_attr, "C_PVR", 2);
icmAddUns32Attr(cpu1_attr, "C_USE_MMU", 3);
icmAddStringAttr(cpu1_attr, "C_USE_BARREL", "1");
icmAddStringAttr(cpu1_attr, "C_USE_DIV", "1");
icmAddUns32Attr(cpu1_attr, "C_USE_INTERRUPT", 1);
icmAddUns32Attr(cpu1_attr, "C_MMU_TLB_ACCESS", 3);
icmAddUns32Attr(cpu1_attr, "C_UNALIGNED_EXCEPTIONS", 1);
icmAddUns32Attr(cpu1_attr, "C_ILL_OPCODE_EXCEPTION", 1);
icmAddUns32Attr(cpu1_attr, "C_DIV_ZERO_EXCEPTION", 1);
icmAddUns32Attr(cpu1_attr, "C_OPCODE_0x0_ILLEGAL", 1);
icmAddUns32Attr(cpu1_attr, "C_DEBUG_ENABLED", 1);
Там нет никаких оснований полагать, что это не будет работать, как OVPsim будет работать Linux на MicroBlaze.
Конфигурация Microblaze выглядит нормально. Вывод эмулятора выглядит немного странным. Исключение «Отсутствие записи» может означать, что соответствующая страница была найдена в TLB, но не имеет права на запись. Вы должны увидеть исключение даже в этом случае. Попробуйте установить бит 'EE' в' MSR', хотя на всякий случай его реализация OVPsim неверна. – dkz
У меня уже установлен бит EE :( MSR is 0x2502 – adrianmcmenamin
Еще одно предложение - установить параметр Microblaze 'C_MMU_ZONES = 2'. Даже если вы не используете защитные зоны, когда этот параметр равен 0 Microblaze не генерирует код или исключение доступа к данным – dkz