Довел я наконец управление памятью до состояния, когда все работает вполне устойчиво. Система успешно стартует в многопользовательском режиме. Из сетевых интерфейсов, правда, имеется только lo0, да и тот почему-то не пингуется. Надо разбираться.
Чтобы заработали утилиты статуса и статистики (примеры здесь), пришлось провести одну существенную доработку. Традиционно программа пользователя получает данные из памяти ядра, читая устройство /dev/kmem. Но надо знать адреса, для этого считывается таблица символов ядреного бинарника /vmunix. Проблема в том, что во встроенной системе ядро не лежит в файловой системе, а записано в flash-память микроконтроллера, и ни таблицы символов там нет, ни доступа к нему в любом случае.
Но есть простое и эффективное решение: запрашивать адреса символов у самого ядра, тем более что список нужных имен довольно ограниченный. Для этого достаточно расширить стандартный системный вызов sysctl() нужными кодами операций. Все удовольствие - несколько десятков строчек кода в ядре. В машинно-зависимой части, конечно.
( Листинг загрузки )
Чтобы заработали утилиты статуса и статистики (примеры здесь), пришлось провести одну существенную доработку. Традиционно программа пользователя получает данные из памяти ядра, читая устройство /dev/kmem. Но надо знать адреса, для этого считывается таблица символов ядреного бинарника /vmunix. Проблема в том, что во встроенной системе ядро не лежит в файловой системе, а записано в flash-память микроконтроллера, и ни таблицы символов там нет, ни доступа к нему в любом случае.
Но есть простое и эффективное решение: запрашивать адреса символов у самого ядра, тем более что список нужных имен довольно ограниченный. Для этого достаточно расширить стандартный системный вызов sysctl() нужными кодами операций. Все удовольствие - несколько десятков строчек кода в ядре. В машинно-зависимой части, конечно.
( Листинг загрузки )
