(6)从零开始的操作系统开发日记

(听说这是个叫做日yue记geng的系列)

前言:因为各种各样怠惰的原因,博客一直没更,不是我懒啦,是因为后面的课程发现一节课下来记录的东西并不多,想要存起来一口气写,结果拖到了现在,嗯,肯定不是我偷懒喔(笑)

  1. lab2往后的eclipse配置要重新写,而且要参照lab1,给makefile添加all命令,真坑,居然前后不一。关于makefile这个大坑,后面详细说。

  2. lab3:
    find_vma(): if (!(vma != NULL && vma->vm_start <= addr && vma->vm_end > addr)) //(!(vma非空&&addr在vma的范围内)) 即vma不合法时

  3. lab4:课上提起过写时复制,但是实现起来正如课上所说的怎么处理被换出的页的代码指向的部分已经被修改过这个问题,我暂时还没有查阅相关资料。
    idleproc内核线程是在ucore操作系统没有其他内核线程可执行的情况下才会被调用
    tf:中断帧的指针,总是指向内核栈的某个位置:当进程从用户空间跳到内核空间时,中断帧记录了进程在被中断前的状态。当内核需要跳回用户空间时,需要调整中断帧以恢复让进程继续执行的各寄存器值。除此之外,uCore内核允许嵌套中断。因此为了保证嵌套中断发生时tf 总是能够指向当前的trapframe,uCore 在内核栈上维护了 tf 的链,可以参考trap.c::trap函数做进一步的了解。
    uCore在创建进程时分配了 2 个连续的物理页(参见memlayout.h中KSTACKSIZE的定义)作为内核栈的空间。这个栈很小,所以内核中的代码应该尽可能的紧凑,并且避免在栈上分配大的数据结构,以免栈溢出,导致系统崩溃。

  4. lab5:内核被映射到高端地址,程序在低端,0xC000000以下
    fork实现两种返回值:父进程返回子进程ID,子进程在创建的时候,把保存返回值的eax设置为0,从而实现不同的返回值
    cow:对共享空间设置成只读,在试图写的时候产生中断,复制一页内存,并同时将两个页修改成R/W,如果要考虑到换页,会超级复杂

  5. lab7:monitor.next_count:发出条件变量signal操作的线程的个数

  6. 关于调试:
    简直就是个大坑啊!!!!至今没搞懂为啥断点会在kern_init停不下来,在其他地方倒可以,个人猜测可能是缺少了调试信息,但是我对比过输出的编译配置,跟其他的.c没有什么区别。其次就是很迷的不知道为何非得要手动加载调试信息kernel,不能写在eclipse的debug command或者写在文本里,还要手动加断点,好谜啊!
    至于makefile,需要自己手动添加用于eclipse调试的一些语句,比如启动qemu然后等待链接gdb的语句(可以直接copy qemu命令的前半部分),上面也提过要自己加上all,方便eclipse去构建,在课程提供的Q&A资料里,有提到过说一些很特别的情况会导致qemu不能下断点,我不知道是不是只有自己是这样,或者我可以试试用bochs

课程的lab和视频就暂时到这里,课程到了后面的部分不算特别的难(加上我在此之前已经上过操作系统课),如果只是为了完成lab的话几乎就是翻译代码,而且还是人家写好流程给你告诉你用那些函数去做的那种。但是很多地方还没有完全彻底地搞懂,现在也犹豫着有没有这个时间和精力去修改ucore来达到课程设计的要求。如果要这么做的话,至少要实现一个内存管理算法,图形用户界面,FAT32磁盘管理,任务调度算法。尤其是图形用户界面和FAT32,涉及到硬件方面,而且不像其他两样ucore本身提供了很方便的框架(也可能是因为目前我对lab8里的设备IO和磁盘IO还没有足够认识),总之先继续下去再说吧orz

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值