2016-11-07 12 views
2

我正在尝试在Rust中编程裸机嵌入式系统。通常在C启动代码中完成的一件事是为任何全局或静态未初始化的变量初始化BSS段。如何编写将全局/静态放置在填充BSS段中的Rust代码?

但是,在Rust中,我无法弄清楚如何创建任何全局或静态未初始化的变量(即使使用unsafe代码)。换句话说,我不知道如何编写任何Rust代码,以便编译器用某些东西来填充BSS段。

我想...

static BSS_Data: i32 = unsafe { core::mem::uninitialized() }; 

....但是编译器拒绝了。

有什么办法可以编写Rust代码(unsafe或其他),这会导致填充的BSS段?在任何完全由Rust编写的程序中,BSS段是否保证始终为空?

+1

**零初始化** BSS段的任何全局或静态初始化** **变量 - 你要哪个?如果你想让它初始化为零,那么*将它初始化为零*。这就是说,*你*将不得不编写任何代码将数据从闪存复制到RAM中。这就是裸机的意思。 – Shepmaster

+0

我对Rust没有任何了解,但是不能只声明一个静态变量并将其初始化为零?这应该强制它在.bss中分配。 – Lundin

+0

@Lundin如果您在代码中初始化为零,它将进入数据段。 – Verax

回答

0

.bss段的用途是加快所有静态存储持续时间变量的初始化,其值为零。但是也要保存NVM,因为在闪存中存储所有值为0的x个字节并没有意义,然后将它们逐个复制到RAM中。

您的问题的解决方案可能是声明一个静态变量并明确将其初始化为零。因为具有静态存储持续时间的所有初始化为零的变量最终都会在.bss中结束。

作为这个的副作用,所有未初始化的静态存储持续时间变量也在.bss也结束。因为在C中(以及从C派生/从C启发的语言),要求如果具有静态存储持续时间的变量未由程序员明确初始化,则必须将其初始化为零值。

例如,这是在标准C11正式6.7.9指定:

如果具有静态或线程存储持续时间的对象是不明确 初始化,则:
- 如果它有指针类型,它被初始化为空指针 ;
- 如果它具有算术类型,则将其初始化为(正数或无符号数)零;否则为 。


Pseudo code example of how .data and .bss initialization will differ.

More info of the different memory types and where different kind of variables end up in an embedded system.

+0

那么,你能证明什么证明**在Rust **中发生了这种情况? – Shepmaster

+1

@Shepmaster链接器的行为不是由任何语言标准指定的。没有要求'.bss'段必须存在。类似地,执行静态存储持续时间变量的初始化的方式也不由语言标准规定。 – Lundin

相关问题