Сразу оговорюсь: речь идёт о встраиваемом ARM устройстве, но, думаю, ядро везде одинаково работает.
Железо: AT91RM9200, 64Мб ОЗУ, 8 Мб флэш. Загрузка происходит так: загрузчик вытаскивает из флэша образ ядра и initrd в оперативку. Ядро использует initrd как rootfs. Т.е. как на обычных компах, но нету последующего монтирования фс с жёсткого диска из-за отсутствия такового. Всё размещается в ОЗУ. Есть 2 рам-диска по 8 Мб. Один — initrd, как я понимаю, другой — /var/tmp. Система работает стабильно, после загрузки состояние оперативки такое:
# cat /proc/meminfo MemTotal: 62284 kB MemFree: 47344 kB Buffers: 8548 kB Cached: 2820 kB SwapCached: 0 kB Active: 3132 kB Inactive: 9068 kB HighTotal: 0 kB HighFree: 0 kB LowTotal: 62284 kB LowFree: 47344 kB SwapTotal: 0 kB SwapFree: 0 kB Dirty: 560 kB Writeback: 0 kB Mapped: 2112 kB Slab: 1756 kB CommitLimit: 31140 kB Committed_AS: 4180 kB PageTables: 128 kB VmallocTotal: 956416 kB VmallocUsed: 9688 kB VmallocChunk: 946172 kB
# mount rootfs on / type rootfs (rw) /dev/root on / type ext2 (rw) proc on /proc type proc (rw) sys on /sys type sysfs (rw) /dev/ram1 on /var/tmp type ext2 (rw) /dev/loop0 on /mnt/settings type ext2 (rw) # df -h /var/tmp Filesystem Size Used Available Use% Mounted on /dev/ram1 7.7M 464.0k 6.9M 6% /var/tmp
Т.е. оперативы достаточно.
Далее, загружаю файл через httpd+POST. Заголовки, добавленные httpd в файл вырезаются так:
tee|sed '1,4d'|sed '$d'|sed '$d'|sed '$d'|sed '$d'|sed '$d'|sed '$d' > /tmp/update.tar.gz
Unable to handle kernel paging request at virtual address 7a29ca23 pgd = c36bc000 [7a29ca23] *pgd=00000000 Internal error: Oops: 3 [#1] Modules linked in: CPU: 0 PC is at schedule+0x358/0x768 LR is at 0x15cc5b pc : [] lr : [<0015cc5b>] Not tainted sp : c3731e60 ip : 7a29c8cb fp : c3731e9c r10: c0d20a80 r9 : c3730000 r8 : c0c120a0 r7 : 00001000 r6 : c027ed08 r5 : c027ed08 r4 : c3346ca0 r3 : 0000022c r2 : 30000013 r1 : 30000093 r0 : a5b56e00 Flags: nzCV IRQs off FIQs on Mode SVC_32 Segment user Control: 317F Table: 236BC000 DAC: 00000015 Process sed (pid: 877, stack limit = 0xc3730198) Stack: (0xc3731e60 to 0xc3732000) ....
Не могу понять, почему 40 свободных мегабайт не хватает для обработки 4-х мегабайтного файла?
Последние комментарии
- OlegL, 17 декабря 2023 года в 15:00 → Перекличка 21
- REDkiy, 8 июня 2023 года в 9:09 → Как «замокать» файл для юниттеста в Python? 2
- fhunter, 29 ноября 2022 года в 2:09 → Проблема с NO_PUBKEY: как получить GPG-ключ и добавить его в базу apt? 6
- Иванн, 9 апреля 2022 года в 8:31 → Ассоциация РАСПО провела первое учредительное собрание 1
- Kiri11.ADV1, 7 марта 2021 года в 12:01 → Логи catalina.out в TomCat 9 в формате JSON 1
Не пробовал использовать ksymoops?
Забыл. Ядро 2.6.17.
Documentation/oops-tracing.txt говорит:
NOTE: ksymoops is useless on 2.6
Меня вот это смущает, stack превышает stack_limit.
Может, надо как-то этот лимит увеличить?
Я, честно, мало что понимаю в происходящем. Сейчас попробовал остановить всех демонов — файл нормально обработался, распаковался и даже md5 сошлось. Т.е. дело, видимо, в объеме оперативы. Непонятно то, что перед падением top показывал 37Мб свободных. После остановки демонов этот параметр не опускался ниже 40.
Как раз для тебя ссылка:) http://infocenter.arm.com/help/topic/com.arm.doc.dui0203f/DUI0203.pdf Думаю дело в размере стека, тут вроде что-то есть об этом. c3731e9c — fp больше stack_limit.
Я тут посмотрел на ARM стек вниз растет, значит это значение в пределах нормы.
А документик интересный, спасибо
После множества экспериментов подобрал более-менее рабочую конфигурацию:
ramdisk_size=8192
перед обработкой файла останавливаются все демоны
загружаемый файл не более 4Мб
Если в процессе загрузки-распаковки свободно более 37Мб оперативы, то всё нормально.
Попытка загрузить 6Мб:
Никак не понимаю, почему такого количества ОЗУ не достаточно…
Это вообще не нормально, что kernel падает из-за userspace. Это или баг железа или ядра. Попробуй более свежее ядро и как насчет ulimit?
Похоже, так и есть. Если сказать ядру mem=32M и не останавливать демонов, то в процессе загрузки файла оперативы остаётся 4-6М, но ничего не падает. Видимо, проблема в старших 32 мегабайтах. Теперь осталось выяснить причину…