Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

API Kernel <- -> Application
http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=16048
Страница 1 от 1

Автор:  TheWizard [ Вто Юли 24, 2018 2:25 pm ]
Заглавие:  API Kernel <- -> Application

случая е малко хакерски...
имам комуникационен модул (LTE NB/CAT) с работещо API за user applications, обаче е много бедно на функции (писано-недописано)
реверснах кърнела и му изкарах над 3000 функции (име, адрес, С структури...) от които реално ~200 ми трябват (HAL, OS, SSL, мрежа и разни екстри)
тръгнах да пиша разширено API и вече се чудя кой път да поема...

спрял съм се на това, което е зависимо от компилацията на кърнела:
Код:
енумерация на адресите
typedef enum {
    __function = 0x12345678,
    __foo        = 0x87654321,
    ... още 200 такива
}
void (*function)(int) = (void (*)(int)) __function;

може и така, а и има нищожна възможност джикитайците да ми напълнят структурата с адресите при инициализация
Код:
struct {
   void (*function)(int);
   void (*foo)(void);
...още
} os = {
   (void (*)(int))0x12345678,  // ADDRESS OF function()
   (void (*)(void))0x87654321, // ADDRESS OF foo()
... още
};
#define FUNCTION(N) os.function(N)

void test(void) {
   function(1);
   os.function(2);
   FUNCTION(3);
   os.foo();
}

идеята е да интегрирам новите неща в Arduino ядро, което е почи готово - трябва ми мрежовите фунции и екстрите

Автор:  woody [ Вто Юли 24, 2018 5:13 pm ]
Заглавие:  Re: API Kernel <- -> Application

Можеш да оставиш прототипите "extern", а адресите да ги закачиш през линкер скрипт или асемблерски файл, като последните и двете машинно генерирани.

Автор:  TheWizard [ Сря Юли 25, 2018 8:45 am ]
Заглавие:  Re: API Kernel <- -> Application

и така го правих, ама май го омазах... и реших да бутна API-то в static library
оригиналното апи - има една информационна структура в първата ROM секция по която се ориентира кърнела за апликацията и нейната entry point
a функциите се викат с hash стринг на функцията, кърнела връща адреса (за секюрити уж, да не се вижда адреса)... стил Mediatek
Qualcomm са с Dispatcher функция ID... ма не мисля да го усложнявам и поне малко да "скрия" адресите

Автор:  TheWizard [ Сря Юли 25, 2018 9:14 am ]
Заглавие:  Re: API Kernel <- -> Application

с АСМ файл май изглежда по-добре:

Код:
.global api_magic
.global foo_1
.global foo_2
.global foo_3

.data
.align 4
   api_magic:    .word 0xCAFE0001
   foo_1:       .word 0x22222222
   foo_2:       .word 0x44444444
   foo_3:       .word 0x66666666

............................................................

extern void (*foo_1)(void);
extern int  (*foo_2)(int);
extern int  (*foo_3)(int, int);

void test(void) {
   foo_1();
   foo_2(7);
   foo_3(8, 9);

text:082926F6                 LDR     R3, =foo_1
text:082926F8                 LDR     R3, [R3]
text:082926FA                 BLX     R3
text:082926FC                 LDR     R3, =foo_2
text:082926FE                 MOVS    R0, #7
text:08292700                 LDR     R3, [R3]
text:08292702                 BLX     R3
text:08292704                 LDR     R3, =foo_3
text:08292706                 MOVS    R1, #9
text:08292708                 LDR     R3, [R3]
text:0829270A                 MOVS    R0, #8
text:0829270C                 BLX     R3

.......................................................................

.data:001E7060                 EXPORT api_magic
.data:001E7060 api_magic       DCD 0xCAFE0001
.data:001E7064                 EXPORT foo_1
.data:001E7064 foo_1           DCD 0x22222222                                               
.data:001E7068                 EXPORT foo_2
.data:001E7068 foo_2           DCD 0x44444444                                                 
.data:001E706C                 EXPORT foo_3
.data:001E706C foo_3           DCD 0x66666666

Автор:  woody [ Сря Юли 25, 2018 10:40 am ]
Заглавие:  Re: API Kernel <- -> Application

Можеш да се опиташ да спестиш указателите и дереференцията като ги направиш абсолютни символи, т.е. прототипът да е:
Код:
extern void foo_1(void);


Естествено, ако може всичкото това да се генерира от програма/скрипт.

Билдваш с GCC и после дизасемблираш с ADS/Keil?

Автор:  TheWizard [ Сря Юли 25, 2018 11:02 am ]
Заглавие:  Re: API Kernel <- -> Application

GCC да
IDA ползвам за деасем...
генерирам сорса със скрипт - автоматично търся функциите във firmware-то и форматирам "сорса"
10% не ги намирам но на ръка ги оправям ако ми трябват

Бях ги форматирал като пойнтери void* ама не ми хареса дезасемблера или ида-та се лъжеше

Автор:  woody [ Сря Юли 25, 2018 12:19 pm ]
Заглавие:  Re: API Kernel <- -> Application

Странно че IDA са решили да ползват ADS синтаксис. Ама исторически може и да не е толкова странно.

Ако успееш да го направиш да не е през указатели, а с директно викане на функция (през абсолютни символи), може евентуално трите инструкции
Код:
  LDR     R3, =foo
  LDR     R3, [R3]
  BLX     R3

да се сведат до една B/BL/BLX ако e наблизо на +/-32MB или до LDR/BLX за по-далечни.

Автор:  palavrov [ Сря Юли 25, 2018 5:18 pm ]
Заглавие:  Re: API Kernel <- -> Application

woody написа:
Странно че IDA са решили да ползват ADS синтаксис. Ама исторически може и да не е толкова странно.

Отдавна не съм дизасемблирал с ИДА-та но поне навремето можеше да я конфигурираш за различен формат на дизасемблера - intel, gcc, и т.н. примерно за x86

Автор:  TheWizard [ Сря Юли 25, 2018 10:58 pm ]
Заглавие:  Re: API Kernel <- -> Application

аз GCC "стил" не намерих в опциите на ида-та
открих "топлата вода" - скриптове - така експортнах всички имена на процедури

трите инструкции са ми достатъчни - не гоня скорост, спрямо оригиналното апи е в пъти по-бързо...
модула е комуникационен(NB/CAT), не се гони завидна скорост... по-нататък ще взема един борд за хардуерни проби, лошото е че в БГ няма все още мрежа (NB)
иначе става въпрос за Quectel BC66 - чипсет Mediatek MT2625
апликационен процесор ARM Cortex-M на 104 MHz,
модема е някво неизвестно DSP на кристала,
RAM,FLASH по 4 меги (за усера към 300к апликация)
няма GSM само NB/CAT модем
IO: GPIO, I2C, I2S, PCM, SDIO, UART, USB...
OS: FreeRTOS (директно недостъпен за усера)
NET: LwIP & mbedssl (директно недостъпен)
Clinets: HTTP/S, MQTT, COAP, LWM2M (първите две са RIL достъпни)
достъпа до всичко горе е само по RIL (AT команди).... за сега :)
ако му изкарам разширеното апи си става супер

подкарах го на GCC Linaro last + Eclipse за Windows
мисля че няма да му е проблем да носи едно Arduino ядро като апликация

Автор:  TheWizard [ Чет Юли 26, 2018 9:55 am ]
Заглавие:  Re: API Kernel <- -> Application

с ASM ще го правя и ще разкарам ненужните процедури
очертава се да стане мноо яко :) поне така си мисля за сега

Прикачени файлове:
API_EX.jpg
API_EX.jpg [ 720.76 KiB | Прегледано 5390 пъти ]

Автор:  woody [ Чет Юли 26, 2018 10:18 am ]
Заглавие:  Re: API Kernel <- -> Application

Успехи. :)

Автор:  TheWizard [ Чет Юли 26, 2018 1:02 pm ]
Заглавие:  Re: API Kernel <- -> Application

метнах го в static lib и се компилна така :)

Код:
__vTaskDelay_veneer                     
                 LDR     PC, =vTaskDelay
                 off_82936E8     DCD vTaskDelay

Автор:  woody [ Чет Юли 26, 2018 3:24 pm ]
Заглавие:  Re: API Kernel <- -> Application

Мда, самата константа е в literal pool.

Страница 1 от 1 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/