FreeNOS简介:
FreeNOS是github上一个开源项目,该项目是用C++写的一个操作系统微内核,各种宏内核中的服务作为一个独立的services在微内核中,基于消息的通信方式,该项目代码风格良好,完全基于面向对象,还有常见的设计模式,良好的注释,doxygen,scons。对深入理解操作系统以及代码习惯风格的养成很有帮助。
关于如何看:
-
通读:建议参照文档查看,附文档地址: http://www.freenos.org/doxygen/
-
详读:从FreeNOS/kernel/intel/pc/Main.cpp开始看(不要太关注如何装载内核等等,更多的关注代码风格,常用函数实现等等)
根目录下文件含义
- bin文件夹:封装的是一些常用命令,如ls、cat等等,想让内核运行成功,再细看这些功能的实现。
- config文件夹:配置文件。
- kernel文件夹:重中之重,内核文件,从这里开始看。
- lib文件夹:标准库,分配器、仿真库、posix标准等等;知道文件实现了哪些功能,然后了解相关函数接口,有空回头详细看,由整体到部分的过程。
- server文件夹:提供相应的服务,网络、序列化、终端等等,还没仔细看…
- support文件夹:工具依赖,doxygen与scons。
1、Main.cpp:
- 初始化堆Kernel::heap()函数,启动内核调试串行控制台(生成IntelSerial对象,调用setMinimumLogLevel()函数),构造函数(constructors()),创建并运行内核(生成IntelKernel()对象,运行run()函数)
2、Kernel类(继承于单例类):类API,分体式分配器,int控制器,计时器
-
数据结构:CPU状态
-
所包含的函数:中断处理程序,中断钩子处理,内核堆,获取物理内存分配器,获取进程管理,API,获取内存上下文,获取核心信息,获取计时器,执行run(),硬件中断处理,函数挂接处理硬件中断,执行中断处理程序,装载boot镜像,装载boot程序。
3、InterKernel类继承于Kernel类:
- 功能:X86兼容,Intel内核陷阱(trap),执行内核陷阱,CPU检测到故障时调用,系统时钟中断处理程序,实例PIT计时器,实例APIC,实例PIC。
4、Allocator类:(分配器)分配器地址对齐,子类:BitAllocator,BubbleAllocator,PageAllocator,PoolAllocator,
SplitAllocator。
涉及的部分C++知识:
1、纯虚函数与虚函数:
-
虚函数:父类中提供虚函数的实现,为子类提供默认的实现,子类可以重写父类中的虚函数。
-
纯虚函数:C++中包含纯虚函数的类称之为"抽象类",父类不提供实现,由子类实现。
2、虚构函数:
-
虚构函数在以下三种情况时,会被调用:(1)实例化对象的生命周期结束销毁时。(2)delete指向对象的指针时,或delete指向对象的基类类型指针,而其基类虚构函数是虚函数时。(3)对象i是对象o的成员,o的析构函数被调用时,对象i的析构函数也被调用。
-
虚函数的调用顺序是子类先调用,父类后调用,多继承时,后继承的先调用。
-
如果父类的析构函数不加virtual关键字 :子类继承父类,父类的指针指向子类时,delete掉父类的指针,只调动父类的析构函数,而不调动子类的析构函数。 如果父类的析构函数加virtual关键字 :子类继承父类,父类的指针指向子类时,delete掉父类的指针,先调动子类的析构函数,再调动父类的析构函数。
-
注:若类中存在成员变量类时,会先调用该类的的析构函数,然后再接着调用成员变量类的析构函数。
3、可以直接使用"类名.静态成员名"访问此静态成员,因为静态成员存在于内存,非静态成员需要实例化才会分配内存。
学习出现的知识点部分地址
- C++设计模式:https://blog.csdn.net/zxh2075/article/details/80164113
- include文件尽量使用绝对路径原因:https://www.cnblogs.com/cbryge/p/6201847.html
- doxygen使用:https://www.cnblogs.com/jiayy/p/3447995.html
- 解决问题:https://stackoverflow.com/
- 堆管理:https://blog.csdn.net/roger_ranger/article/details/78893000
- 使用sed替换项目目录下指定字符串:https://mp.csdn.net/postedit/87872260
未完待续~(这个工程还是有点大)