项目组成

  1. ├── boot
  2. ├── kern
  3. ├── debug
  4. ├── driver
  5. ├── fs
  6. ├── init
  7. ├── init.c
  8. └── ...
  9. ├── libs
  10. ├── rb\_tree.c
  11. ├── rb\_tree.h
  12. └── ...
  13. ├── mm
  14. ├── kmalloc.c
  15. ├── kmalloc.h
  16. ├── memlayout.h
  17. ├── pmm.c
  18. ├── pmm.h
  19. ├── swap.c
  20. ├── vmm.c
  21. └── ...
  22. ├── process
  23. ├── entry.S
  24. ├── proc.c
  25. ├── proc.h
  26. └── switch.S
  27. ├── schedule
  28. ├── sched.c
  29. └── sched.h
  30. ├── sync
  31. └── sync.h
  32. └── trap
  33. ├── trapentry.S
  34. └── ...
  35. ├── libs
  36. ├── hash.c
  37. ├── stdlib.h
  38. ├── unistd.h
  39. └── ...
  40. ├── Makefile
  41. └── tools

相对与实验三,实验四中主要改动如下:

  • kern/process/ (新增进程管理相关文件)

    • proc.[ch]:新增:实现进程、线程相关功能,包括:创建进程/线程,初始化进程/线程,处理进程/线程退出等功能
    • entry.S:新增:内核线程入口函数kernel_thread_entry的实现
    • switch.S:新增:上下文切换,利用堆栈保存、恢复进程上下文
  • kern/init/

    • init.c:修改:完成进程系统初始化,并在内核初始化后切入idle进程
  • kern/mm/ (基本上与本次实验没有太直接的联系,了解kmalloc和kfree如何使用即可)

    • kmalloc.[ch]:新增:定义和实现了新的kmalloc/kfree函数。具体实现是基于slab分配的简化算法 (只要求会调用这两个函数即可)
    • memlayout.h:增加slab物理内存分配相关的定义与宏 (可不用理会)。
    • pmm.[ch]:修改:在pmm.c中添加了调用kmalloc_init函数,取消了老的kmalloc/kfree的实现;在pmm.h中取消了老的kmalloc/kfree的定义
    • swap.c:修改:取消了用于check的Line 185的执行
    • vmm.c:修改:调用新的kmalloc/kfree
  • kern/trap/

    • trapentry.S:增加了汇编写的函数forkrets,用于do_fork调用的返回处理。
  • kern/schedule/

    • sched.[ch]:新增:实现FIFO策略的进程调度
  • kern/libs

    • rb_tree.[ch]:新增:实现红黑树,被slab分配的简化算法使用(可不用理会)

编译执行

编译并运行代码的命令如下:

  1. make
  2. make qemu

则可以得到如下的显示内容(仅供参考,不是标准答案输出)

  1. (THU.CST) os is loading ...
  2. Special kernel symbols:
  3. entry 0xc010002a (phys)
  4. etext 0xc010a708 (phys)
  5. edata 0xc0127ae0 (phys)
  6. end 0xc012ad58 (phys)
  7. ...
  8. ++ setup timer interrupts
  9. this initproc, pid = 1, name = "init"
  10. To U: "Hello world!!".
  11. To U: "en.., Bye, Bye. :)"
  12. kernel panic at kern/process/proc.c:354:
  13. process exit!!.
  14. Welcome to the kernel debug monitor!!
  15. Type 'help' for a list of commands.
  16. K> qemu: terminating on signal 2