第五章扩充内核后的代码部署小结


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--------保护模式中8 259A进行初始化的主函数
|   |-- 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赋值的接口函数中进行地址类型的显示转换。




你可能感兴趣的:(自己动手写操作系统,数据结构,include,汇编,c)