首页 > 解决方案 > 编译一个函数以在其他机器上运行它而不解决地址依赖关系

问题描述

我正在为 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 (用于 ARM 架构的 GCC 工具链)自动执行此操作,其工作方式类似于 GCC,并避免在有效负载源中对系统功能进行编码。

谢谢!

标签: cgccraspberry-piarm

解决方案


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

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

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


推荐阅读