ot
| |-- boot.asm
| |-- include
| | |-- fat12hdr.inc
| | |-- load.inc
| | `-- pm.inc
| `-- loader.asm
|-- include-------------C的inlcude文件
| |-- const.h----------放置一些离散地常量(找不到家地常量)
| |-- global.h--------真正出现地全局数据区,这里使用预处理只在global.c中,对其进行定义其他文件中使用extern只对其使用声明。
| |-- protect.h-------protect.c中要用到的一些数据结构和宏
| |-- proto.h---------一些公有函数的声明
| |-- string.h---------存放memcpy
| `-- type.h-----------使用typedef定义地一些新的类型
|-- kernel
| |-- global.c--------全局地数据区
| |-- i8259.c--------保护模式中8259A进行初始化的主函数
| |-- kernel.asm---Gdt的切换/中断处理程序须使用汇编编写地那部分/并调用初始化函数
| |-- protect.c------对保护模式下一些需要地信息进行初始化地主函数//////一些保护模式下必须地函数
| `-- start.c---------进行Gdt和Idt的挪位和初始化并调用protect.c中地函数初始化,Idt的信息和8259A的信息。
`-- lib
|-- kliba.asm----kernel使用地ams代码的库函数
|-- klib.c----------kernel使用的c代码地库函数
`-- string.asm---memcpy
C知识:
- define和macro在一次编译生成.o文件只能有一次定义,因此在头文件的时候需使用#ifndef等预处理命令进行控制,而函数声明和引用全局变量声明是可以有多次的。
- 在C中Gate的offset,这个地址其实就是中断处理函数的的函数名。在asm中因为没有什么变量的概念也不进行类型检查,所以没那么多的限制。可是c中有类型检查
所以在函数名赋值给offset的过程中,需要先用一个函数指针来接收这个值,在Gate赋值的接口函数中进行地址类型的显示转换。