vak: (Default)
Serge Vakulenko ([personal profile] vak) wrote2019-11-02 02:02 pm

Сборка ядра Линукса на 32 мегабайтах памяти

У меня две платы с микроконтроллером pic32mz-da: на одной 128 мегабайт памяти, на другой 32 мегабайта. На обеих установлен Debian. В прошлый раз я тестировал плату 128Мбайт, собирая ядро Linux на ней самой. Процесс занял 10 часов 24 минуты.

Теперь я повторил ровно ту же сборку ядра на плате 32Мбайт. Удивительно, но сборка успешно завершилась, хотя процесс и длился в два с половиной раза дольше: 26 часов 25 минут. Слишком мало памяти для компилятора, чересчур много пейджинга. Но операционная система выстояла под нагрузкой, что вполне неплохо.
# time make
HOSTCC scripts/basic/fixdep
HOSTCC arch/mips/tools/elf-entry
HOSTCC arch/mips/boot/tools/relocs_32.o
...
CC [M] lib/zlib_inflate/zlib_inflate.mod.o
LD [M] lib/zlib_inflate/zlib_inflate.ko
OBJCOPY arch/mips/boot/vmlinux.bin

real 1585m35.195s
user 597m0.560s
sys 136m33.740s
Фактически из имеющихся 32 Мбайт RAM для пользовательских программ остаются доступными только 12 мегабайт. Остальное съедают ядро, буфера обмена и компоненты systemd. Смотрите на колонку RSS: Resident Set Size, то есть фактически занимаемое количество памяти:
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root 1 0.0 10.3 10064 2868 ? Ss Nov01 0:51 /sbin/init
root 48 0.0 6.6 16488 1840 ? Ss Nov01 0:13 /lib/systemd/systemd-journald
root 157 0.0 4.7 7872 1320 ? Ss Nov01 0:08 /lib/systemd/systemd-logind
root 434 0.0 4.1 7408 1136 ? Ss Nov01 0:00 /sbin/dhclient
message+ 158 0.0 2.7 6884 756 ? Ss Nov01 0:02 /usr/bin/dbus-daemon
root 166 0.0 2.7 23244 756 ? Ssl Nov01 0:02 /usr/sbin/rsyslogd
root 155 0.0 1.5 5644 424 ? Ss Nov01 0:12 /usr/sbin/cron
root 61 0.0 1.1 13132 304 ? Ss Nov01 0:05 /lib/systemd/systemd-udevd
На самом деле, 12 мегабайт это не так уж мало. Особенно в мире микроконтроллеров, где и 1 мегабайт RAM редко достигается. Просто уж больно толстую операционную систему мы сюда взгромоздили. Но ничего, вполне работает.

Возможно, другие линуксы будут более подходящими для микроконтроллеров. Скажем Void Linux, где вместо systemd применяется компактный runit, а вместо dpkg/apt - шустрый xbps.