очень широкий вопрос. в зависимости от числа по умолчанию вы можете начать с 0x8000 или 0x80000. теперь есть разные имена файлов, чтобы указать загрузчику, в каком режиме вы хотите использовать процессор kernel.img, kernel7.img kernel32.img или несколько различных комбинаций, которые вы можете легко найти.
сначала был выпеченный пи вопросы, как написано, но спрашивали и отвечали много раз на baremetal форумах веб-сайта raspberry pi (очень хороший ресурс, который я видел давно, если не когда-либо). вам нужно будет использовать старый старый пи или пи-ноль, чтобы заставить учебник работать, если он не был обновлен.
это голый металл, у вас есть целое адресное пространство, если вы хотите поместить что-то в ноль, вы просто делаете это.
Другой подход заключается в том, что вы можете создать файл config.txt, и вы можете указать загрузчику в графическом процессоре загрузить ваш образ до 0x00000000 в адресном пространстве оружия. в зависимости от того, какое ядро вы используете, вы также можете использовать регистр VTOR, если он присутствует, чтобы изменить местонахождение таблицы векторов (поэтому установите его в 0x80000 вместо 0x0000. Я не думаю, что arm11 в пи-ноле или старом старом pis позволяет хотя 32-битный режим на более новых версиях работает, но они многоядерные, и это приведет к распаду любых обучающих упражнений. Вы должны «отсортировать ядра», как я хотел бы сказать при загрузке, изолировать одно для продолжения и поместить остальные в бесконечном l oop, чтобы они не мешали. загрузочный код, который gpu устанавливает для вас на этих числах, делает это за вас, так что только один нажимает 0x8000 или 0x80000, так что подход config.txt - это то, что люди рассматривают, но Я бы порекомендовал против этого какое-то время.
На форуме raspberrypi, посвященном голому металлу, есть ссылки на несколько учебных пособий, которые помогут вам выйти за рамки выпекания пи и (или) помочь вам пройти через них. они как люди боролись с ними в течение некоторого времени.
скрипт компоновщика, подобный этому
MEMORY
{
ram : ORIGIN = 0x8000, LENGTH = 0x10000
}
SECTIONS
{
.text : { *(.text*) } > ram
.rodata : { *(.rodata*) } > ram
.bss : { *(.bss*) } > ram
.data : { *(.data*) } > ram
}
с bootstrap, подобным этому
.globl _start
_start:
mov sp,#0x8000
bl main
hang: b hang
должен загрузить вас.
для сценария компоновщика вам может понадобиться 0x80000 вместо 0x8000, и если у вас есть хотя бы один. элемент данных, как глобальная переменная:
unsigned int x = 5;
, тогда bootstrap не должен обнулять .bss (если ваш стиль программирования таков, что вы полагаетесь на это). objcopy заполняет двоичный файл -O нулями между .rodata и .data, если там есть .data, который заботится об обнулении bss.
вы можете позволить инструментам выполнять всю работу за вас, вплоть до таблицы исключений гласит:
.globl _start
_start:
ldr pc,reset_handler
ldr pc,undefined_handler
ldr pc,swi_handler
ldr pc,prefetch_handler
ldr pc,data_handler
ldr pc,unused_handler
ldr pc,irq_handler
ldr pc,fiq_handler
reset_handler: .word reset
undefined_handler: .word hang
swi_handler: .word hang
prefetch_handler: .word hang
data_handler: .word hang
unused_handler: .word hang
irq_handler: .word irq
fiq_handler: .word hang
reset:
mov r0,#0x8000
mov r1,#0x0000
ldmia r0!,{r2,r3,r4,r5,r6,r7,r8,r9}
stmia r1!,{r2,r3,r4,r5,r6,r7,r8,r9}
ldmia r0!,{r2,r3,r4,r5,r6,r7,r8,r9}
stmia r1!,{r2,r3,r4,r5,r6,r7,r8,r9}
теперь, если это не пи-ноль, тогда таблица векторов работает по-другому, вам все равно нужно прочитать документацию по оружию, прежде чем приступать к подобным вещам, но читать по ядру и режиму как а также документы по архитектуре для того, что вы используете. Более новые pis имеют режим armv7 и режим armv8 (aarch32 и aarch64), и у каждого есть свои проблемы, но все они были рассмотрены на форуме.