2016-11-07 2 views
2

J'expérimente avec la programmation de systèmes embarqués sans métal dans Rust. L'une des opérations généralement effectuées dans le code de démarrage C consiste à initialiser le segment BSS à zéro pour toutes les variables globales ou non initialisées statiques.Comment écrire du code Rust qui place des globals/statiques dans un segment BSS peuplé?

Cependant, dans Rust, je n'arrive pas à comprendre comment créer des variables globales ou non initialisées statiques (même en utilisant le code unsafe). En d'autres termes, je n'arrive pas à comprendre comment écrire du code Rust pour que le compilateur remplisse le segment BSS avec quelque chose.

J'ai essayé ...

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

.... mais le compilateur rejetèrent.

Existe-t-il un moyen d'écrire du code Rust (unsafe ou autre) qui produira un segment BSS rempli? Le segment BSS est-il garanti être toujours vide dans tout programme écrit entièrement dans Rust?

+1

** zéro ** initialisation du segment BSS pour toutes les variables ** ** initialisées globales ou statiques - qui ne voulez-vous? Si vous voulez qu'il soit initialisé à zéro, alors * l'initialiser à zéro *. Cela étant dit, * vous * devrez écrire n'importe quel code qui copie des valeurs hors de la mémoire flash et dans la RAM. C'est ce que signifie le bare-metal. – Shepmaster

+0

Je ne sais rien de Rust, mais ne pouvez-vous pas simplement déclarer une variable statique et l'initialiser à zéro? Cela devrait le forcer à être alloué en .bss. – Lundin

+0

@Lundin Si vous l'initialisez à zéro dans votre code, il ira dans le segment de données. – Verax

Répondre

0

Le but du segment .bss est d'accélérer l'initialisation de toutes les variables de durée de stockage statique avec la valeur zéro. Mais aussi pour enregistrer NVM, car cela n'a pas de sens d'enregistrer x octets tous avec la valeur 0 en flash, puis les copier en RAM un par un.

La solution à votre problème pourrait être de déclarer une variable statique et de l'initialiser explicitement à zéro. Parce que toutes les variables avec la durée de stockage statique qui sont initialisées à la valeur zéro se terminent par .bss. En conséquence, toutes les variables de durée de stockage statique non initialisées se retrouvent également également dans .bss

. Parce que dans C (et dans les langages dérivés de/inspiré par C) il y a une exigence que si une variable avec une durée de stockage statique n'est pas initialisée explicitement par le programmeur, elle doit être initialisée à la valeur zéro.

Par exemple, cela est formellement spécifié dans la norme C11 6.7.9:

Si un objet qui a une durée de stockage statique ou fil n'est pas initialisé explicitement, alors:
- si elle est de type pointeur , il est initialisé à un pointeur nul;
- s'il est de type arithmétique, il est initialisé à zéro (positif ou non);


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

Alors, que pouvez-vous montrer qui prouve que ** dans Rust ** cela arrive? – Shepmaster

+1

@Shepmaster Le comportement de l'éditeur de liens n'est spécifié par aucune norme de langage. Il n'est pas nécessaire qu'un segment '.bss' soit présent. De même, la manière dont l'initialisation des variables de durée de stockage statique est effectuée n'est pas non plus spécifiée par une norme de langage. – Lundin