c - 编译一个函数以在其他机器上运行它而不解决地址依赖关系
问题描述
我正在为 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,并避免在有效负载源中对系统功能进行编码。
谢谢!
解决方案
我使用硬编码有效载荷中的内核函数来解决它:
void (* uart_puts)(char *) = (void(*)(char * )) 0x0000000000008248;
我从内核编译时生成的.map文件中得到0x0000000000008248地址。
推荐阅读
- arduino - 我的框图出现问题:Init.vi 出现错误 5002
- neo4j - Neo4j 密码查询因未知语法错误而失败
- pip - Linux 上的 Lektor 安装失败
- python - 模板标签返回无
- .net - Azure Blob 存储 - 使用文件流/内存流显示 PDF
- android - 未找到 api < 21 的 android Api 密钥
- twitter-bootstrap - 如何做响应式 5 列(网格)。[引导]
- php - AJAX 发送 GET 而不是 POST
- javascript - 如何在javascript中应用Css转换延迟属性在一定时间后更改图像
- javascript - 基于refs的动画在componentDidUpdate中调用setState