C 编译一个函数以在其他计算机上运行,而不解析地址依赖关系

C 编译一个函数以在其他计算机上运行,而不解析地址依赖关系,c,gcc,raspberry-pi,arm,C,Gcc,Raspberry Pi,Arm,我正在为raspberry pi 1开发一个裸机操作系统。该操作系统的主要思想是一个简单的内核,可以运行在其他机器上创建的函数,并将其发送给raspi。该函数将使用与内核一起编译并驻留在内存中的函数 我想知道如何编译一个函数,当我将有效负载插入内存中一个确定的地址时,它将能够调用系统函数并使用函数代码中定义的数据 void function() { while (1) { uart_puts("Hello\r\n"); } } 这是我的link.ld文

我正在为raspberry pi 1开发一个裸机操作系统。该操作系统的主要思想是一个简单的内核,可以运行在其他机器上创建的函数,并将其发送给raspi。该函数将使用与内核一起编译并驻留在内存中的函数

我想知道如何编译一个函数,当我将有效负载插入内存中一个确定的地址时,它将能够调用系统函数并使用函数代码中定义的数据

void function()
{

    while (1)
    {
        uart_puts("Hello\r\n");
    }
}
这是我的link.ld文件,该函数将在_binary_函数处加载:

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(用于arm架构的gcc工具链)自动完成这项工作,该工具链与gcc类似,并避免在有效负载源中对系统功能进行harcoding


谢谢

我使用对有效负载中的内核函数进行硬编码来解决它:

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

我从编译内核时生成的.map文件中获取0x0000000000008248地址。

通常使用软件中断来调用内核函数。