chore: rename symbol name from linker script

This commit is contained in:
Paul Pan 2024-04-07 19:38:26 +08:00
parent e469b99cb5
commit 70ca917778
3 changed files with 133 additions and 38 deletions

View File

@ -2,30 +2,46 @@ use crate::utils::extern_addr::ExternSymbol;
use crate::utils::size::KIB;
extern "C" {
static __kernel_start: ExternSymbol;
static __kernel_end: ExternSymbol;
pub static KERNEL_START: ExternSymbol;
pub static KERNEL_END: ExternSymbol;
pub static KERNEL_OFFSET: usize;
static __text_start: ExternSymbol;
static __text_end: ExternSymbol;
static TEXT_START: ExternSymbol;
static TEXT_END: ExternSymbol;
static __rodata_start: ExternSymbol;
static __rodata_end: ExternSymbol;
static RODATA_START: ExternSymbol;
static RODATA_END: ExternSymbol;
static __data_start: ExternSymbol;
static __data_end: ExternSymbol;
static DATA_START: ExternSymbol;
static DATA_END: ExternSymbol;
static __bss_start: ExternSymbol;
pub static __boot_stack_end: ExternSymbol;
pub static __bss_end: ExternSymbol;
static BSS_START: ExternSymbol;
pub static BOOT_STACK_END: ExternSymbol;
pub static BSS_END: ExternSymbol;
static __tss_start: ExternSymbol;
static __tss_end: ExternSymbol;
static TSS_START: ExternSymbol;
static TSS_END: ExternSymbol;
static __tdata_start: ExternSymbol;
static __tdata_end: ExternSymbol;
static TDATA_START: ExternSymbol;
static TDATA_END: ExternSymbol;
pub static __tbss_start: ExternSymbol;
pub static __tbss_end: ExternSymbol;
pub static TBSS_START: ExternSymbol;
pub static TBSS_END: ExternSymbol;
}
pub const PAGE_SIZE: usize = 4 * KIB;
#[inline(always)]
pub fn zero_bss() {
fn clear_range<T: Clone>(bgn: *mut T, end: *mut T) {
unsafe {
core::slice::from_raw_parts_mut(bgn, end.offset_from(bgn) as usize)
.fill(core::mem::zeroed())
}
}
unsafe {
clear_range(BOOT_STACK_END.as_mut_ptr(), BSS_END.as_mut_ptr());
clear_range(TBSS_START.as_mut_ptr(), TBSS_END.as_mut_ptr());
}
}

View File

@ -6,63 +6,64 @@ PAGE_SIZE = 0x1000;
SECTIONS {
. = BASE_ADDRESS;
__kernel_start = .;
KERNEL_START = .;
__kernel_offset = . - BASE_ADDRESS;
.text : {
__text_start = .;
TEXT_START = .;
*(.text.entry)
*(.text .text.*)
__text_end = .;
TEXT_END = .;
}
.rodata : {
. = ALIGN(8);
__rodata_start = .;
. = ALIGN(PAGE_SIZE);
RODATA_START = .;
*(.rodata .rodata.*)
*(.srodata .srodata.*)
__rodata_end = .;
RODATA_END = .;
}
.data : {
. = ALIGN(8);
__data_start = .;
. = ALIGN(PAGE_SIZE);
DATA_START = .;
*(.data .data.*)
PROVIDE( __global_pointer$ = . + 0x800 );
*(.sdata .sdata.*)
__data_end = .;
DATA_END = .;
}
.bss : {
. = ALIGN(8);
__bss_start = .;
. = ALIGN(PAGE_SIZE);
BSS_START = .;
*(.bss.boot_stack)
__boot_stack_end = .;
BOOT_STACK_END = .;
*(.bss .bss.*)
*(.sbss .sbss.*)
__bss_end = .;
BSS_END = .;
}
.tss : {
. = ALIGN(8);
__tss_start = .;
. = ALIGN(PAGE_SIZE);
TSS_START = .;
. = ALIGN(8);
__tdata_start = .;
TDATA_START = .;
*(.tdata .tdata.*)
__tdata_end = .;
TDATA_END = .;
. = ALIGN(8);
__tbss_start = .;
TBSS_START = .;
*(.tbss .tbss.*)
__tbss_end = .;
TBSS_END = .;
__tss_end = .;
TSS_END = .;
}
. = ALIGN(PAGE_SIZE);
__kernel_end = .;
KERNEL_END = .;
/DISCARD/ : {
*(.eh_frame_hdr)

View File

@ -0,0 +1,78 @@
OUTPUT_ARCH(riscv)
ENTRY(_start)
/* We use high memory (0xFFFF....) for kernel space
* For sv39 and larger layout, memory base starts from 0xFFFFFFC000000000: {1'b1, {38{1'b0}}}
* Our kernel will placed at 0xFFFFFFD000000000 (VA) and 0x80200000 (PA)
* Regions between 0x...C... and 0x...D... will be reserved for firmware starting from 0x80000000 (PA) */
PHY_BASE_ADDRESS = 0xFFFFFFD000000000;
BASE_ADDRESS = 0x80200000;
PAGE_SIZE = 0x1000;
SECTIONS {
. = PHY_BASE_ADDRESS;
KERNEL_START = .;
__kernel_offset = . - BASE_ADDRESS;
.text : AT(ADDR(.text) - __kernel_offset) {
TEXT_START = .;
*(.text.entry)
*(.text .text.*)
TEXT_END = .;
}
.rodata : AT(ADDR(.rodata) - __kernel_offset) {
. = ALIGN(PAGE_SIZE);
RODATA_START = .;
*(.rodata .rodata.*)
*(.srodata .srodata.*)
RODATA_END = .;
}
.data : AT(ADDR(.data) - __kernel_offset) {
. = ALIGN(PAGE_SIZE);
DATA_START = .;
*(.data .data.*)
PROVIDE( __global_pointer$ = . + 0x800 );
*(.sdata .sdata.*)
DATA_END = .;
}
.bss : AT(ADDR(.bss) - __kernel_offset) {
. = ALIGN(PAGE_SIZE);
BSS_START = .;
*(.bss.boot_stack)
BOOT_STACK_END = .;
*(.bss .bss.*)
*(.sbss .sbss.*)
BSS_END = .;
}
.tss : AT(ADDR(.tss) - __kernel_offset) {
. = ALIGN(PAGE_SIZE);
TSS_START = .;
. = ALIGN(8);
TDATA_START = .;
*(.tdata .tdata.*)
TDATA_END = .;
. = ALIGN(8);
TBSS_START = .;
*(.tbss .tbss.*)
TBSS_END = .;
TSS_END = .;
}
. = ALIGN(PAGE_SIZE);
KERNEL_END = .;
/DISCARD/ : {
*(.eh_frame_hdr)
*(.eh_frame)
}
}