OS Labs Review

声明:本blog基于2019 NJU OS Labs

Lab1 系统引导

1、任务

  • 通过 start.s 从实模式切换到保护模式,进入 boot.c 中调用 app 完成 hello world 的打印

2、细节

……
cli 	#clearinteruption 关闭中断是为了保证 cpu 在开启 A20 地址线时不被外部中断打扰
inb $0x92, %al	#Fast set up A20 Line with port 0x92,necessary or not?
……
必须要打开 A20 地址线: 因为最初8086/8088 拥有20根地址线,可以访问$2^{20}$(即1M)的地址, 但是 8086/8088 是 16 位地址($2^{16=64KB}$),表示不了 1M 的地址.
为了访问到 1M 地 址,Intel 采取了分段模式来计算绝对地址: 
			20 位地址 =16位基地址左移 4 位+16 位偏移量.
采用上述模式:0xFFFF0+0xFFFF=0x10FFEF,实际上计算机能访问的内存 远远超过了系统实际能访问的 1M,这种情况在 8086/8088 中因为产生”回卷”(超过 1M自动从 0 开始计算)没有影响. 到了80286,系统地址总线发展到24根,系统实际能访问的内存达到了 2^24(即16M),这个时候仍然按8086/8088的标准采用”回卷”处理需要访问1M以上 的内存就会导致无法访问真实的 1M~16M 的内存. 
解决这个问题的途径就是引入”A20地址线”. 80286 为了兼容 8086/8088,在实模式下两者并没有区别.但进入保护 模式后,通过开启A20地址线赋予80286访问1M以上的真实地址的能力.(保护模式 也就是诞生于 80286). 
80386 是 80286 后续作品 ...... 
orb$0x01,%al 正式开启保护模式 

Lab2 系统调用

1、任务

  • 实现printf()、scanf()、syscallScan()函数

2、细节

OS Labs Review_第1张图片

Lab3 进程切换

细节:

  • 进程切换:实现相应的fork()、sleep()、exit()函数
  • 线程切换:实现相应的pthread_create(), pthread_join()等函数

线程与进程切换是十分相似的,最大的不同在于线程切换失去了硬件支持,没有了 tss 段 的帮助,这也就意味着我们需要手动保存还原所有的现场信息,尤其是 esp,eip 的处理问题。

Lab4 并发控制

细节:

  • GETPID、SEM_INIT、SEM_POST、SEM_WAIT、SEM_DESTROY实现
  • 通过信号量控制实现互斥访问

你可能感兴趣的:(操作系统)