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

vova7890

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

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

  • Посещение

Весь контент vova7890


  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. Как можно проверить работоспособность этих либ?
  15. Собирая констркции конвертации double в float и наоборот гсс попросил много функций для работы с такими операциями. Почти все функции я нашел гугле, но остались 2 функции которых нигде нету, в libgcc.a их нет. Где их взять? __aeabi_dcmplt __aeabi_dcmpeq зы. gcc 4.5.2 самозборный собирал так ./configure --target=arm-eabi --prefix=/usr --enable-interwork --enable-languages="c,c++" --with-float=soft --with-libgcc
  16. все, собрал свой гсс с таргетом arm-eabi все заработало. Всем спасибо!!!!
  17. а вы товарисч предлагает использовать arm-none-eabi-gcc-4.5.2.elf?(линукс) И че как бы гсс не по стандартам еаби собирает? Де скачать на линукс? скачал первое что нашел гсс старый arm-unknown-linux-gnueabi-gcc-4.1.1 скомпилял и уррррраааа!!!! Почти :-D Получил на выходе 55.20001, че 1 в конце? :-D дайте ссылку пожалуйста, не могу найти ( Нашел arm-none-eabi последней версии, начал компилять, он ругнулся на конструкцию с asm("swi NUMBER"); В чем фишка? static inline long do_SWI0(const int swi_num ) { long ret_val; asm volatile ( "swi %1 \n\t" \ "mov %0, r0 \n\t" \ : "=r" (ret_val) : "n" (swi_num) : "r0", "r1", "r2", "r3", "ip", "lr", "memory", "cc" ); return ret_val; } include/swiadd.h: In function 'do_SWI0': include/swiadd.h:35:2: warning: asm operand 1 probably doesn't match constraints include/swiadd.h:35:2: error: impossible constraint in 'asm'
  18. нет, гсс`ые инклуды я поудалял и не использую, у меня все функции в прошивке которые я вызываю по адресу. Так что у меня свои инклуды. От гсс я требую только компиляции, больше ничего
  19. гсс разжовывать безтолку, он такой же самый сгенерил код. Оптимизатор то работает :) Реализация спринтфа самая какая ни есть стандартная. Я ж говорю гсс не правильно передал параметры в функцию, поэтому такая лабуда... :crying:
  20. И шож там такого безграмотного? Если вы невнимательно читали, то я тут при чем? Видимо никто не читал первый пост, я ж написал GCC 4.5.2! компиляю так: arm-elf-gcc -c -msoft-float -mlittle-endian -mcpu=arm926ej-s -Os -I include -nostdlib -fwide-exec-charset=cp1251 main.c ну и там линкер ещё.. ага, я догадывался приводил уже, первый пост - невидимка. char s[56]={0}; sprintf(s, "%f", 55.2);
  21. Забыл сказать, функция sprintf является прошивочной и от компилятора не зависит да и не только спринф, многие функции работаеют не так, ибо число другое получается в буфере(gcc): 2D302E303030303030 (-0.000000) в буфере(iar): 35352E323030303030 (55.20000)
  22. Пишу на гсс 4.5.2.Кароче заметил что спринтф не правильно схавал флоат, я отдизасмил и сравнил с дизасмом иара char s[56]={0}; sprintf(s, "%f", 55.2); дизасм гсс: MOV R0, SP LDR R1, =unk_4A6 LDR R2, =0x404B9999 LDR R3, =0x9999999A дизасм иара: LDR R3, =0x404B9999 LDR R2, =0x9999999A MOV R0, SP ADR R1, dword_58 как видно регистры R2 R3 перепутаны. LDR R2, =0x404B9999 LDR R3, =0x9999999A LDR R3, =0x404B9999 LDR R2, =0x9999999A Че делать?
  23. Я пробовал уже наверно все что можно, спасибо конечно всем кто помогает, но ничего не выходит... :(
  24. .text:00000560 EXPORT start .text:00000560 start .text:00000560 .text:00000560 var_10 = -0x10 .text:00000560 .text:00000560 STMFD SP!, {R4,R5,LR} .text:00000564 MOV R5, #0x80; 'А' .text:00000568 SUB SP, SP, #4 .text:0000056C MOV R0, R5 .text:00000570 SWI 0x14 .text:00000574 MOV R4, R0 .text:00000578 MOV R0, R4 .text:0000057C MOV R1, R5 .text:00000580 SWI 0x11D .text:00000584 STR R4, [SP,#0x10+var_10] .text:00000588 SWI 0x16 .text:0000058C MOV R5, R0 .text:00000590 MOV R5, #1 .text:00000594 MOV R0, R5 .text:00000598 MOV R1, R4 .text:0000059C SWI 0x148 .text:000005A0 MOV R5, R0 .text:000005A4 MOV R0, R4 .text:000005A8 SWI 0x15 .text:000005AC BL sub_50C .text:000005B0 MOV R0, #0 .text:000005B4 ADD SP, SP, #4 .text:000005B8 LDMFD SP!, {R4,R5,PC} static inline int sprintfa(char *dst, char *mft, ...) { int ret_val; static int const swi_num = 22; asm volatile ( "swi %1 \n\t" \ "mov %0, r0 \n\t" \ : "=r" (ret_val) : "n" (swi_num), "m" (dst) // ругалось на "memory" что нету "memory"(аргумент) : "r0", "r1", "r2", "r3", "ip", "lr", "memory", "cc" ); return ret_val; }
×
×
  • Создать...