Отговори на тема  [ 13 мнения ] 
API Kernel <- -> Application 
Автор Съобщение
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 27, 2005 12:48 pm
Мнения: 6094
Мнение 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 ядро, което е почи готово - трябва ми мрежовите фунции и екстрите

_________________
main[-1u]={1};


Вто Юли 24, 2018 2:25 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Вто Юли 31, 2007 2:55 pm
Мнения: 1792
Местоположение: София
Мнение Re: API Kernel <- -> Application
Можеш да оставиш прототипите "extern", а адресите да ги закачиш през линкер скрипт или асемблерски файл, като последните и двете машинно генерирани.


Вто Юли 24, 2018 5:13 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 27, 2005 12:48 pm
Мнения: 6094
Мнение Re: API Kernel <- -> Application
и така го правих, ама май го омазах... и реших да бутна API-то в static library
оригиналното апи - има една информационна структура в първата ROM секция по която се ориентира кърнела за апликацията и нейната entry point
a функциите се викат с hash стринг на функцията, кърнела връща адреса (за секюрити уж, да не се вижда адреса)... стил Mediatek
Qualcomm са с Dispatcher функция ID... ма не мисля да го усложнявам и поне малко да "скрия" адресите

_________________
main[-1u]={1};


Сря Юли 25, 2018 8:45 am
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 27, 2005 12:48 pm
Мнения: 6094
Мнение 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

_________________
main[-1u]={1};


Сря Юли 25, 2018 9:14 am
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Вто Юли 31, 2007 2:55 pm
Мнения: 1792
Местоположение: София
Мнение Re: API Kernel <- -> Application
Можеш да се опиташ да спестиш указателите и дереференцията като ги направиш абсолютни символи, т.е. прототипът да е:
Код:
extern void foo_1(void);


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

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


Сря Юли 25, 2018 10:40 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 27, 2005 12:48 pm
Мнения: 6094
Мнение Re: API Kernel <- -> Application
GCC да
IDA ползвам за деасем...
генерирам сорса със скрипт - автоматично търся функциите във firmware-то и форматирам "сорса"
10% не ги намирам но на ръка ги оправям ако ми трябват

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

_________________
main[-1u]={1};


Сря Юли 25, 2018 11:02 am
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Вто Юли 31, 2007 2:55 pm
Мнения: 1792
Местоположение: София
Мнение Re: API Kernel <- -> Application
Странно че IDA са решили да ползват ADS синтаксис. Ама исторически може и да не е толкова странно.

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

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


Сря Юли 25, 2018 12:19 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Окт 11, 2011 11:53 pm
Мнения: 4582
Местоположение: Brussels / Пловдив
Мнение Re: API Kernel <- -> Application
woody написа:
Странно че IDA са решили да ползват ADS синтаксис. Ама исторически може и да не е толкова странно.

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

_________________
Мразя да мразя ...


Сря Юли 25, 2018 5:18 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 27, 2005 12:48 pm
Мнения: 6094
Мнение 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 ядро като апликация

_________________
main[-1u]={1};


Сря Юли 25, 2018 10:58 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 27, 2005 12:48 pm
Мнения: 6094
Мнение Re: API Kernel <- -> Application
с ASM ще го правя и ще разкарам ненужните процедури
очертава се да стане мноо яко :) поне така си мисля за сега


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

_________________
main[-1u]={1};
Чет Юли 26, 2018 9:55 am
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Вто Юли 31, 2007 2:55 pm
Мнения: 1792
Местоположение: София
Мнение Re: API Kernel <- -> Application
Успехи. :)


Чет Юли 26, 2018 10:18 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 27, 2005 12:48 pm
Мнения: 6094
Мнение Re: API Kernel <- -> Application
метнах го в static lib и се компилна така :)

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

_________________
main[-1u]={1};


Чет Юли 26, 2018 1:02 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Вто Юли 31, 2007 2:55 pm
Мнения: 1792
Местоположение: София
Мнение Re: API Kernel <- -> Application
Мда, самата константа е в literal pool.


Чет Юли 26, 2018 3:24 pm
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 13 мнения ] 

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 5 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни