【发布时间】:2011-09-26 08:59:22
【问题描述】:
最近我拿起了我的一个旧项目并重新启动它,几乎是从头开始。 我已经病了一段时间,所以我有时间努力打击并实现大量功能。然而,我觉得实现一个好主意的一件事是模块加载。我想做内核模式动态加载模块。
modules这个词有点含糊,正确的说法是加载库,例如C library的小型实现内核模式 驱动程序或标准的东西,例如 IRQ 0 和 1 上的 PIT 和 键盘。我试图实现的方法有点自我维持;在我的内核将加载的模块方面,将在内核本身中用于进入用户模式。
例如,我的内核使用了我自己实现的 C 库中的极少数函数。这些函数本身用于设置我的 GDT、IDT、IRQ、ISR 等。我想将这些函数抽象为内核可以加载和使用的库。这意味着内核本身将需要在第一阶段加载模块,然后再进行任何设置。
现在,我自己想到了几种方法来做到这一点,例如向这个库添加一个结构,其中包含一个函数指针表,这些函数指针分配了库本身中函数的地址。将库编译为 aout-kludge 文件,将库作为 void * 加载到内核中(这没关系,因为我有一个工作分配器),然后弄清楚结构的偏移量,如此多地进入 void 指针,并在内核中重新创建结构。这听起来好像行不通,因为需要分配函数指针表,这意味着库本身中需要有一个初始化函数。就算我知道地址怎么称呼?
我对如何实现这样的加载程序一无所知,这是否值得?我想尽可能多地抽象,我的内核具有模块化设计。我也确实希望用这种方法加载驱动程序和其他东西,我只是不确定我将如何实现它。我已经尝试了各种方法,但都失败了。我该怎么办?
【问题讨论】: