Comments 6
Хорошо когда под рукой имеются исходники микропроцессора и можно легко исправить назойливый баг или дописать требуемую фичу. Молодец!
А можно ли было в ядре SCR1 воспользоваться точкой наблюдения или модулем защиты (если он есть) для программирования обнаружения обращения по 0-му адресу? Тогда ничего и править не нужно было бы.
Спецификация на RISC-V предлагает реализовывать модуль физической защиты памяти (Physical Memory Protection), чтобы ограничивать доступ к памяти в зависимости от типа доступа (чтение, запись или исполнение) и в зависимости от уровня привилегии исполняемого кода (User, Supervisor, Machine).
Но в scr1 PMP не реализован. И режим привилегий на scr1 в железе зашит на самый высокий M-mode. Всё таки процессор небольшой, код на нем простой bare metal, нет смысла делать несколько уровней привилегий.
Поэтому нет, в scr1 нет возможности, не добавляя чего-то, ограничить доступ к памяти. И физически всё адресное пространство от 0x00000000
до 0xFFFFFFFF
на scr1 доступно для чтения и записи
Спасибо. А возможность установки точки наблюдения (watсhpoint) есть?
Да, можно.
В scr1 среди модулей для отладки есть Trigger Debug Unit. Его можно настроить на вызов исключения, если ядро попытается прочитать из заданного адреса.
Для этого в начале программы надо добавить:
set_csr(mcontrol, MCONTROL_M | MCONTROL_EXECUTE |
MCONTROL_STORE |
MCONTROL_LOAD);
Теперь если процессор попытается обратиться к 0-му адресу TDU вызовет исключение. Эта команда включит триггер на запись, чтение и исполнение, и разрешает триггериться. Тип действия при триггере (0 - Raise a breakpoint exception) и адрес для сравнения (TDATA2
- 0x00000000
) нас устраивают значения по умолчанию после сброса.

На временной диаграмме видно, что когда адрес чтения становится 0, вызывается исключение.
Если подключен JTAG отладчик, то можно настроить TDU на переход в режим Debug Mode.
Разыменовываем NULL на RISC-V ядре scr1