linus于屏幕交替打印A和B,以检验操作系统进程切换能否正常运行。
透过树莓派Linux源码来探究bcm2835与arm1176jzfs的中断管理。
上一节我们已经实现了emperorOS的中断框架。基于此框架,能够构建一个简单的进程管理器。PCB(进程控制块)属于描述进程的数据结构,在emperorOS中,我们将proc定义为……
Linux内核属于抢占式内核,其kernel代码可重入,函数所用变量都存于调用堆栈,锁是kernel非抢占区域的标识。emperorOS为非抢占内核,内核代码能持续运行直至完成而不被打断,不要求内核代码可重入,也不必给每个进程分配内核栈。
若自旋锁已被其他线程获取,另一线程获取该锁时会循环等待。自旋锁仅能锁当前核,在单CPU且内核不可抢占时,自旋锁会退化为空操作,无需上锁。
emperorOS的用户程序仅占虚拟内存最低1MB空间,所以每次切换到用户进程前,loaduvm需替换该用户进程对应的页描述符pgd。

要让两个进程交替打印ab,起码得实现fork与exec这两个系统调用,fork用来创建子进程,exec则从文件载入进程。
系统启动后,加载位于bin/init的elf程序。
创建子进程,父进程输出a,子进程输出b。
也能够通过C程序来达成。
编译时加上nostartfiles参数,就能得到elf文件。
以前被叫做swi指令(软件中断),后来则被称为svc指令(管理程序调用)。
svc指令引发svc中断异常,在操作系统里常被用来请求特权操作或系统资源。
在arm架构的演进过程中,浮点单元也持续发展,从而对应着不同的abi(应用二进制接口),即oabi、eabi、eabihf。其中,oabi(旧abi)是arm架构的首个abi。
EABI和OABI很大的区别在于系统调用。
emperorOS采用老式的oabi方式。
arm开发者文档里有篇趣文,谈在应用中动态调用swi的方法。

elf存在三种header。
在elf文件里,segment和section可能重叠,它们是可执行文件的两种不同视角。
大道至简,elf文件简洁且能兼容多种指令集架构。
将init.hex填入initcode数组以编译进kernel,这是系统的0号进程,再通过exec加载并运行elf文件bin/init。
通过fork复制当前进程来创建子进程,在procs里找空位置,复制pcb进程控制块,将内存复制到新页描述符并设返回值。
arm11要进行设置cp15协处理器才行。
DMB(数据内存屏障)可确保执行顺序。
DSB(数据同步屏障)可确保内存访问指令的完成顺序。
ISB(指令同步屏障)是最严格的,它会刷新流水线。
C语言编译器可自动实现内存对齐。
汇编中需align n伪指令来实现2的n次方的对齐。
emperorOS将核心的cache/tlb禁用了。
将代码上传至github。