Загрузите справочные статьи и сопутствующие материалы для этого блога. :
ARM хранилище система Введение : ARM Процессоры делятся на три уровня: регистры процессора -> TCM хранилищеустройство -> вспомогательное устройство, сверху вниз, Скорость обработки постепенно замедляется, Но пространство дахранилище последовательно увеличивается ;
Cache источник : Cache используется для решения процессор и хранилищеустройство между Проблема неэффективной передачи данных;
Cache определение :
Адрес виртуальной машины и физический адрес :
MMU эффект : выполнить физический адрес приезжать виртуальный адрес преобразование ;
Справочное руководство : Ядро ARM руководство Arm1176jzfs.pdf ( на основе 6410 Совет по развитию ARM 11 )
закрытие MMU и Cache Введение :
C1 контрользарегистрироваться Введение :
C7 зарегистрироваться Введение :
MCR p15, 0, <Rd>, c7, c7, 0
, Да документ серединалист 3-71 Cache действовать серединаданныйиз;
закрытие MMU и Cache Написание кода :
disable_mmu :
; MCR p15, 0, <Rd>, c7, c7, 0
,Чтосередина Rd Универсальныйзарегистрироваться настраиватьдля R0, Окончательный код MCR p15, 0, R0, c7, c7, 0
;MRC
Приходить Воляассоциацияпроцессорсерединаизсодержаниечитатьприезжать Универсальныйзарегистрироватьсясередина, Формат синтаксиса: MRC{cond} P15,<Opcode_1>,<Rd>,<CRn>,<CRm>,<Opcode_2>
, делатьиспользовать MCR
Воля Rd зарегистрироватьсясерединаизценитьпередаватьприезжать CP15 ассоциацияпроцессорсередина, Формат синтаксиса: MCR{cond} P15,<Opcode_1>,<Rd>,<CRn>,<CRm>,<Opcode_2>
;MRC p15, 0, R0, c1, c0, 0
Воля c1 зарегистрироватьсясерединаизценить читатьприезжать R0 Универсальныйзарегистрироватьсясередина; bic r0, r0, #0x7
;MRC p15, 0, r0, c1, c0, 0
инструкция, Воля R0 зарегистрироватьсясерединаизценить напиши ответприезжать C1 зарегистрироватьсясередина; BL
инструкция Прыжокприезжать disable_mmu
Выполнено на лейбле, При этом обратный адрес Воля хранилищеприезжать LR
зарегистрироватьсясередина, Прыгайте при возвращении приезжать LR
зарегистрироватьсясерединаизадресосуществлять Прямо сейчас Может, делатьиспользовать mov pc, lr
инструкция, осуществлять lr адрес середина указывает на код из Расположения; disable_mmu :
mcr p15,0,r0,c7,c7,0 @ настраивать I-Cache и D-Cache Неверный
mrc p15,0,r0,c1,c0,0 @ Воля c1 зарегистрироватьсясерединаизценить читатьприезжать R0 Универсальныйзарегистрироватьсясередина bic r0, r0,#0x00000007 @ делатьиспользовать bic Кусочек Прозрачныйинструкция, Воля R0 зарегистрироватьсясерединаиз Нет. 0, 1,2 три Кусочек настраиватьстановиться0, представлять закрытие MMU и D-Cache
mcr p15,0,r0,c1,c0,0 @ Воля R0 зарегистрироватьсясерединаизценитьнапиши ответприезжать C1 зарегистрироватьсясередина
mov pc, lr @ Вернуться в приезжать точка возврата Продолжить изучение кода
Пример ассемблерного кода : Bootloader процесс : ① Инициализировать таблицу векторов исключений , ② настраивать svc модель , ③ закрытиесторожевой пес,④ закрытиесерединаперерыв, ⑤ закрытие MMU ;
@****************************
@File:start.S
@
@BootLoader инициализациякод
@****************************
.text @ Макрос Укажите часть кода
.global _start @ Псевдостандарт объявляет глобальный стартовый символ
_start: @ входной знак программы
b reset @ reset Комплексное исключение Кусочек
ldr pc, _undefined_instruction @ Не определение ненормальное, Воля _undefined_instruction Загрузка стоимости приезжать pc указательсередина
ldr pc, _software_interrupt @ Исключение мягкого перерыва
ldr pc, _prefetch_abort @ Исключение по предварительной выборке
ldr pc,_data_abort @ данныечитатьаномальный
ldr pc, _not_used @ занимать 0x00000014 адрес
ldr pc, _irq @ Исключение из обычного середина
ldr pc, _fiq @ Исключение мягкого перерыва
_undefined_instruction: .word undefined_instruction @ _undefined_instruction Метка хранит значение, Значение 32 Кусочекадрес undefined_instruction, undefined_instruction даодинадрес
_software_interrupt: .word software_interrupt @ Исключение мягкого перерыва
_prefetch_abort: .word prefetch_abort @ Исключение по предварительной выборке иметь дело с
_data_abort: .word data_abort @ данныечитатьаномальный
_not_used: .word not_used @ нулевой Кусочекиметь дело с
_irq: .word irq @ обычносерединаперерывиметь дело с
_fiq: .word fiq @ быстрыйсерединаперерывиметь дело с
undefined_instruction: @ undefined_instruction адрес Требования к хранениюосуществлятьизсодержание
nop
software_interrupt: @ software_interrupt адрес Требования к хранениюосуществлятьизсодержание
nop
prefetch_abort: @ prefetch_abort адрес Требования к хранениюосуществлятьизсодержание
nop
data_abort: @ data_abort адрес Требования к хранениюосуществлятьизсодержание
nop
not_used: @ not_used адрес Требования к хранениюосуществлятьизсодержание
nop
irq: @ irq адрес Требования к хранениюосуществлятьизсодержание
nop
fiq: @ fiq адрес Требования к хранениюосуществлятьизсодержание
nop
reset: @ reset адрес Требования к хранениюосуществлятьизсодержание
bl set_svc @ Прыжокприезжать set_svc Место разметкиосуществлять bl disable_watchdog @ Прыжокприезжать disable_watchdog этикеткаосуществлять, закрытиесторожевой пес
bl disable_interrupt @ Прыжокприезжать disable_interrupt этикеткаосуществлять,закрытиесерединаперерыв bl disable_mmu @ Прыжокприезжать disable_mmu этикеткаосуществлять, закрытие MMU
set_svc:
mrs r0, cpsr @ Воля CPSR зарегистрироватьсясерединаизценить Экспорт приезжать R0 зарегистрироватьсясередина
bic r0, r0, #0x1f @ Воля R0 зарегистрироватьсясерединаизценить и #0x1f стоять Прямо сейчасчисло осуществлять идействовать, И результаты Воля спасли приезжать R0 зарегистрироватьсясередина, Актуально да Волязарегистрироваться 0 ~ 4 Кусочек набор 0
orr r0, r0, #0xd3 @ Воля R0 зарегистрироватьсясерединаизценить и #0xd3 стоять Прямо сейчасчисло выполнить илидействовать, И результаты Воля спасли приезжать R0 зарегистрироватьсясередина, Актуальная данарегулировка 0 ~ 4 Кусочек зарегистрироватьсяценить код рабочей модели изпроцессора
msr cpsr, r0 @ Воля R0 зарегистрироватьсясерединаизценить держатьприезжать CPSR зарегистрироватьсясередина
mov pc, lr @ Вернуться в приезжать точка возврата Продолжить изучение кода
#define pWTCON 0x7e004000 @ определениесторожевой песконтрользарегистрироваться адрес ( 6410Совет по развитию )
disable_watchdog:
ldr r0, =pWTCON @ Первый Воляконтрользарегистрироватьсяадресдержатьприезжать Универсальныйзарегистрироватьсясередина mov r1, #0x0 @ подготовить один 0 ценить,сторожевой песконтрользарегистрироваться Всенастраиватьдля0, Прямо сейчасwatchdog также закрытие
str r1, [r0] @ Воля 0 ценить настраиватьприезжать сторожевой песконтрользарегистрироватьсясередина
mov pc, lr @ Вернуться в приезжать точка возврата Продолжить изучение кода
disable_interrupt:
mvn r1,#0x0 @ Воля 0x0 в соответствии с Кусочекотрицать, получать Полный 1 изданные, настраиватьприезжать R1 зарегистрироватьсясередина
ldr r0,=0x71200014 @ настраивать Нет.одинсерединаперерывщитзарегистрироваться, Первый Воля зарегистрироваться адреснагрузкаприезжать Универсальныйзарегистрироваться R0 середина
str r1,[r0] @ Снова Воля Полный 1 изценитьнастраиватьприезжать зарегистрироватьсясередина, Должензарегистрироватьсяиз Памятьадресуженагрузкаприезжать Понятно R0 Универсальныйзарегистрироватьсясередина ldr r0,=0x71300014 @ настраивать Нет.двасерединаперерывщитзарегистрироваться, Первый Воля зарегистрироваться адреснагрузкаприезжать Универсальныйзарегистрироваться R0 середина
str r1,[r0] @ Снова Воля Полный 1 изценитьнастраиватьприезжать зарегистрироватьсясередина, Должензарегистрироватьсяиз Памятьадресуженагрузкаприезжать Понятно R0 Универсальныйзарегистрироватьсясередина mov pc, lr @ Вернуться в приезжать точка возврата Продолжить изучение кода
disable_mmu :
mcr p15,0,r0,c7,c7,0 @ настраивать I-Cache и D-Cache Неверный
mrc p15,0,r0,c1,c0,0 @ Воля c1 зарегистрироватьсясерединаизценить читатьприезжать R0 Универсальныйзарегистрироватьсясередина bic r0, r0,#0x00000007 @ делатьиспользовать bic Кусочек Прозрачныйинструкция, Воля R0 зарегистрироватьсясерединаиз Нет. 0, 1,2 три Кусочек настраиватьстановиться0, представлять закрытие MMU и D-Cache
mcr p15,0,r0,c1,c0,0 @ Воля R0 зарегистрироватьсясерединаизценитьнапиши ответприезжать C1 зарегистрироватьсясередина
mov pc, lr @ Вернуться в приезжать точка возврата Продолжить изучение кода
gboot.lds скрипт компоновщика Анализ кода :
OUTPUT_ARCH(имя схемы)
указатьвыходной формат,Прямо сейчаспроцессориз Архитектура, здесьда arm архитектураиз, OUTPUT_ARCH(arm)
;ENTRY(Вход Расположение)
, существоватьначальстволапшаиз Start.S серединанастраиватьизпрограмма Входда _start
, Код ENTRY(_start)
;.text :
настраиватькодчасть; .data :
настраиватьданныечасть;.bss :
настраивать BSS часть;
bss_start = .;
;bss_end = .;
;. = ALIGN(4);
настройки четырехбайтовое выравнивание Прямой сейчас Может;OUTPUT_ARCH(arm) /*Указываем структуру процессора*/
ENTRY(_start) /*Указываем вход в программу существовать _start Место маркировки*/
SECTIONS {
. = 0x50008000; /*Вся ссылка на программу начинается с «Расположения», По данным Совета по развитию Конечно, другой Совет по развитиюадреснепоследовательный*/
. = ALIGN(4); /*Выровнять дело с, Выполняется перед началом каждой части 4 Выравнивание байтов */
.text : /*кодчасть*/
{
start.o (.text) /*start.S Конвертировать в часть кода*/
*(.text) /*Другие коды*/
}
. = ALIGN(4); /*Выровнять дело с, Выполняется перед началом каждой части 4 Выравнивание байтов */
.data : /*данныечасть*/
{
*(.data)
}
. = ALIGN(4); /*Выровнять дело с, Выполняется перед началом каждой части 4 Выравнивание байтов */
bss_start = .; /*Записывать bss частьначинать Расположение*/
.bss : /*bss часть*/
{
*(.bss)
}
bss_end = .; /*Записывать bss часть Заканчивать Расположение*/
}
makefile Написание документов :
%.o : %.S
, Производственный процессда arm-linux-gcc -g -c $^
, Чтосередина ^
Идентификация дааллиззависит от документа, существовать по этому правилу start.S будет мутировать в start.o ; %.o : %.c
, Производственный процессда arm-linux-gcc -g -c $^
; all: start.o #зависит от start.o
arm-linux-ld -Tgboot.lds -o gboot.elf $^ #делатьиспользоватьскрипт компоновщика, Воля start.o конвертировать в gboot.elf
arm-linux-objcopy -O binary gboot.elf gboot.bin #Воля gboot.elf Конвертироватьдля Можетпрямойсуществоватьдосканачальствоосуществлятьиз gboot.bin документ
%.o : %.S #общие правила, нравиться start.o Да start.S компилировать Приходитьиз, -c да Толькокомпилировать Нет ссылки
arm-linux-gcc -g -c $^
%.o : %.c #общие правила, нравиться start.o Да start.c компилировать Приходитьиз, -c да Толькокомпилировать Нет ссылки
arm-linux-gcc -g -c $^
.PHONY: clean
clean: #clearкомпилировать информацию
rm *.o *.elf *.bin
Процесс компиляции :
make
; Загрузите справочные статьи и сопутствующие материалы для этого блога. :