Minix源码解读:Minix总体框架

1.1    minix初始化过程
    系统启动,选择映像,进入pre_init() (kernel/arch/i386/pre_init.c)
在MINIX3内核被成功加载到内存后,控制权会转移到kernel/mpx.s文件并执行。
    设置boot栈,以便MINIX3结束后交还控制权
    将boot的GDT(保护模式的GDT数据结构)拷贝到内核地址空间,并加载
    设置内核段寄存器和栈
        初始化kernel所对应的text段、data段等
调用start.c文件中的cstart函数来保存内核信息(进入保护模式)
    重新加载GDT和IDT
    初始化段选择子,初始化中断
调用main.c文件中的main函数运行boot image
初始化进程proc表(kernel/proc.h),设置标记为空
初始化特权表
初始化boot image中的进程
    初始化栈(内核载入内存,其他部分载入扩展内存)
    内核进程设置栈保护
    构建进程内存映像
    初始化寄存器、服务器栈指针
    为进程分配代码段和数据段
boot image processes全部进入等待队列
初始化时钟中断等
switch_to_user()

1.2    体系结构

第四层:init进程(用户根进程),其他用户进程
第三层:向用户进程提供服务的服务进程
第二层:I/O进程(driver)
第一层:包含kernel,系统任务、时钟任务

1.3    消息机制实现
include/minix/IPC.h
    echo,notify,sendrec,receive,send,sendnb,senda,do_kernel_call
/kernel/Proc.c
调用do_sync_ipc()判断消息类型,并检查消息情况,根据同步异步来分别调用函数。
消息操作:S     -> D
mini_send:
    内核检测D是否阻塞接受S的消息
    若为阻塞:
        将消息从进程S的内存上复制到进程D的内存空间中
        内存位置由S的proc表来指定
    若阻塞:
        进程S阻塞,并添加到D的发送阻塞链表中,消息内容指针转存
mini_receive:
    内核检测是否有消息挂起
        若有,处理消息并将位于阻塞状态的S加入就绪队列
        若无,检测是否有异步消息
mini_notify:
    检查D是否在等待消息,若是,则复制消息,不是则添加到队列中
mini_senda:
    异步消息传递

1.4    中断机制
主要过程:保护现场 -> 处理中断 -> 恢复程序
    保护现场(kernel/arch/i386/mpx.s):
        保存程序状态,将下一条指令压栈(add $4, $esp)
        保存当前寄存器中的值,压栈
    中断处理:
        处理中断的内容
    中断返回(kernel/arch/i386/mpx.s):
        将保护的现场还原
        继续执行中断前的程序(下一条指令)
软中断:
    由软件方式产生的中断,主要由int指令提供
    软中断的工作工程模拟了实际的中断处理过程,当某一软中断事件发生后,首先    需要设置对应的中断标记位,触发中断事务,然后唤醒守护线程去检测中断状态寄存    器,如果通过查询发现有软中断事务发生,那么通过查询软中断向量表调用相应的软    中断服务程序
    函数调用和软中断调用的区别是,软中断多了修改特权级和查找中断向量表的功    能。

1.5    调度算法
时间片调度(/kernel/Proc.c)
    时钟中断来临时检测
/kernel/Clock.c
    bsp_timer_int_handler():获得number of ticks and update realtime
    load_update():
        slot = (realtime / system_hz / _LOAD_UNIT_SECS) % _LOAD_HISTORY;
    ap_timer_int_handler():

若队列中只有一个进程,则该进程在时间片运行完后,仍会立即执行下一个时间片。当一个进程连续两个时间片地运行完后,将被放在一个较低的运行队列中。
而当进程没有妨碍其他进程的运行(即其时间片用完后,调度器调度了其他的进程运行)时,它的优先级又会不断提高直到到它能回到的最大优先级。这样,原先的被降低了优先级的进程在不妨碍别的进程下运行的情况下,能有机会逐步地回到原来的优先级
enqueue():创建队列,或将进程插入到队列尾部
enqueue_head():列表头部插入进程
dequeue():从列表中删除进程
pick_proc():选择下一个要运行的进程时

1.6    内核架构
采用微内核结构
主要分kernel、Clock task、System task三大部分,三者集成在一起并不完全独立
微内核提供一组“最基本”的服务,如进程调度、进程间通信、存储管理、处理I/O设备。其他服务,如文件管理、网络支持等通过接口连到微内核。

1.7    系统调用、任务调用、内核调用
操作系统与程序之间的接口,指系统通过中断切换到内核中,然后执行用户所需要的操作然后返回,即为软中断。
minix严格意义上系统调用只有mini_send,mini_receive,mini_notify。因为其它函数调用大多是通过这三个函数来完成的。
任务调用与系统调用类似
内核调用不涉及用户层,仅在内核中调用

1.8    Proc结构(/kernel/Proc.h)

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

p_reg                       进程寄存器

p_fpu_state                 进程浮点寄存器

p_seg                       段描述符

p_nr                        进程号,其中内核进程CLOCK(-3)

                            SYSTEM(-2)、KERNEL(-1)

                            和IDLE进程(-4)

p_priv                      系统特权结构

p_rts_flags                 进程的各种标志位

p_misc_flags                //

p_priority                  当前进程的优先级

p_cpu_time_left             剩余的CPU时间

p_quantum_size_ms           分配的时间算子(in ms)

proc *p_scheduler           who should get out of quantum msg

p_memmap[]                  memory map (T, D, S) */

clock_t p_user_time,

p_sys_time,

p_virt_left, p_prof_left    各种时间

p_cycles                    how many cycles did process use

p_nextready                 指向同一优先级队列的下一个就绪进程

p_caller_q,p_q_link         通信send表头,指向next的链指针

p_getfrom_e,_sendto_e       receive链from和to

p_pending                   信号量位图

p_name[]                    进程名字

p_endpoint                  尾指针

p_sendmsg                   送出的msg内容

p_delivermsg                传入的msg内容

_delivermsg_vir             msg传送地址

p_found                     一致性检测

p_magic                     检查有效性指针

1.9    Priv结构(/kernel/Priv.h)
特权结构,主要定义了标志位,system call masks(?),同步警报定时器,I/O特权,硬件中断,通知等。每一个系统进程拥有一个结构体,而所有用户进程共享同一个结构体。

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

s_proc_nr                   关联进程的数量

s_id                        系统结构的ID

s_flags                     标志位

s_asyntab                   异步传输内容地址

s_asynsize                  异步传输内容

s_trap_mask                 标记位,允许系统调用处理

s_ipc_to                    标记位,目的进程可用

s_k_call_mask[]             位图

s_sig_mgr                   信号管理

s_bak_sig_mgr               信号管理的备份

s_notify_pending            等待通知的位图

s_int_pending               标记位,硬件中断

s_sig_pending               标记位,信号

s_alarm_timer               同步时钟

a_farmem[]                  //内存映射

s_stack_guard               内核任务栈

s_nr_io_range               允许的I/O接口

s_io_tab                    I/O接口位图

s_nr_mem_range              //

s_mem_tab                   //

s_nr_irq                    中断请求数

s_irq_tab                   中断请求位图

s_grant_table               授权进程的地址表

s_grant_entries             授权数量

1.10 fproc结构
打开文件的管理


你可能感兴趣的:(Minix源码解读:Minix总体框架)