如何在 Rust 代码中从链接脚本访问变量?

4
以下是链接脚本的代码片段。
.data :
{
    *(.data*)
}
> ram
. = ALIGN(4);

/* Set Stack after code & data */
_stack_start = .;

我该如何在我的 Rust 代码中(不使用标准库)访问_stack_start(堆栈的起始地址)?

#![no_std]
#![no_main]
#![allow(dead_code)]

#[no_mangle]
pub fn _start() {
    // let sp: i32 = _stack_start; -> **This causes compilation error**

    type FnPtr = fn() -> ();
    let th: FnPtr = trap_handler;

    unsafe {
        asm!("csrw mtvec, {}" ,
            in(reg) th);
    }

    loop {}
}

注意_start()需要使用extern "C",并且最好将其标记为返回! - Chayim Friedman
1个回答

4
嘿,我没有运行您的代码的方式,但是似乎此源代码可以实现您想要的功能。我建议您阅读整个文档,但我会在答案中提供重要部分。

他们在链接器脚本中创建符号:

.data : AT(ADDR(.rodata) + SIZEOF(.rodata))
{
  _sdata = .;
  *(.data .data.*);
  _edata = .;
} > RAM

然后在Rust中将它们声明为extern "C"

extern "C" {
    static mut _sdata: u8;
    static mut _edata: u8;
}

接下来,他们这样使用这些符号的地址:

let count = &_edata as *const u8 as usize - &_sdata as *const u8 as usize;

至于为什么Rust代码使用这些变量的地址而不是它们的值,我建议您查看SO答案。

我不确定为什么这些变量被声明为u8,但无论如何它们都通过转换为usize的地址进行访问,因此我怀疑它们的类型对编译器来说可能并不重要。


如果代码不使用地址,则会获取地址处的u8 - the busybee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接