咸鱼白的窝
一些奇奇怪怪的东西
自制系统Blanca-OS记录(持续更新)

2020.02.25

loader在加载内核文件到内存的时候出现莫名错误,表现为无法对某部分内存进行操作。起初排查认为是640KB以上至4GB的内存都无法写入,复查gdt表以及ds寄存器确认所选择的数据段覆盖了0-4GB范围,可读可写,经过十几小时的苦恼之后,终于尝试出1MB以上的内存可写入,而之前无法写入主要是因为我采用了640KB出头的内存区域及0xc0001500进行尝试,前者属于BIOS扩展区,无法写入,后者超出了我所设置的虚拟机的总内存32MB,属于不存在的区域,其实至今出现的很多莫名错误本质上都是小问题,但总会因为自己的粗心失误造成大量的时间损失。


2020.03.01

昨天把后面经常要用到的string库基本完成了,个别函数仍在选择更优的算法实现(原谅我的强迫症),今天正在看内核调试相关的资料,这几天准备完成printk函数及打印内核调用栈的debug函数。


2020.03.03

为了后续更方便的构造内核并写入虚拟机,选择使用makefile,研究了一晚上makefile的语法,写得我头大,不过初步有了头绪,刚刚在床上躺了一小时之后决定爬起来继续研究makefile,现在已经过零点了,确切的说现在已经是3月4号了(哭)。计组原理实验课后面还要造cpu,看来这学期是要忙死了。


2020.03.04

凌晨在@geno@rise二位大佬的指点下,弄明白了makefile中折腾了我一晚上的问题,白天起床后边上网课边把项目的makefile基本写好了(我居然还是和老师互动最积极的学生。。你永远不知道上网课的学术在干什么.jpg),后续随着项目的进展还会继续调整makefile,短期之内是不用再为这玩意伤神了,继续投入精力去完成printk函数。


2020.03.05

添加了printk函数的vga支持(扩展内联汇编实属可怕,幸好目前用这玩意写的代码没几行),简易版的printk函数基本完成,后续可能根据需求进一步添加功能支持,但今天还没来得及对printk函数进行完备的测试,明天会测试一下修修bug,周末尽可能地搞定debug函数,下周估计就要开始给内核添加中断功能了。


2020.03.06

今天测试了之后发现,写代码的过程中粗心写的bug还是很多的,除了printk相关的函数之外,makefile以及之前以为完全搞定的loader中也出现了点小bug,历时4个多小时,终于彻底搞定了printk函数的功能,一级残废内核Blanca-OS终于会开口说话了(笑),明天可能下乡一趟,回来之后再开始写debug函数,继续加油!btw,光靠bochs调试汇编代码还是太麻烦了,这两天捣鼓看看能不能把bochs和gdb连接到一起,直接在内核中用gdb调试c代码。


2020.03.11

debug这块思路基本理顺了,大体上各块功能差不多搞定了,最后的整合到打印调用栈这块还在思考,暂时决定等到写内存管理的时候一起完成,现在先跳过去把中断这块研究明白。这学期上网课真的好烦啊,各种群,各种平台,没完没了的作业。。。以及无力吐槽的辣鸡培养方案,这大学教育就很离谱。


2020.03.19

开学之后各种各样的事情多得离谱,写OS的时间都被挤得不剩啥了(说着突然想起来毛概作业要ddl了。。佛),不过好歹这几天把中断这块全理清了,预计本周末能把中断功能全部实现,下周向内存管理进军,冲鸭!


2020.03.22

昨天搞定了中断功能,今天添加了计时器,并在中断的基础上测试了一下计时器,完全OK,今晚写一下assert和panic函数,明天应该就能正式开始内存管理器这块了,emmmm,debug还晾在那。。。带着一起搞搞看吧,搞不定就先继续晾着(实惨)。内存管理这块,因为之前做csapp的malloc lab有一点经验了,应该能很快搞定吧,争取在三月结束前搞定!

睡觉前再次更新一下,assert和panic函数都添加好了。以及之前debug相关功能有些bug(主要指那个链接脚本),暂时把debug相关的代码注释了。


2020.03.26

这两天一直在研究内存管理方面的算法,最后决定参考linux使用buddy算法加slab算法,目前刚写了个物理内存初始化的功能,昨天研究别人写的内核源码时被volatile和原子操作绕了进去(其实这两者没有关系),研究了一晚上,终于搞清楚来龙去脉了,后面可能写个博客记录一下。


2020.03.28

最近上课都在研究内核,课程落下不少,感觉这学期期末绩点,危!这两天结合了hurlex的源码以及linux2.6.11的源码(linux2.6.11的源码也太复杂了叭!一行行扒函数功能理依赖关系给我整哭辽也不过借鉴了个皮毛)整了下物理页结构体数组的初始化功能。附上目前的内存分布图(纯手打的图,丑哭了,以后可能补上真图):



——————————————
|            |
|ZONE_HIGHMEM|
|            |
——————————————  <--3GB+896MB
|	     |
|内核可用物理页|
|            |
——————————————  <--pmm_addr_start
|            |
|  物理页数组  |
|            |
—————————————  <--p_pages
|	     |
|  内核镜像   |
|            |
——————————————  <--3GB+1MB
|            |
——————————————  <--3GB
|            |
|   用户空间  | 
|            |
——————————————


2020.04.02

基本搞定了物理内存管理的部分,阅读hurlex前辈的源码时发现了free函数中似乎有bug(还是很怀疑自我的,毕竟hurlex前辈的源码中写了测试功能,应该不会出这种问题的啊。。),纠结了一晚上,自己又写了将近一百行测试代码模拟了一下那段free函数的内存切割释放过程,最终基本肯定自己的想法是对的,fork,commit,push,pull request,一顿操作猛如虎,一看战力只有5,233,在线卑微,不过认真读读别人源码还是很爽的。


2020.04.20

有两周没更新记录了,主要是对内核空间和用户空间内存管理的分割有些许纠结,暂时是先抛开了用户空间的考量,后期再进行完善吧。这两天主要是在研究线程与进程的实现,目前有两种方案,一种是像早期linux一样,没有线程的概念,一切都归为任务,另一种是实现线程机制,然后基于此实现进程(任务)机制,还不确定选用哪种,参考了四份OS的源码,感觉虽然是两种方案,但大家总体的设计思路还是比较相近的。


2020.04.26

线程机制的总体设计基本厘情了(花的时间略长,最近事太多了,五一假期结束还有期中考试,太难顶了),明天差不多能把基本结构方面的代码搞定,还有调度要等到进程实现之后才写。


2020.05.05

线程以及锁这块搞定了,准备实现完键盘驱动就去搞进程那块,最近和朋友以及学长交流得知这个OS可以作为毕业设计,所以开始在博客里同步更新各个模块的设计与实现方法,准备到大四的时候可以直接整合成一篇毕业论文,以后主要的记录都是更详细的分模块的博文,大概这篇零散记录的博文不会频繁更新了。


Last modified on 2020-02-29