Скомпилируйте функцию, чтобы запустить ее на другом компьютере без разрешения адресных зависимостей. - PullRequest
0 голосов
/ 17 октября 2018

Я занимаюсь разработкой операционной системы с открытым исходным кодом для raspberry pi 1. Основная идея этой ОС - просто ядро, которое сможет запускать функцию, созданную на другом компьютере, и отправлять ее в raspi.Функция будет использовать функции, скомпилированные с ядром и находящиеся в памяти.

Я хочу знать, как я могу скомпилировать функцию, которая, когда я вставлю полезную нагрузку в память по определенному адресу, сможетдля вызова системных функций и использования данных, определенных в коде функции.

void function()
{

    while (1)
    {
        uart_puts("Hello\r\n");
    }
}

Это мой файл link.ld, и функция будет загружена в __binary_function:

ENTRY(_start)
SECTIONS
{
    /* Starts at LOADER_ADDR. */
    . = 0x8000;
    __start = .;
    __text_start = .;
    .text :
    {
        KEEP(*(.text.boot))
        *(.text)
    }
    . = ALIGN(4096); /* align to page size */
    __text_end = .;
    __rodata_start = .;
    .rodata :
    {
        *(.rodata)
    }
    . = ALIGN(4096); /* align to page size */
    __rodata_end = .;
    __data_start = .;
    .data :
    {
        *(.data)
    }
    . = ALIGN(4096); /* align to page size */
    __data_end = .;
    __bss_start = .;
    .bss :
    {
        bss = .;
        *(.bss)
    }
    . = ALIGN(4096); /* align to page size */
    __bss_end = .;
    /*Allocating memory for the heap*/
    __heap_start = .;
    . = . + 0x1000000;  /*4MB Heap section*/
    __heap_end = .;
    __binary_function = .;
    __end = .;
}

Моя идея состоит в том, что ядро ​​получит полезную нагрузку через UART и затем выполнит ее.Полезная нагрузка должна иметь возможность вызывать системные функции, такие как функции UART, и получать доступ к данным, которые определены внутри нее.

Я хочу сделать это автоматически с помощью arm-none-eabi-gcc (GCC Toolchain для ARMархитектура), которая работает как GCC и избегает хардкодирования системных функций в источнике полезной нагрузки.

Спасибо!

1 Ответ

0 голосов
/ 18 октября 2018

Я решаю это с помощью жесткого кодирования функций ядра в полезной нагрузке:

void (* uart_puts)(char *) = (void(*)(char * )) 0x0000000000008248;

Я получаю адрес 0x0000000000008248 из файла .map, сгенерированного при компиляции ядра.

...