GNU Ассемблер и Векторная таблица исключений - PullRequest
0 голосов
/ 22 марта 2020

Я прошел учебник по Baking Pi, и я изучил системный вызов SV C, в учебнике по Baking Pi он установил базу моей программы 0x8000, но база векторных таблиц равна 0, как мне это сделать? получить доступ к 0x0 с помощью ассемблера GNU и использовать, какой kernel.ld я сейчас использую?

1 Ответ

0 голосов
/ 22 марта 2020

очень широкий вопрос. в зависимости от числа по умолчанию вы можете начать с 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), и у каждого есть свои проблемы, но все они были рассмотрены на форуме.

...