我正在尝试用Rust编写裸机嵌入式系统。C启动代码中通常要做的一件事是为任何全局或静态的未初始化变量零初始化BSS段。
然而,在Rust中,我不知道如何创建任何全局或静态的未初始化变量(即使使用unsafe
代码)。换句话说,我不知道如何编写任何Rust代码,以便编译器用一些东西填充BSS段。
我试过...
static BSS_Data: i32 = unsafe { core::mem::uninitialized() };
....但编译器拒绝了它。
是否有任何方法可以编写Rust代码(unsafe
或其他),这将导致一个填充的BSS段?是否保证BSS段在任何完全用Rust编写的程序中总是空的?
2条答案
按热度按时间cbjzeqam1#
第一个
huus2vyu2#
.bss
段的目的是加快所有值为零的静态存储持续时间变量的初始化速度,同时也是为了保存NVM,因为在闪存中保存值为0
的x个字节,然后将它们逐个复制到RAM中是没有意义的。问题的解决方案可能是声明一个静态变量并显式地将其初始化为零。因为所有初始化为零的静态存储持续时间的变量最终都是
.bss
。由于在C语言中(以及衍生自C语言或受C语言启发的语言中)有一个要求,即如果一个具有静态存储持续时间的变量没有被程序员显式初始化,它必须被初始化为零值。
例如,这在C11标准6.7.9中有正式规定:
如果未显式初始化具有静态或线程存储持续时间的对象,则:
Pseudo code example of how
.data
and.bss
initialization will differ.更多关于不同内存类型以及不同类型的变量在嵌入式系统中的位置的信息。