Раздел неинициализированных данных не .bss - PullRequest
3 голосов
/ 24 ноября 2010

Я использую собственный скрипт компоновщика, чтобы разделить образ ядра на две части. Первый - это обычный код и данные, а второй - код инициализации и данные, которые следует отбрасывать, когда они больше не нужны. Часть инициализации также не разделяется между адресными пространствами, как собственно ядро, поэтому все, что там, копируется в fork (), если оно все еще существует (это находится на этих ранних стадиях разработки).

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

Я могу подумать о двух возможных способах сделать это, но я не смог выяснить, возможны ли они, или как я бы сказал компоновщику сделать это. Первым было бы поместить неинициализированные области в разделы, отличные от .bss, но я не уверен, что это возможно - я не думаю, что вы можете смешивать такие разделы. Вторым было бы создать второй .bss-подобный раздел, в котором хранятся только неинициализированные данные, которые я мог бы вставить в патч инициализации сценария компоновщика.

Есть идеи? Для полноты вот сценарий компоновщика, который я использую:

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) }
}

1 Ответ

3 голосов
/ 25 ноября 2010

(тьфу, отвечая на мой собственный вопрос снова)

Создание нового раздела без атрибута CONTENTS работает;это объявлено в сборке как это:

.section .init.bss, "aw", @nobits
...