Domanda

Sto utilizzando uno script del linker personalizzato per dividere un immagine del kernel in due parti. Il primo è codice normale e dati, e il secondo è codice di inizializzazione e dati essere scartato quando è più necessario. La parte inizializzazione non è condivisa anche tra spazi di indirizzi il modo in cui il kernel corretto è, quindi tutto ci viene copiato sulla forcella () se è ancora in giro (è in queste prime fasi di sviluppo).

Ho assegnato un piccolo stack del kernel da utilizzare durante il boot, ma da quello che posso vedere, posso solo mettere o nella sezione .bss dove viene condivisa tra spazi di indirizzamento o nella zona init dove non può essere archiviato come dati non inizializzati. Vorrei memorizzarlo nella parte init dell'immagine come dati non inizializzati in modo che ogni processo ottiene la propria copia.

Mi vengono in mente due possibili modi per fare questo, ma non sono stato in grado di scoprire se sono possibili o come mi avrebbero detto il linker per farle. Il primo sarebbe quello di mettere le regioni non inizializzati in sezioni non .bss, ma non sono sicuro che sia possibile- non credo che si può mescolare le sezioni del genere. Il secondo sarebbe quello di creare un secondo .bss-come sezione che i dati non inizializzati solo negozi, che ho potuto mettere in pat di inizializzazione dello script del linker.

Tutte le idee? Per completezza, ecco lo script del linker che sto usando:

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) }
}
È stato utile?

Soluzione

(ugh, rispondendo ancora una volta alla mia domanda)

Fare una nuova sezione senza le opere degli attributi CONTENUTI; è dichiarato in assemblea in questo modo:

.section .init.bss, "aw", @nobits
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top