2014-11-17 1 views
5

Я хочу написать свой код, который будет обрабатывать пропуски 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.

+0

Конфигурация Microblaze выглядит нормально. Вывод эмулятора выглядит немного странным. Исключение «Отсутствие записи» может означать, что соответствующая страница была найдена в TLB, но не имеет права на запись. Вы должны увидеть исключение даже в этом случае. Попробуйте установить бит 'EE' в' MSR', хотя на всякий случай его реализация OVPsim неверна. – dkz

+0

У меня уже установлен бит EE :( MSR is 0x2502 – adrianmcmenamin

+0

Еще одно предложение - установить параметр Microblaze 'C_MMU_ZONES = 2'. Даже если вы не используете защитные зоны, когда этот параметр равен 0 Microblaze не генерирует код или исключение доступа к данным – dkz

ответ

1

С благодарностью Джейми Гарсиде в группе «Реальные системы» Йоркского университета: установка по умолчанию для симулятора OVP - это исключение из ловушек и выход из симуляции, поэтому никакое исключение не выполнялось так, как я ожидал, - вместо этого их просто сообщали как о какой-то ошибке, и симуляция прекращалась.

Однако, если для моделирования определено ICM_ATTR_SIMEX, то симуляция выполнит обработчики исключений так, как будет работать с реальным процессором, поэтому добавление ICM_ATTR_SIMEX к атрибутам моего экземпляра - например, путем ORing, как показано ниже, ставит все на своем законном месте:

#define SIM_ATTRS (ICM_ATTR_DEFAULT|ICM_ATTR_SIMEX) 
2

Исключено ваше исключение TLB, это GDB, который блокирует вас от попадания в обработчик.

Отладка режима виртуальной машины является сложной задачей. Я не знаком из OVPsim и насколько хорошо она интегрирована с GDB, но есть несколько способов работы своего пути через него:

  1. Явных программная точка останова. Просто используйте инструкцию brk r16, 0x18, где вы хотите установить контрольную точку в коде и позволить GDB идти с командой continue. Он остановится, как только он выполнит этот разрыв, независимо от его пользовательского кода VM или обработчика исключений.

    Недостатком этого, нет простого способа продолжить работу с GDB, как только он достигнет такого рода перерывов. Вам необходимо либо изменить r16 на следующий адрес инструкции, либо заменить инструкцию brk на nop от GDB.

  2. Аппаратная точка останова. Этот самый простой перерыв, который вы можете использовать для отладки как стороны исключения, так и кода на стороне VM, не беспокоясь о присутствии страницы TLB. Но аппаратные точки останова требуют аппаратной поддержки от Microblaze (не уверены, поддерживает ли OSPsim). Чтобы использовать его в GDB, используйте hbreak (или hb) вместо команды break.

  3. GDB soft-breakpoints.Вы все еще можете использовать обычные точки останова GDB, если знаете, как они работают, и ваша VM-модель достаточно проста. В основном GDB нуждается в доступе на запись на кодовую страницу, где вы хотите сломать (для того, чтобы написать инструкцию brk). Поэтому в режиме VM вы должны убедиться, что страница присутствует в TLB и имеет доступ на запись.

    Еще сложнее установить перерыв из режима без VM в VM-код, когда ваш виртуальный адрес отличается от физического. Вы должны быть уверены, что страница, которую вы хотите поместить в точку останова, загружается в физическую память и вручную переводит виртуальный адрес на физический и устанавливает точку останова. Поэтому, если у вас нет сопоставления 1: 1 (и весь код и данные находятся внутри памяти), или вы написали свой собственный GDB stub, это краска для использования точек останова GDB.

К сожалению, переход к коду в GDB почти так же, как и при использовании разностных точек GDB. То есть вы в порядке, вступая в не-VM-код, или внутри одной загруженной VM-страницы, имеющей права на запись. Но как только вам нужно иметь дело с чем-то вне TLB или получить доступ к VM-коду от не-VM, это может стать действительно разочаровывающим.

+0

Спасибо за ответ. Но если я отлажу отладку, это просто сломает симуляцию. Я знаю, что должен быть способ чтобы заставить это работать, так как вы можете запускать ядро ​​Linux на OVP и явно полагаться на пейджинг запросов. Я пропустил некоторые возможные настройки для Microblaze, когда я его настроил, вы думаете? – adrianmcmenamin

+0

Вам не нужно полностью отлаживать отладчик, вам просто нужно использовать его более тщательно. GDB в порядке, отлаживая простой код как VM, так и не-VM, но если вы пытаетесь выполнить исключение TLB, GDB становится умным или слишком непредсказуемым. Другое мнение - сам эмулятор. Например. Реализация QEMU MMU не была полной и достаточно хорошей, чтобы разместить ядро ​​Linux. Я бы предложил запустить настоящий проект Microblaze с модулем отладки и отладить его с помощью инструмента Xilin XMD, который прост, прост и предсказуем. – dkz

+0

Я просто верю, что получаю исключение TLB или вообще любые исключения, потому что отладчик здесь не проблема. Я думаю, что это проблема установки, то есть я пропустил какую-то настройку при настройке или загрузке вещи. – adrianmcmenamin

Смежные вопросы