2016-11-07 5 views
2

Я экспериментирую с программированием встроенных систем в Rust. Одной из вещей, которые обычно выполняются в C-запуске, является нуль-инициализация сегмента BSS для любых глобальных или статических неинициализированных переменных.Как написать код Rust, который помещает globals/statics в заполненный сегмент BSS?

Однако в Rust я не могу понять, как создать глобальные или статические неинициализированные переменные (даже используя код unsafe). Другими словами, я не могу понять, как написать любой код Rust, чтобы компилятор каким-то образом заполнил сегмент BSS.

Я пытался ...

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

.... но компилятор отверг его.

Есть ли способ написать код ржавчины (unsafe или иначе), что приведет к заполнению сегмента BSS? Гарантируется ли всегда, что сегмент BSS всегда пуст в любой программе, полностью написанной в Rust?

+1

** нулевой инициализацией ** сегмент BSS для любых глобальных или статических ** неинициализированными ** переменные - которые вы хотите? Если вы хотите, чтобы он был инициализирован нулем, тогда * инициализируйте его до нуля *. При этом * вам нужно будет написать любой код, который копирует значения из флеш-памяти и в оперативную память. Это то, что означает голый металл. – Shepmaster

+0

Я ничего не знаю о Rust, но не можете ли вы просто объявить статическую переменную и инициализировать ее до нуля? Это должно заставить его получить выделение в .bss. – Lundin

+0

@ Lundin Если вы инициализируете его в нулевом коде, он перейдет в сегмент данных. – Verax

ответ

0

Целью сегмента .bss является ускорение инициализации всех переменных статической продолжительности хранения с нулевым значением. Но и для сохранения NVM, так как не имеет смысла сохранять x байтов со значением 0 во флэш-памяти и затем копировать их в RAM по одному.

Решение проблемы может состоять в том, чтобы объявить статическую переменную и явно инициализировать ее до нуля. Поскольку все переменные со статической продолжительностью хранения, которые инициализируются нулевым значением, заканчиваются на .bss.

В качестве побочного эффекта все неинициализированные переменные продолжительности статического хранения также оказываются в .bss. Потому что в 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

 Смежные вопросы

  • Нет связанных вопросов^_^