支持内存属性设置

This commit is contained in:
zhangzheng
2024-04-07 14:05:03 +00:00
parent 352346fa6b
commit a001a26bfe
29 changed files with 364 additions and 89 deletions

View File

@@ -55,7 +55,9 @@
"u_prot.h": "c",
"vma.h": "c",
"thread.h": "c",
"thread_knl.h": "c"
"thread_knl.h": "c",
"shell.h": "c",
"shell_secure_user.h": "c"
},
"cortex-debug.showRTOS": false,
"cortex-debug.variableUseNaturalFormat": false,

View File

@@ -14,7 +14,7 @@
#include <thread_arch.h>
#include <aarch64_ptregs.h>
#include <asm/mm.h>
#include <early_boot.h>
#include <mmu.h>
#define ARCH_WORD_SIZE 64
#define LOG_INTR_NO 37 // USART1_IRQn

View File

@@ -1,18 +0,0 @@
#pragma once
#include <types.h>
#include "pager.h"
#include "asm/mm.h"
#include "asm_config.h"
#include <mm_page.h>
typedef void *(*page_alloc_fn)(void);
pte_t *pages_walk(page_entry_t *pdir, addr_t virt_addr, mword_t size, void *(*fn_alloc)(void));
void mmu_page_alloc_set(page_alloc_fn fn);
int map_mm(page_entry_t *pdir, addr_t virt_addr, addr_t phys_addr,
mword_t page_order, mword_t pfn_cn, mword_t attr);
int unmap_mm(page_entry_t *pdir, addr_t virt_addr, mword_t page_order, mword_t pfn_cn);
void per_cpu_boot_mapping(bool_t init_pages);
page_entry_t *boot_get_pdir(void);
void knl_pdir_init(page_entry_t *pdir, pte_t *dir, int page_deep);

View File

@@ -1,7 +1,7 @@
#include <buddy.h>
#include <asm/mm.h>
#include "mm_page.h"
#include <early_boot.h>
#include <mmu.h>
int page_entry_init(page_entry_t *entry)
{
entry->dir = buddy_alloc(buddy_get_alloter(), PAGE_SIZE);

View File

@@ -12,7 +12,7 @@
#include "util.h"
#include "mm_space.h"
#include "assert.h"
#include <early_boot.h>
#include <mmu.h>
#include <mm_page.h>
static umword_t global_asid = 1;
int mm_space_init(mm_space_t *mm_space, int is_knl)

View File

@@ -10,7 +10,7 @@
#include <spinlock.h>
#include <assert.h>
#include <mm_page.h>
#include <early_boot.h>
#include <mmu.h>
#define DATA_BOOT_SECTION ".data.boot"
#define TEXT_BOOT_SECTION ".text.boot"

View File

@@ -0,0 +1,53 @@
#pragma once
#include <types.h>
#include "pager.h"
#include "asm/mm.h"
#include "asm_config.h"
#include <mm_page.h>
#include <vma.h>
typedef void *(*page_alloc_fn)(void);
static inline umword_t vpage_attrs_to_page_attrs(enum vpage_prot_attrs attrs)
{
umword_t to_attrs = 0;
to_attrs = PTE_SHARED | PTE_TYPE_PAGE | PTE_ATTRINDX(MT_NORMAL) | PTE_AF;
if (attrs & VPAGE_PROT_UNCACHE)
{
/*TODO:设置无缓存属性*/
}
if (!(attrs & VPAGE_PROT_IN_KNL))
{
to_attrs |= PTE_NG;
}
if (attrs & VPAGE_PROT_RO)
{
to_attrs |= PTE_RDONLY;
}
if (attrs & VPAGE_PROT_WO)
{
to_attrs |= PTE_WONLY;
}
if (!(attrs & VPAGE_PROT_X))
{
to_attrs |= PTE_UXN;
}
if (!(attrs & VPAGE_PROT_UNCACHE))
{
to_attrs |= (0x1 << 4) | (0x3 << 2);
}
return to_attrs;
}
pte_t *pages_walk(page_entry_t *pdir, addr_t virt_addr, mword_t size, void *(*fn_alloc)(void));
void mmu_page_alloc_set(page_alloc_fn fn);
int map_mm(page_entry_t *pdir, addr_t virt_addr, addr_t phys_addr,
mword_t page_order, mword_t pfn_cn, mword_t attr);
int unmap_mm(page_entry_t *pdir, addr_t virt_addr, mword_t page_order, mword_t pfn_cn);
void per_cpu_boot_mapping(bool_t init_pages);
page_entry_t *boot_get_pdir(void);
void knl_pdir_init(page_entry_t *pdir, pte_t *dir, int page_deep);

View File

@@ -68,8 +68,9 @@ typedef struct pte
#define PTE_TYPE_FAULT (0UL << 0)
#define PTE_TYPE_PAGE (3UL << 0)
#define PTE_TABLE_BIT (1UL << 1)
#define PTE_USER (1UL << 6) /* AP[1] */
#define PTE_RDONLY (1UL << 7) /* AP[2] */
#define PTE_RDONLY (1UL << 6) /* AP[2] */
#define PTE_WONLY (2UL << 6)
#define PTE_RW (3UL<<6)
#define PTE_SHARED (3UL << 8) /* SH[1:0], inner shareable */
#define PTE_AF (1UL << 10) /* Access Flag */
#define PTE_NG (1UL << 11) /* nG */

View File

@@ -1,7 +1,7 @@
// #include <config.h>
#include <early_boot.h>
#include <mmu.h>
#include <config.h>
#include <util.h>
#include <arch.h>

View File

@@ -17,7 +17,7 @@
#include "arch.h"
#include "string.h"
#include <asm/system.h>
#include <early_boot.h>
#include <mmu.h>
#include <task.h>
extern void ret_form_run(void);
syscall_entry_func syscall_handler_get(void)

View File

@@ -5,7 +5,7 @@
#include <assert.h>
#include <util.h>
#if IS_ENABLED(CONFIG_MMU)
#include <early_boot.h>
#include <arch.h>
#include <vma.h>
#endif
#if !IS_ENABLED(CONFIG_MMU)

View File

@@ -4,6 +4,18 @@
#include <arch.h>
#include <rbtree_mm.h>
enum vpage_prot_attrs
{
VPAGE_PROT_RO = 1, //!< 只读
VPAGE_PROT_WO = 0x2,
VPAGE_PROT_RW = VPAGE_PROT_RO | VPAGE_PROT_WO, //!< 读写
VPAGE_PROT_X = 0x4,
VPAGE_PROT_RWX = (VPAGE_PROT_RO | VPAGE_PROT_RW | VPAGE_PROT_X), //!< 读写执行
VPAGE_PROT_UNCACHE = 0x10, //!< 不使用缓存
VPAGE_PROT_IN_KNL = 0x20, //!< 内核中使用
};
#define VMA_ADDR_RESV 0x1 //!< 保留内存
#define VMA_ADDR_UNCACHE 0x2 //!< uncache内存
@@ -14,9 +26,9 @@ typedef union vma_addr
umword_t raw;
struct
{
umword_t prot : 4;
umword_t prot : 6;
umword_t flags : 4;
umword_t resv : 4;
umword_t resv : 2;
umword_t addr : (sizeof(void *) * 8 - PAGE_SHIFT);
};
} vma_addr_t;

View File

@@ -151,8 +151,6 @@ int elf_load(task_t *task, umword_t elf_data, size_t size, addr_t *entry_addr)
}
}
assert(task_vma_alloc(&task->mm_space.mem_vma,
vma_addr_create(0xf /*TODO:*/, VMA_ADDR_RESV, st_addr),
vma_addr_create(VPAGE_PROT_RWX, VMA_ADDR_RESV, st_addr),
mem_size, (paddr_t)mem, 0) >= 0);
// map_mm(mm_space_get_pdir(&task->mm_space), st_addr,
// (addr_t)mem, PAGE_SHIFT, mem_size / PAGE_SIZE, 0x7ff);
}

View File

@@ -526,7 +526,8 @@ static int rbtree_iterate_alloc_tree_del(mln_rbtree_node_t *node, void *udata)
vma_addr_get_addr(node_data->vaddr) + node_data->size <= param->addr + param->size)
{
// 解除映射
unmap_mm(mm_space_get_pdir(param->mm_space), vma_addr_get_addr(node_data->vaddr), PAGE_SHIFT, 1);
unmap_mm(mm_space_get_pdir(param->mm_space),
vma_addr_get_addr(node_data->vaddr), PAGE_SHIFT, 1);
// 从红黑树中删除
mln_rbtree_delete(param->r_tree, node);
@@ -700,7 +701,8 @@ int task_vma_page_fault(task_vma_t *task_vma, vaddr_t addr)
}
// 4.进行映射
ret = map_mm(mm_space_get_pdir(&task->mm_space), addr,
(addr_t)mem, PAGE_SHIFT, 1, 0x7ff); /*TODO:设置权限*/
(addr_t)mem, PAGE_SHIFT, 1,
vpage_attrs_to_page_attrs(vma_addr_get_prot(node_data->vaddr))); /*TODO:设置权限*/
if (ret < 0)
{
ret = -ENOMEM;

View File

@@ -55,7 +55,8 @@ static void vma_obj_syscall(kobject_t *kobj, syscall_prot_t sys_p, msg_tag_t in_
int ret;
vaddr_t ret_vaddr = 0;
ret = task_vma_alloc(&tk->mm_space.mem_vma, vam_addr_create_raw(f->regs[0]), f->regs[1],
ret = task_vma_alloc(&tk->mm_space.mem_vma,
vam_addr_create_raw(f->regs[0]), f->regs[1],
f->regs[2], &ret_vaddr);
f->regs[0] = msg_tag_init4(0, 0, 0, ret).raw;
f->regs[1] = ret_vaddr;

View File

@@ -22,7 +22,7 @@
#include "access.h"
#include "printk.h"
#if IS_ENABLED(CONFIG_MMU)
#include "early_boot.h"
#include "arch.h"
#endif
/**
* @brief 任务的操作码

View File

@@ -141,10 +141,8 @@ static void knl_init_2(void)
void *init_msg_buf = mm_buddy_alloc_one_page();
assert(init_msg_buf);
assert(task_vma_alloc(&init_task->mm_space.mem_vma,
vma_addr_create(0xf /*TODO:*/, VMA_ADDR_RESV, 0xE0000000),
vma_addr_create(VPAGE_PROT_RW, VMA_ADDR_RESV, 0xE0000000),
PAGE_SIZE, (paddr_t)init_msg_buf, 0) >= 0);
// map_mm(mm_space_get_pdir(&init_task->mm_space), 0xE0000000,
// (addr_t)init_msg_buf, PAGE_SHIFT, 1, 0x7ff);
thread_set_msg_bug(init_thread, (void *)init_msg_buf, (void *)0xE0000000);
thread_user_pf_set(init_thread, (void *)(entry), (void *)0xdeaddead,
NULL, 0);

View File

@@ -2,6 +2,9 @@
export TOOLCHAIN=/home/zhangzheng/gcc-arm-10.3-2021.07-aarch64-aarch64-none-elf/bin/
export TOOLCHAIN_LIB=/home/zhangzheng/gcc-arm-10.3-2021.07-aarch64-aarch64-none-elf/lib/gcc/aarch64-none-elf/10.3.1
# export TOOLCHAIN=/home/mkrtos-smart/toolchains/gcc-arm-10.3-2021.07-x86_64-aarch64-none-elf/bin/
# export TOOLCHAIN_LIB=/home/mkrtos-smart/toolchains/gcc-arm-10.3-2021.07-x86_64-aarch64-none-elf/lib/gcc/aarch64-none-elf/10.3.1
export BOARD=aarch64_qemu
export CROSS_COMPILE_NAME=aarch64-none-elf-

View File

@@ -9,7 +9,6 @@ if (${ARCH_NAME} STREQUAL "armv7_8m")
add_subdirectory(mr)
add_subdirectory(lwip)
add_subdirectory(printf)
add_subdirectory(letter-shell/demo/mkrtos)
# add_subdirectory(at_device)
elseif(${CONFIG_ARCH} STREQUAL "aarch64")
add_subdirectory(mkrtos-musl)
@@ -20,3 +19,5 @@ add_subdirectory(util)
add_subdirectory(sys_svr)
add_subdirectory(libc_backend)
add_subdirectory(cpio)
add_subdirectory(letter-shell/demo/mkrtos)

View File

@@ -2,11 +2,7 @@ cmake_minimum_required(VERSION 3.13)
project(LetterShell VERSION 0.1.0)
add_definitions(-DSHELL_CFG_USER="shell_cfg_user.h")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -w \
-fPIC -n -pie -fpie -fpic -msingle-pic-base -mno-pic-data-is-text-relative \
-D__dietlibc__ -D__arm__ -D__WORDSIZE=32 -D__ARM_ARCH_7M__ \
" )
set(CMAKE_ASM_FLAGS ${CMAKE_C_FLAGS})
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -w" )
add_library(LetterShell
# main.c
shell_port.c
@@ -39,19 +35,12 @@ target_include_directories(LetterShell PUBLIC
# ../../extensions/telnet
${CMAKE_SOURCE_DIR}/mkrtos_user/lib/sys/inc
${CMAKE_SOURCE_DIR}/mkrtos_user/lib/sys/inc/${ARCH_NAME}
${CMAKE_SOURCE_DIR}/mkrtos_user/lib/sys_util/inc
${CMAKE_SOURCE_DIR}/mkrtos_user/lib/sys_svr/inc
${CMAKE_SOURCE_DIR}/mkrtos_user/lib/util/inc
${CMAKE_SOURCE_DIR}/mkrtos_user/server/app/drv
${CMAKE_SOURCE_DIR}/mkrtos_user/lib/mlibc/arch/arm/
${CMAKE_SOURCE_DIR}/mkrtos_user/lib/mlibc/arch/generic
${CMAKE_SOURCE_DIR}/mkrtos_user/lib/mlibc/obj/src/internal
${CMAKE_SOURCE_DIR}/mkrtos_user/lib/mlibc/src/include
${CMAKE_SOURCE_DIR}/mkrtos_user/lib/mlibc/src/internal
${CMAKE_SOURCE_DIR}/mkrtos_user/lib/mlibc/obj/include
${CMAKE_SOURCE_DIR}/mkrtos_user/lib/mlibc/include
)
# set(CPACK_PROJECT_NAME ${PROJECT_NAME})

View File

@@ -206,9 +206,9 @@ void shellInit(Shell *shell, char *buffer, unsigned short size)
shell->commandList.base = (ShellCommand *)(&_shell_command_start);
shell->commandList.count = ((size_t)(&_shell_command_end) - (size_t)(&_shell_command_start)) / sizeof(ShellCommand);
#ifdef MKRTOS
#ifndef CONFIG_MMU
extern void *app_start_addr;
unsigned long start_addr = ((unsigned long)app_start_addr) & (~3UL);
#endif
for (int i = 0; i < shell->commandList.count; i++)
{
ShellCommand *cmd = (ShellCommand *)(shell->commandList.base) + i;
@@ -237,6 +237,8 @@ void shellInit(Shell *shell, char *buffer, unsigned short size)
cmd->data.key.function = (int (*)())((unsigned long)cmd->data.key.function + start_addr | 0x1);
}
}
#endif
#endif
#else
#error not supported compiler, please use command table mode
#endif

View File

@@ -1,6 +1,17 @@
#pragma once
#include <u_types.h>
#include <u_prot.h>
enum vpage_prot_attrs
{
VPAGE_PROT_RO = 1, //!< 只读
VPAGE_PROT_RW = VPAGE_PROT_RO | 0x2, //!< 读写
VPAGE_PROT_RWX = (VPAGE_PROT_RO | VPAGE_PROT_RW | 0x4), //!< 读写执行
};
#define VMA_ADDR_RESV 0x1 //!< 保留内存
#define VMA_ADDR_UNCACHE 0x2 //!< uncache内存
typedef union vma_addr
{
umword_t raw;

View File

@@ -4,10 +4,8 @@ include_directories(
${CMAKE_SOURCE_DIR}/mkrtos_user/lib/libc_backend/inc
)
if (${ARCH_NAME} STREQUAL "armv7_8m")
set(START_LIB muslc)
set(START_LIB start)
add_subdirectory(init)
add_subdirectory(shell)
# add_subdirectory(app)
add_subdirectory(fs)
add_subdirectory(hello)
@@ -33,5 +31,7 @@ elseif(${CONFIG_ARCH} STREQUAL "aarch64" )
${CMAKE_SOURCE_DIR}/build/libc/output/lib/crti.o
${CMAKE_SOURCE_DIR}/build/libc/output/lib/crtn.o
)
add_subdirectory(init)
endif()
add_subdirectory(init)
add_subdirectory(shell)

View File

@@ -1,3 +1,4 @@
#ifndef CONFIG_MMU
/**
* @file heap_stack.c
* @author ATShining (1358745329@qq.com)
@@ -24,3 +25,4 @@
__attribute__((used)) HEAP_ATTR static char _____heap_____[HEAP_SIZE];
__attribute__((used)) STACK_ATTR static char _____stack_____[STACK_SIZE];
#endif

View File

@@ -4,6 +4,7 @@
#include <assert.h>
#include <string.h>
#include <stdio.h>
#if 0
void mm_test(void)
{
void *mem = mm_alloc_page(MM_PROT, 2, REGION_RWX);
@@ -17,3 +18,4 @@ void mm_test(void)
mm_free_page(MM_PROT, mem, 2);
printf("mm test success.\n");
}
#endif

View File

@@ -2,22 +2,20 @@ cmake_minimum_required(VERSION 3.13)
file(GLOB_RECURSE deps *.c *.S)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DUSE_STDPERIPH_DRIVER=1 \
")
add_executable(sh.elf
${deps}
${START_SRC}
)
target_link_libraries(sh.elf
PUBLIC
start
muslc
-Bstatic
${LIBC_NAME}
${START_LIB}
--whole-archive
sys
sys_util
sys_svr
mr
# mr
LetterShell
--no-whole-archive
${GCC_LIB_PATH}/libgcc.a
@@ -30,25 +28,11 @@ target_include_directories(
${CMAKE_SOURCE_DIR}/mkrtos_user/lib/sys_svr/inc
${CMAKE_SOURCE_DIR}/mkrtos_user/lib/letter-shell/demo/mkrtos
${CMAKE_SOURCE_DIR}/mkrtos_user/lib/letter-shell/src
${CMAKE_SOURCE_DIR}/mkrtos_user/lib/mlibc/arch/arm/
${CMAKE_SOURCE_DIR}/mkrtos_user/lib/mlibc/arch/generic
${CMAKE_SOURCE_DIR}/mkrtos_user/lib/mlibc/obj/src/internal
${CMAKE_SOURCE_DIR}/mkrtos_user/lib/mlibc/src/include
${CMAKE_SOURCE_DIR}/mkrtos_user/lib/mlibc/src/internal
${CMAKE_SOURCE_DIR}/mkrtos_user/lib/mlibc/obj/include
${CMAKE_SOURCE_DIR}/mkrtos_user/lib/mlibc/include
${CMAKE_SOURCE_DIR}/mkrtos_user/server/sh/bsp/core_inc
${CMAKE_SOURCE_DIR}/mkrtos_user/server/sh/bsp/inc
)
add_dependencies(sh.elf
muslc
)
set_target_properties(sh.elf PROPERTIES LINK_FLAGS
"-T ${CMAKE_CURRENT_LIST_DIR}/link.lds -pie --gc-section -no-dynamic-linker "
#--no-warn-rwx-segments
"-T ${CMAKE_CURRENT_LIST_DIR}/${ARCH_NAME}/link.lds ${CORTEX_M_LINK_FLAGS} --gc-section -no-dynamic-linker "
)
#--no-warn-rwx-segments
add_custom_target(
shell_dump ALL
COMMAND
@@ -62,17 +46,15 @@ add_custom_target(
COMMAND
mkdir -p ${CMAKE_SOURCE_DIR}/build/output/cpio
COMMAND
cp sh.bin ${CMAKE_SOURCE_DIR}/build/output/cpio/sh
COMMAND
cp sh.elf ${CMAKE_SOURCE_DIR}/build/output/sh.elf
cp sh.elf ${CMAKE_SOURCE_DIR}/build/output/cpio/sh.elf
)
add_dependencies(shell_dump sh.elf)
add_dependencies(shell_dump sys)
add_dependencies(shell_dump sys_util)
add_dependencies(shell_dump mr)
# add_dependencies(shell_dump mr)
add_dependencies(shell_dump sys_svr)
add_dependencies(shell_dump start)
add_dependencies(shell_dump muslc)
# add_dependencies(shell_dump start)
# add_dependencies(shell_dump muslc)
add_dependencies(shell_dump LetterShell)

View File

@@ -0,0 +1,233 @@
/* Script for -z combreloc */
/* Copyright (C) 2014-2021 Free Software Foundation, Inc.
Copying and distribution of this script, with or without modification,
are permitted in any medium without royalty provided the copyright
notice and this notice are preserved. */
OUTPUT_FORMAT("elf64-littleaarch64", "elf64-bigaarch64",
"elf64-littleaarch64")
OUTPUT_ARCH(aarch64)
ENTRY(_start)
SEARCH_DIR("//aarch64-none-elf/lib");
SECTIONS
{
/* Read-only sections, merged into text segment: */
PROVIDE (__executable_start = SEGMENT_START("text-segment", 0x00400000)); . = SEGMENT_START("text-segment", 0x00400000);
.interp : { *(.interp) }
.note.gnu.build-id : { *(.note.gnu.build-id) }
.hash : { *(.hash) }
.gnu.hash : { *(.gnu.hash) }
.dynsym : { *(.dynsym) }
.dynstr : { *(.dynstr) }
.gnu.version : { *(.gnu.version) }
.gnu.version_d : { *(.gnu.version_d) }
.gnu.version_r : { *(.gnu.version_r) }
.rela.dyn :
{
*(.rela.init)
*(.rela.text .rela.text.* .rela.gnu.linkonce.t.*)
*(.rela.fini)
*(.rela.rodata .rela.rodata.* .rela.gnu.linkonce.r.*)
*(.rela.data .rela.data.* .rela.gnu.linkonce.d.*)
*(.rela.tdata .rela.tdata.* .rela.gnu.linkonce.td.*)
*(.rela.tbss .rela.tbss.* .rela.gnu.linkonce.tb.*)
*(.rela.ctors)
*(.rela.dtors)
*(.rela.got)
*(.rela.bss .rela.bss.* .rela.gnu.linkonce.b.*)
*(.rela.ifunc)
}
.rela.plt :
{
*(.rela.plt)
PROVIDE_HIDDEN (__rela_iplt_start = .);
*(.rela.iplt)
PROVIDE_HIDDEN (__rela_iplt_end = .);
}
.init :
{
KEEP (*(SORT_NONE(.init)))
} =0x1f2003d5
.plt : { *(.plt) *(.iplt) }
.text :
{
*(.text.unlikely .text.*_unlikely .text.unlikely.*)
*(.text.exit .text.exit.*)
*(.text.startup .text.startup.*)
*(.text.hot .text.hot.*)
*(SORT(.text.sorted.*))
*(.text .stub .text.* .gnu.linkonce.t.*)
/* .gnu.warning sections are handled specially by elf.em. */
*(.gnu.warning)
. = ALIGN(4);
_shell_command_start = .;
KEEP(*(shellCommand))
_shell_command_end = .;
} =0x1f2003d5
.fini :
{
KEEP (*(SORT_NONE(.fini)))
} =0x1f2003d5
PROVIDE (__etext = .);
PROVIDE (_etext = .);
PROVIDE (etext = .);
.rodata : { *(.rodata .rodata.* .gnu.linkonce.r.*) }
.rodata1 : { *(.rodata1) }
.eh_frame_hdr : { *(.eh_frame_hdr) *(.eh_frame_entry .eh_frame_entry.*) }
.eh_frame : ONLY_IF_RO { KEEP (*(.eh_frame)) *(.eh_frame.*) }
.gcc_except_table : ONLY_IF_RO { *(.gcc_except_table .gcc_except_table.*) }
.gnu_extab : ONLY_IF_RO { *(.gnu_extab*) }
/* These sections are generated by the Sun/Oracle C++ compiler. */
.exception_ranges : ONLY_IF_RO { *(.exception_ranges*) }
/* Adjust the address for the data segment. We want to adjust up to
the same address within the page on the next page up. */
. = ALIGN(CONSTANT (MAXPAGESIZE)) + (. & (CONSTANT (MAXPAGESIZE) - 1));
/* Exception handling */
.eh_frame : ONLY_IF_RW { KEEP (*(.eh_frame)) *(.eh_frame.*) }
.gnu_extab : ONLY_IF_RW { *(.gnu_extab) }
.gcc_except_table : ONLY_IF_RW { *(.gcc_except_table .gcc_except_table.*) }
.exception_ranges : ONLY_IF_RW { *(.exception_ranges*) }
/* Thread Local Storage sections */
.tdata :
{
PROVIDE_HIDDEN (__tdata_start = .);
*(.tdata .tdata.* .gnu.linkonce.td.*)
}
.tbss : { *(.tbss .tbss.* .gnu.linkonce.tb.*) *(.tcommon) }
.preinit_array :
{
PROVIDE_HIDDEN (__preinit_array_start = .);
KEEP (*(.preinit_array))
PROVIDE_HIDDEN (__preinit_array_end = .);
}
.init_array :
{
PROVIDE_HIDDEN (__init_array_start = .);
KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*)))
KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors))
PROVIDE_HIDDEN (__init_array_end = .);
}
.fini_array :
{
PROVIDE_HIDDEN (__fini_array_start = .);
KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*)))
KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors))
PROVIDE_HIDDEN (__fini_array_end = .);
}
.ctors :
{
/* gcc uses crtbegin.o to find the start of
the constructors, so we make sure it is
first. Because this is a wildcard, it
doesn't matter if the user does not
actually link against crtbegin.o; the
linker won't look for a file to match a
wildcard. The wildcard also means that it
doesn't matter which directory crtbegin.o
is in. */
KEEP (*crtbegin.o(.ctors))
KEEP (*crtbegin?.o(.ctors))
/* We don't want to include the .ctor section from
the crtend.o file until after the sorted ctors.
The .ctor section from the crtend file contains the
end of ctors marker and it must be last */
KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors))
KEEP (*(SORT(.ctors.*)))
KEEP (*(.ctors))
}
.dtors :
{
KEEP (*crtbegin.o(.dtors))
KEEP (*crtbegin?.o(.dtors))
KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors))
KEEP (*(SORT(.dtors.*)))
KEEP (*(.dtors))
}
.jcr : { KEEP (*(.jcr)) }
.data.rel.ro : { *(.data.rel.ro.local* .gnu.linkonce.d.rel.ro.local.*) *(.data.rel.ro .data.rel.ro.* .gnu.linkonce.d.rel.ro.*) }
.dynamic : { *(.dynamic) }
.got : { *(.got) *(.igot) }
.got.plt : { *(.got.plt) *(.igot.plt) }
.data :
{
__data_start = .;
*(.data .data.* .gnu.linkonce.d.*)
SORT(CONSTRUCTORS)
}
.data1 : { *(.data1) }
_edata = .; PROVIDE (edata = .);
. = .;
__bss_start = .;
__bss_start__ = .;
.bss :
{
*(.dynbss)
*(.bss .bss.* .gnu.linkonce.b.*)
*(COMMON)
/* Align here to ensure that the .bss section occupies space up to
_end. Align after .bss to ensure correct alignment even if the
.bss section disappears because there are no input sections.
FIXME: Why do we need it? When there is no .bss section, we do not
pad the .data section. */
. = ALIGN(. != 0 ? 64 / 8 : 1);
}
_bss_end__ = .; __bss_end__ = .;
. = ALIGN(64 / 8);
. = SEGMENT_START("ldata-segment", .);
. = ALIGN(64 / 8);
__end__ = .;
_end = .; PROVIDE (end = .);
.stack 0x80000 :
{
_stack = .;
*(.stack)
}
/* Stabs debugging sections. */
.stab 0 : { *(.stab) }
.stabstr 0 : { *(.stabstr) }
.stab.excl 0 : { *(.stab.excl) }
.stab.exclstr 0 : { *(.stab.exclstr) }
.stab.index 0 : { *(.stab.index) }
.stab.indexstr 0 : { *(.stab.indexstr) }
.comment 0 : { *(.comment) }
.gnu.build.attributes : { *(.gnu.build.attributes .gnu.build.attributes.*) }
/* DWARF debug sections.
Symbols in the DWARF debugging sections are relative to the beginning
of the section so we begin them at 0. */
/* DWARF 1. */
.debug 0 : { *(.debug) }
.line 0 : { *(.line) }
/* GNU DWARF 1 extensions. */
.debug_srcinfo 0 : { *(.debug_srcinfo) }
.debug_sfnames 0 : { *(.debug_sfnames) }
/* DWARF 1.1 and DWARF 2. */
.debug_aranges 0 : { *(.debug_aranges) }
.debug_pubnames 0 : { *(.debug_pubnames) }
/* DWARF 2. */
.debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) }
.debug_abbrev 0 : { *(.debug_abbrev) }
.debug_line 0 : { *(.debug_line .debug_line.* .debug_line_end) }
.debug_frame 0 : { *(.debug_frame) }
.debug_str 0 : { *(.debug_str) }
.debug_loc 0 : { *(.debug_loc) }
.debug_macinfo 0 : { *(.debug_macinfo) }
/* SGI/MIPS DWARF 2 extensions. */
.debug_weaknames 0 : { *(.debug_weaknames) }
.debug_funcnames 0 : { *(.debug_funcnames) }
.debug_typenames 0 : { *(.debug_typenames) }
.debug_varnames 0 : { *(.debug_varnames) }
/* DWARF 3. */
.debug_pubtypes 0 : { *(.debug_pubtypes) }
.debug_ranges 0 : { *(.debug_ranges) }
/* DWARF 5. */
.debug_addr 0 : { *(.debug_addr) }
.debug_line_str 0 : { *(.debug_line_str) }
.debug_loclists 0 : { *(.debug_loclists) }
.debug_macro 0 : { *(.debug_macro) }
.debug_names 0 : { *(.debug_names) }
.debug_rnglists 0 : { *(.debug_rnglists) }
.debug_str_offsets 0 : { *(.debug_str_offsets) }
.debug_sup 0 : { *(.debug_sup) }
.ARM.attributes 0 : { KEEP (*(.ARM.attributes)) KEEP (*(.gnu.attributes)) }
.note.gnu.arm.ident 0 : { KEEP (*(.note.gnu.arm.ident)) }
/DISCARD/ : { *(.note.GNU-stack) *(.gnu_debuglink) *(.gnu.lto_*) }
}

View File

@@ -1,4 +1,4 @@
#ifndef CONFIG_MMU
#define HEAP_SIZE 2048
#define STACK_SIZE (1024 + 512)
@@ -15,3 +15,4 @@
__attribute__((used)) HEAP_ATTR static char _____heap_____[HEAP_SIZE];
__attribute__((used)) STACK_ATTR static char _____stack_____[STACK_SIZE];
#endif