Comments 3
Спасибо за статьи.
Поправил код по-простому, чтобы запускать с любым адресом ядра и размером памяти. Грузится и работает в 20МБ.
Должно быть, и это не предел :)
Файл kernel/kernel после сборки с отладочной информацией занимает 258Кб. Секции кода и данных занимают 135Кб.
$ objdump -h kernel/kernel | less
kernel/kernel: file format elf64-little
Sections:
Idx Name Size VMA LMA File off Algn
0 .text 00008000 0000000080000000 0000000080000000 00001000 2**4
CONTENTS, ALLOC, LOAD, READONLY, CODE
1 .rodata 00000840 0000000080008000 0000000080008000 00009000 2**3
CONTENTS, ALLOC, LOAD, READONLY, DATA
2 .data 00000044 0000000080008840 0000000080008840 00009840 2**3
CONTENTS, ALLOC, LOAD, DATA
3 .got 00000010 0000000080008888 0000000080008888 00009888 2**3
CONTENTS, ALLOC, LOAD, DATA
4 .got.plt 00000010 0000000080008898 0000000080008898 00009898 2**3
CONTENTS, ALLOC, LOAD, DATA
5 .bss 000194b0 00000000800088b0 00000000800088b0 000098a8 2**4
ALLOC
6 .riscv.attributes 00000057 0000000000000000 0000000000000000 000098a8 2**0
CONTENTS, READONLY
7 .comment 0000001f 0000000000000000 0000000000000000 000098ff 2**0
CONTENTS, READONLY
8 .debug_info 00012748 0000000000000000 0000000000000000 0000991e 2**0
CONTENTS, READONLY, DEBUGGING, OCTETS
...
echo 'obase=10;ibase=16; 8000 + 0840 + 44 + 10 + 10 + 0194B0' | bc
138580
Стек процесса требует 2 страницы памяти, NPROC=64
, итого 64 * 4 * 2 = 512
Кб.
Каждый процессор выполняет поток планировщика - еще 8Кб на каждый.
$ objdump -h user/_sh
user/_sh: file format elf64-little
Sections:
Idx Name Size VMA LMA File off Algn
0 .text 000012fc 0000000000000000 0000000000000000 00001000 2**1
CONTENTS, ALLOC, LOAD, READONLY, CODE
1 .rodata 00000d00 0000000000001300 0000000000001300 00002300 2**3
CONTENTS, ALLOC, LOAD, READONLY, DATA
2 .data 00000010 0000000000002000 0000000000002000 00003000 2**3
CONTENTS, ALLOC, LOAD, DATA
3 .bss 00000088 0000000000002010 0000000000002010 00003010 2**3
ALLOC
4 .debug_info 000025ad 0000000000000000 0000000000000000 00003010 2**0
CONTENTS, READONLY, DEBUGGING, OCTETS
...
echo 'obase=10;ibase=16; 12FC + 0D00 + 10 + 88' | bc
8340
Программа sh занимает 8 КБ памяти. Init - еще меньше.
$ objdump -h user/_init
user/_init: file format elf64-little
Sections:
Idx Name Size VMA LMA File off Algn
0 .text 00000884 0000000000000000 0000000000000000 00001000 2**1
CONTENTS, ALLOC, LOAD, READONLY, CODE
1 .rodata 00000778 0000000000000888 0000000000000888 00001888 2**3
CONTENTS, ALLOC, LOAD, READONLY, DATA
2 .data 00000010 0000000000001000 0000000000001000 00002000 2**3
CONTENTS, ALLOC, LOAD, DATA
3 .bss 00000020 0000000000001010 0000000000001010 00002010 2**3
ALLOC
4 .debug_info 0000117e 0000000000000000 0000000000000000 00002010 2**0
CONTENTS, READONLY, DEBUGGING, OCTETS
...
echo 'obase=10;ibase=16; 0884 + 0778 + 10 + 20' | bc
4140
Итого: 135 + 512 + 8 * 3 + 8 + 4 = 683
Кб. Меньше 1 мегабайта.
Sign up to leave a comment.
Драйвер Ethernet для xv6