运行进程时,CPU执行正常的处理器循环:读取指令,增加程序计数器,执行指令,重复。但有些事件,必须从对用户程序的控制转移回内核,而不是执行下一条指令。这些事件包括希望得到注意的设备指令、执行非法操作的用户程序(例如,引用没有PTE的虚拟地址),或用户程序要求内核提供具有系统调用的服务。在处理这些事件时,有三个主要挑战:
1)内核必须安排处理器从用户模式切换到内核模式(和返回);
2)必须协调内核和设备之间的并行活动;
3)内核必须很好地理解设备的接口;
解决这三个难题需要对硬件有详细的了解并小心的编写代码,并且可能会产生不透明的内核代码。本章解释xv6如何解决这些问题。
MIT 6.828 book_xv6:Chapter 4
Posted on
Xv6在多处理器上运行,多核CPU的计算机独立执行代码。这些多核CPU在单个物理地址空间上运行,并共享数据结构;xv6必须引入一个协调机制,以防止它们相互干扰。即使在单处理器上,xv6也必须使用某种机制来防止中断处理程序干扰非中断代码。Xv6对两者都使用相同的低级概念:锁。锁提供互斥,确保一次只能有一个CPU拥有锁。如果xv6仅访问数据结构,同时持有特定的锁,则xv6可以确保一次只有一个CPU访问数据结构。在此情况下,我们说锁保护了数据结构。