Pull to refresh

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 мегабайта.

В 16МБ не грузится, идёт оверлап, пока не разбирался.

Sign up to leave a comment.

Articles