J'utilise un script d'éditeur de liens personnalisé pour diviser une image de noyau en deux parties. Le premier est le code et les données normaux, et le second est le code d'initialisation et les données à supprimer quand elles ne sont plus nécessaires. La partie d'initialisation n'est pas non plus partagée entre les espaces d'adressage comme le noyau lui-même, donc tout ce qui y est copié sur fork() est toujours là (c'est dans ces premières phases de développement).Section de données non-.bss non initialisée
J'ai attribué une petite pile de noyau à utiliser lors du démarrage, mais ce que je peux voir, je ne peux le mettre soit dans la section .bss où il se partage entre les espaces d'adresse ou dans la zone init où il ne peut pas être stocké en tant que données non initialisées. Je voudrais le stocker dans la partie init de l'image sous forme de données non initialisées afin que chaque processus obtienne sa propre copie.
Je peux penser à deux façons possibles de le faire, mais je n'ai pas été en mesure de savoir si elles sont possibles ou comment je dirais à l'éditeur de liens de les faire. Le premier serait de mettre des régions non initialisées dans des sections non-.bss, mais je ne suis pas sûr que ce soit possible - je ne pense pas que vous pouvez mélanger des sections comme ça. La seconde serait de créer une seconde section .bss-like qui ne stocke que des données non initialisées, que je pourrais mettre dans la pat d'initialisation du script de l'éditeur de liens.
Des idées? Pour être complet, voici le script éditeur de liens que je utilise:
ENTRY(_start)
_kernel_offset = _start_kernel - _start_kernel_phys;
SECTIONS {
_start_init = 0x100000;
.init _start_init : AT(ADDR(.init)) { *(.mboot .init*) }
.ctors : {
__CTOR_NUM__ = .; LONG((__CTOR_END__ - __CTOR_LIST__)/4)
__CTOR_LIST__ = .; *(.ctors*)
__CTOR_END__ = .;
}
_end_init = .;
. = ALIGN(4M);
_start_kernel_phys = .;
_start_kernel = 0xF0000000;
.text _start_kernel : AT(ADDR(.text) - _kernel_offset) { *(.text*) }
.data ALIGN(4K) : AT(ADDR(.data) - _kernel_offset) { *(.rodata* .data*) }
.bss ALIGN(4K) : AT(ADDR(.bss) - _kernel_offset) { *(.bss) *(COMMON) }
_end_kernel = .;
_end_kernel_phys = _end_kernel - _kernel_offset;
/DISCARD/ : { *(.eh_frame .comment) }
}