Почему u-boot может поместить адрес глобальных данных в регистр r9?

Когда я смотрю исходный код U-Boot, я обнаружил, что он передает глобальные данные через регистр R9, как это

register volatile gd_t *gd asm ("r9")

Итак, мне любопытно, как u-boot гарантирует, что дополнительные коды не будут использовать регистр r9 и повреждать глобальные данные. Есть ли варианты сказать компилятору не использовать конкретный регистр?

2 ответа

Решение

Из Стандарта вызова процедур для архитектуры ARM:

Роль регистра r9 зависит от платформы. Виртуальная платформа может назначать любую роль этому регистру и должна документировать это использование. Например, он может обозначать его как статическую базу (SB) в позиционно-независимой модели данных или может обозначать его как регистр потока (TR) в среде с локальным хранилищем потока. Использование этого регистра может потребовать, чтобы удерживаемое значение было постоянным во всех вызовах. Виртуальная платформа, которая не нуждается в таком специальном регистре, может обозначать r9 как дополнительный регистр переменной, сохраняемый вызываемым пользователем, v6.

Тем не менее, у GCC нет профиля abi для резервирования. r9 для использования платформы, таким образом, u-boot делает это с опцией -ffixed-r9.

Ну, есть -фиксированные-рег. Однако, если весь код скомпилирован с этой переменной, объявленной как глобальная, он никогда не будет использоваться для каких-либо других целей (см. https://gcc.gnu.org/onlinedocs/gcc/Global-Reg-Vars.html).

Другие вопросы по тегам