C 编译一个函数以在其他计算机上运行,而不解析地址依赖关系
我正在为raspberry pi 1开发一个裸机操作系统。该操作系统的主要思想是一个简单的内核,可以运行在其他机器上创建的函数,并将其发送给raspi。该函数将使用与内核一起编译并驻留在内存中的函数 我想知道如何编译一个函数,当我将有效负载插入内存中一个确定的地址时,它将能够调用系统函数并使用函数代码中定义的数据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文
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地址。通常使用软件中断来调用内核函数。