Почему 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).