Перейти к содержанию
    

vova7890

Участник
  • Постов

    42
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный

Информация о vova7890

  • Звание
    Участник
    Участник
  • День рождения 03.12.1992

Контакты

  • ICQ
    Array
  1. Отвечу сам себе - нужно использовать сопроцессор-mmu и смотреть в сторону FSR регистра, чтобы получить от mmu тип исключения и адрес.
  2. Реализация mmap на ARMv5

    Всем привет. В общем, озадачился я реализацией сией фукнции на ARMv5. Функция, помимо зеркалирования памяти(ну тут понятно, можно через mmu), должна уметь зеракалировать файлы. Идея в реализации одна - обрабатывать датааборты на чтение виртуально "не существующей" памяти и там уже читать файл, предварительно вернувшись в usr режим и продолжая выполнять чтение уже в контексте программы. Но, чтобы определить, что, как, куда и откуда читает, нужно узнать тип инструкции и адрес чтения/ записи. Вот этот момент меня и интересует. Получается, нужно какбы "эмулировать" инструкцию, тоесть узнать какой тип данных она пишет/читает(byte, hword, word) и номера регистров с которых читают и куда пишут. Я правильно понимаю логику, или есть более простые пути нежели емулировать инструкции? Пытался найти ответ в исходниках линукса, ничего интересного так и не нашёл. Если тут и вправду нужна эмуляция, подскажите где можно посмотреть реализцию. А то в этих опкодах чёрт ногу сломит...
  3. ну правильно, а шоб оно создало верный относительный адрес нужна статическая релокация, которую gas не указывает, а матерится.
  4. Кароче это баг gas`а, я нашёл то место где gas должен такому случаю присвоить релок BFD_RELOC_ARM_LDR_PC_G0, а не генерить ошибку, напишу разрабам...
  5. Прикол в том что я не могу в секции где 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 То работает, но не вариант, там адреса могут быть разные :(
  6. > ldr pc, var иар создаёт 4х байтовый опкод > b myfunc гцц создаёт 4х байтовый опкод
  7. Компилируется но не работает. Там у меня патчится свихендлер, и места под первую секцию ровно на одну комманду. b main вроде как раз и занимает 4 байта, но почему-то не работает свихендлер, из за чего аппарат уходит в аут, точнее даже возможно в вечный цикд или гдето повис, хз. ReAl, ldr r0, =var не катит, она какого-то фига разворачивается на 8 байт. А именно гцц делает примерно так: ldr r0, =var offset: dcd var чет типа такого.
  8. Пробовал - не работает. Если это чтото меняет, на всякий случай скажу, что myfunction - свихендлер
  9. .section section1, "ax", %progbits .arm ldr pc, var .section section2, "ax", %progbits var: .int myfunction Error: internal_relocation (type: OFFSET_IMM) not fixed up Собственно чяднт, и как это умудряется делать иар?
  10. кароче поставил оптимизацию на 0 и все... А вот при сборке на g++ неиспользованные переменные улетели. Решил проблему сборкой одного файла на С и extern "С" .
  11. я без скрипта собираю. Якобы дефолтный. По -verbose выводит какой-то скрипт, который заставляет падать лоадер... Загрузчик заточен под сборку без скрипта. Можно без него как-то обойтись?
  12. Здраствуйте. В процессе познания мира натыкнулся на необходимость запихнуть все данные "как есть" в отдельную секцию, получить стартовый аддрес этой секции и размер. В общем с секциями я хотел решить проблему так 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
  13. Ага, ну научите меня своим неумением :smile3046:
  14. нашел какую то старую либгсс, попробовал прилинковать - собралось. Но функция vsprintf(исходник нашел в гугле работоспособность проверена) не смогла побороть float и double. На флоате все зависло а дубль не правильно преобразовало :( 1. Как собрать гсс вместе с libgcc.a? 2. Как можно проверить работоспособность этих либ?
×
×
  • Создать...