Недавно я взял один из моих старых проектов и перезапустил его, практически с нуля.Некоторое время я болел, поэтому у меня было время, чтобы жестко расправиться и реализовать массу функций.Однако одна вещь, которую я считаю хорошей идеей для реализации, это загрузка модулей.Я хочу сделать режим ядра динамическая загрузка модулей.
Слово modules немного двусмысленно, правильный термин будет просто для загрузки библиотек, таких какминиатюрная реализация библиотеки C для режима ядра драйверов или стандартных вещей, таких как PIT и клавиатура , которые находятся на IRQ 0& 1 .Метод, которого я пытаюсь достичь, немного самодостаточен;в том аспекте, что модули, которые будет загружать мое ядро, будут использоваться в самом ядре для перехода в режим пользователя .
В качестве примера, мое ядро использует очень мало функций из библиотеки C, который я реализовал сам.Эти функции сами используются при настройке моих GDT, IDT, IRQ, ISR и т. Д. И т. Д. Я хотел бы абстрагировать эти функции в библиотеку, которую ядро может загружать и использовать.Это означает, что само ядро потребует загрузки модуля на самом первом этапе, прежде чем что-либо будет установлено.
Теперь я подумал о нескольких способах сделать это сам, таких как добавление структуры в эту библиотеку с помощьютаблица указателей функций, которым присваивается адрес функций в самой библиотеке.Компилируем библиотеку как файл aout-kludge , загружаем библиотеку в ядро как void * (что нормально, так как у меня есть рабочий распределитель), а затем вычисляем смещениеструктуры, заходя в void указатель, и воссоздавая структуру в ядре.Это не похоже на работу, так как необходимо назначить таблицу указателей функций, что означает, что в самой библиотеке должна быть функция инициализации.Как это будет называться, даже если бы я знал адрес?
Я не знаю, как мне реализовать такой загрузчик, и стоит ли оно того?Я хочу абстрагироваться, насколько это возможно, мое ядро имеет модульную конструкцию.Я также рассчитываю загрузить драйверы и другие вещи с помощью этого метода, я просто не уверен, как бы это реализовать.Я уже пробовал различные методы, и все они потерпели неудачу.Что мне делать?