gpt4 book ai didi

linker - 将嵌入式程序拆分为内存中的多个部分

转载 作者:行者123 更新时间:2023-12-04 19:04:05 27 4
gpt4 key购买 nike

我正在开发一个嵌入式系统(Stellaris Launchpad)并编写一个简单的操作系统(作为一个爱好项目)。使用的工具链是 gcc-none-eabi。

我的下一步是习惯 MPU 以允许内核阻止用户程序更改特定数据。我有一堆 C 文件,我把它们分成两部分:内核和其他。
我有以下链接器脚本可以开始:

MEMORY
{
FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00040000
SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00008000
}

SECTIONS
{
.text :
{
_text = .;
KEEP(*(.isr_vector))
*(.text*)
*(.rodata*)
_etext = .;
} > FLASH

.data : /*AT(ADDR(.text) + SIZEOF(.text))*/ /*contains initialized data*/
{
_data = .;
*(vtable)
*(.data*)
_edata = .;
} > SRAM AT > FLASH

.bss : AT (ADDR(.data) + SIZEOF(.data)) /*contains unitialized data (should be set to all zero's)*/
{
_bss = .;
*(.bss*)
*(COMMON)
_ebss = .;
_start_heap = .;
} > SRAM

_stack_top = ORIGIN(SRAM) + LENGTH(SRAM) - 1; /*The starting point of the stack, at the very bottom of the RAM*/

}

在阅读了链接器脚本之后,我知道我可以用文件名替换星号,从而开始将闪存分成多个部分。例如,我会创建一个 .kernel.bss 部分并将所有内核对象文件而不是星号放在该部分中。
我剩下的唯一问题是内核不是一个文件,而是一大堆文件。并且可能会添加、删除文件等。那么我该怎么做呢?如何更改我的链接描述文件,以便将动态的第一组文件映射到第一位,并将动态的第二组文件映射到第二位?

最佳答案

您知道可以指定将哪些文件用作某个部分的输入吗?
我们使用它来将内核和应用程序代码分成快速的内部闪存和较慢的外部闪存,如下所示:

.kernel_text :
{
build/kernel/*.o (.text*) /*text section from files in build/kernel*/
} > INT_FLASH

.app_text:
{
build/app/*.o(.text*)
} > EXT_FLASH

第 4.6.4 节可能会有所帮助,(更详细地描述输入部分)
https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/4/html/Using_ld_the_GNU_Linker/sections.html

关于linker - 将嵌入式程序拆分为内存中的多个部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29437877/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com