vova7890
Участник-
Постов
42 -
Зарегистрирован
-
Посещение
Репутация
0 ОбычныйИнформация о vova7890
-
Звание
Участник
- День рождения 03.12.1992
Контакты
-
ICQ
Array
-
Отвечу сам себе - нужно использовать сопроцессор-mmu и смотреть в сторону FSR регистра, чтобы получить от mmu тип исключения и адрес.
-
Всем привет. В общем, озадачился я реализацией сией фукнции на ARMv5. Функция, помимо зеркалирования памяти(ну тут понятно, можно через mmu), должна уметь зеракалировать файлы. Идея в реализации одна - обрабатывать датааборты на чтение виртуально "не существующей" памяти и там уже читать файл, предварительно вернувшись в usr режим и продолжая выполнять чтение уже в контексте программы. Но, чтобы определить, что, как, куда и откуда читает, нужно узнать тип инструкции и адрес чтения/ записи. Вот этот момент меня и интересует. Получается, нужно какбы "эмулировать" инструкцию, тоесть узнать какой тип данных она пишет/читает(byte, hword, word) и номера регистров с которых читают и куда пишут. Я правильно понимаю логику, или есть более простые пути нежели емулировать инструкции? Пытался найти ответ в исходниках линукса, ничего интересного так и не нашёл. Если тут и вправду нужна эмуляция, подскажите где можно посмотреть реализцию. А то в этих опкодах чёрт ногу сломит...
-
ну правильно, а шоб оно создало верный относительный адрес нужна статическая релокация, которую gas не указывает, а матерится.
-
Кароче это баг gas`а, я нашёл то место где gas должен такому случаю присвоить релок BFD_RELOC_ARM_LDR_PC_G0, а не генерить ошибку, напишу разрабам...
-
Прикол в том что я не могу в секции где ldr pc ещё что нибудь обьявить, места нету. Иар сгенерил такой вот опкод F4F01FE5 FSWI_PATCH2:A13A5328; =========================================================================== FSWI_PATCH2:A13A5328 FSWI_PATCH2:A13A5328; Segment type: Pure code FSWI_PATCH2:A13A5328 AREA FSWI_PATCH2, CODE, READWRITE, ALIGN=0 FSWI_PATCH2:A13A5328 ; ORG 0xA13A5328 FSWI_PATCH2:A13A5328 CODE32 FSWI_PATCH2:A13A5328 main_jumper DCD swi_handler ; DATA XREF: FSWI_PATCH1:A13A5414r FSWI_PATCH2:A13A5328; FSWI_PATCH2 ends FSWI_PATCH2:A13A5328 FSWI_PATCH1:A13A5414; --------------------------------------------------------------------------- FSWI_PATCH1:A13A5414; =========================================================================== FSWI_PATCH1:A13A5414 FSWI_PATCH1:A13A5414; Segment type: Pure code FSWI_PATCH1:A13A5414 AREA FSWI_PATCH1, CODE, READWRITE, ALIGN=0 FSWI_PATCH1:A13A5414 ; ORG 0xA13A5414 FSWI_PATCH1:A13A5414 CODE32 FSWI_PATCH1:A13A5414 LDR PC, =swi_handler FSWI_PATCH1:A13A5414; FSWI_PATCH1 ends FSWI_PATCH1:A13A5414 Если сделать тупо .section FSWI_PATCH1, "ax", %progbits .int 0xE51FF0F4 То работает, но не вариант, там адреса могут быть разные :(
-
> ldr pc, var иар создаёт 4х байтовый опкод > b myfunc гцц создаёт 4х байтовый опкод
-
Компилируется но не работает. Там у меня патчится свихендлер, и места под первую секцию ровно на одну комманду. b main вроде как раз и занимает 4 байта, но почему-то не работает свихендлер, из за чего аппарат уходит в аут, точнее даже возможно в вечный цикд или гдето повис, хз. ReAl, ldr r0, =var не катит, она какого-то фига разворачивается на 8 байт. А именно гцц делает примерно так: ldr r0, =var offset: dcd var чет типа такого.
-
Пробовал - не работает. Если это чтото меняет, на всякий случай скажу, что myfunction - свихендлер
-
.section section1, "ax", %progbits .arm ldr pc, var .section section2, "ax", %progbits var: .int myfunction Error: internal_relocation (type: OFFSET_IMM) not fixed up Собственно чяднт, и как это умудряется делать иар?
-
Во, спасибо, помогло :)
-
кароче поставил оптимизацию на 0 и все... А вот при сборке на g++ неиспользованные переменные улетели. Решил проблему сборкой одного файла на С и extern "С" .
-
я без скрипта собираю. Якобы дефолтный. По -verbose выводит какой-то скрипт, который заставляет падать лоадер... Загрузчик заточен под сборку без скрипта. Можно без него как-то обойтись?
-
Здраствуйте. В процессе познания мира натыкнулся на необходимость запихнуть все данные "как есть" в отдельную секцию, получить стартовый аддрес этой секции и размер. В общем с секциями я хотел решить проблему так volatile int __section_begin; // Сдесь будут находится переменные, которые нужно собрать без оптимизации //Например volatile const int test = 12; volatile SomeStruct data = {2, 3, 4}; volatile int __section_end; Код собирается, и даже размер секции правильно расчитывает, только фишка в том что нада вычитать не __section_end - __section_begin, а наоборот о_О. С нулевой оптимизацией все нормально, только хотелось бы решить эту проблему внутри файла, без задавания параметров компилятору. Пробовал прагмой задать оптимизацию, в варнинге увидел что она игнорирована, та же ситуация и с аттрибутом. Что посоветуете? gcc 4.6.0
-
float point libs
vova7890 ответил vova7890 тема в GNU/OpenSource средства разработки
Ага, ну научите меня своим неумением :smile3046: -
float point libs
vova7890 ответил vova7890 тема в GNU/OpenSource средства разработки
нашел какую то старую либгсс, попробовал прилинковать - собралось. Но функция vsprintf(исходник нашел в гугле работоспособность проверена) не смогла побороть float и double. На флоате все зависло а дубль не правильно преобразовало :( 1. Как собрать гсс вместе с libgcc.a? 2. Как можно проверить работоспособность этих либ?