Pregunta

Estoy usando un script enlazador costumbre de dividir una imagen del núcleo en dos partes. La primera es código normal y datos, y el segundo es el código de inicialización y los datos para ser desechados cuando ya no es necesario. La parte de inicialización tampoco se comparte entre espacios de direcciones la forma del núcleo es adecuado, así que cualquier cosa no se copia en el tenedor () si todavía está alrededor (que es en estas primeras fases de desarrollo).

he asignado una pequeña pila del núcleo de usar mientras se arranca, pero por lo que puedo ver, sólo puedo ponerlo o bien en la sección .bss donde se comparte entre los espacios de direcciones o en la zona de inicio en el que no se puede almacenar como datos sin inicializar. Me gustaría almacenarlo en la parte de inicio de la imagen como datos sin inicializar de manera que cada proceso tiene su propia copia.

Se me ocurren dos posibles formas de hacer esto, pero no he sido capaz de averiguar si son posibles o cómo iba a decirle al enlazador para hacerlas. La primera sería la de poner en regiones sin inicializar secciones no .bss, pero no estoy seguro de que sea posible- de que no creo que se puede mezclar secciones como eso. La segunda sería la creación de una segunda .bss similar a la sección que los datos sólo almacena sin inicializar, lo que podría poner en la patente de inicialización del script enlazador.

Algunas ideas? Para completar, aquí está el guión enlazador que estoy 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) }
}
¿Fue útil?

Solución

(uf, respondiendo a mi propia pregunta de nuevo)

Realización de una nueva sección sin las obras CONTENIDO atributos; se declaró en asamblea como esto:

.section .init.bss, "aw", @nobits
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top