十一. 线程同步 发表于 2018-04-30 | 更新于 2018-12-09 | 分类于 kernel 乱序输出前面完成了多线程之后,那么肯定会涉及到线程的同步问题。因为线程的执行是随机的,乱序的。虽然我们这个小kernel实现的调度器算法比较简陋,它的随机性没那么强,但是每次进行线程切换的时候,还是有可能产生问题。并且问题已经产生了。 1234567891011121314151617181920 ... 阅读全文 »
十. 内核线程 发表于 2018-04-30 | 更新于 2018-12-09 | 分类于 kernel 实现线程函数观察一下这段c语言代码 123456789101112void threadFunc(void *arg){ printf("thread function\n");}int main(){ printf("main function\n"); _begi ... 阅读全文 »
九. 内核的内存分配 发表于 2018-04-25 | 更新于 2018-12-09 | 分类于 kernel 前面已经准备好了内存池,这里就要正式实现内存的分配了。因为到目前为止,还没有用户进程,所以这里只实现内核中的动态内存分配。 内存分配的过程如下: 在虚拟内存池中申请n个虚拟页 在物理内存池中分配物理页 在页表中添加虚拟地址与物理地址的映射关系 接下来就是一步步完成这三步 申请虚拟页1234567 ... 阅读全文 »
八. 内存池规划 发表于 2018-04-23 | 更新于 2018-12-09 | 分类于 kernel bitmap简介计算机中一些资源的数量非常庞大,比如内存容量和硬盘容量。为了使用这些资源,必须涉及到一套管理这些资源的方法,而方法中必须要构建数据结构来存储管理数据,这些数据本身也是需要占用内存的 计算机中最小的单位是位,那么用一组二进制位串来管理其他单位大小的资源是很自然的,这组二进制位中的每一位 ... 阅读全文 »
从零开始,打造自己的STL(七、queue) 发表于 2018-04-22 | 更新于 2018-12-09 | 分类于 STL 这一部分内容是关于队列的内容,它也是一个容器适配器,只是对deque接口的简单调用,deque在前面已将有了详细的介绍,这里就不过多说明。 在队列之后还有一个容器适配器,优先队列,因为优先队列涉及到堆排序,准备放到后面讲所有容器介绍完了之后再来介绍 下面直接上queue的代码 12345678910 ... 阅读全文 »
从零开始,打造自己的STL(六、stack) 发表于 2018-04-22 | 更新于 2018-12-09 | 分类于 STL 前面一章中介绍了deque,除了 C++11 标准中的 array 和 forward_list 之外,序列式容器就已经全部介绍完了,这一部分开始就准备介绍容器适配器。容器适配器相较于容器来说,更加的简单。因为容器适配器里面所有的接口都是对容器内部方法的调用。可以把他们之间的关系当成组合关系。 12 ... 阅读全文 »
七. 中断 发表于 2018-04-22 | 更新于 2018-12-09 | 分类于 kernel 简介中断是指CPU获知了计算机中发生的某些事,CPU暂停正在执行的程序,转而去执行处理该事件的程序,当这段程序执行完了之后,CPU继续执行刚才的程序。 通过中断可以极大的提高CPU的执行效率,如果没有中断,在处理器与外部设备通信时,他必须在向该设备发送指令后进入忙等待,反复轮询该设备是否就绪,这样就 ... 阅读全文 »
六. 函数调用约定与系统调用 发表于 2018-04-22 | 更新于 2018-12-09 | 分类于 kernel 函数调用约定调用约定从字面上理解,他是调用函数的一套约定。主要体现在一下三个方面 参数的传递方式,参数是存放在寄存器中还是栈中 参数的传递顺序,是从左到右传递还是从右到左传递 是调用者保存寄存器环境还是被调用者保存 在进行函数调用的时候,函数所需要传递的参数往往是不固定的。在计算机中并没有专门储 ... 阅读全文 »
五. 开启分页机制 发表于 2018-04-22 | 更新于 2018-12-09 | 分类于 kernel 为什么有进行内存分页目前我们的小kernel还一直在分段机制下工作,因为还只有一个loader在内存中跑,所以不会出现内存不足的问题。假如说此时未开启分页功能,而物理内存空间又不足了,如下图 此时进程C想要执行,但是内存空间已经不足。要么就等待进程A或者进程B执行完成,这样就有连续的内存空间了。要 ... 阅读全文 »
四. 获取内存容量 发表于 2018-04-17 | 更新于 2018-12-09 | 分类于 kernel 前言在前面一篇文章中介绍了进入保护模式的方法: 打开A20 加载gdt 将控制寄存器cr0的pe位置1通过这三步成功的进入到保护模式下,但是在进入保护模式之前,还需要对进行内存的检测工作,启动分页机制等等,最后还要将内核加载到内存当中。这些是之前没有完成的,接下来就要完成这些进入到保护模式之前的准 ... 阅读全文 »