总览
启动过后就是各个模块的初始化,具体包括以下内容(内存初始化一定在最前面,中断及其相关驱动保持前后关系,最后一个是init
进程的初始化,其余随意即可):
- 1、内存初始化
- 2、中断初始化(包括软件中断-系统调用)
- 3、字符设备、块设备缓冲区初始化
- 4、各类驱动初始化,注册中断号(磁盘,键盘,时钟等等)
- 5、文件系统初始化
- 6、调度器初始化
- 7、
init
进程初始化
初始化之后就是调度第一个进程使之进入用户态进行各类初始化。
内存初始化
内存初始化或者说内存管理涉及到几个部分:
- 1、启动时内存分配器
- 2、内存映射机制
- 3、内核态内存分配器
因为启动时候已经通过虚拟地址映射的,所以此时能访问的内存地址是有限的。先对这部分内存进行管理,为下一步内核态内存分配器和内存映射机制提供帮助。
内存映射有内核态和用户态的区别,前者为静态映射,后者为动态映射。在实际内存初始化的时候,只用到了静态映射,随之就可以开始内核态内存分配器的初始化了。
内存分配器
这部分是大块头,我就不多啰嗦,有兴趣的可以直接翻阅相关技术文章,比如linux
的buddy system
和slab/slub
,glibc
的ptmalloc2
等等。
比较常见的实现方式有:
- 1、空闲链表
- 2、内存池
具体实现
目前仅实现了buddy system
。主要原因是armv7中的二级页表依赖于16KB对齐的一级页表,不得不实现伙伴系统,如果是单纯的x86的二级页表方式,可以简单处理为固定大小链表形式。