Minix源码解读:Minix总体框架
2014-12-11 00:00
218 查看
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)
1.9 Priv结构(/kernel/Priv.h)
特权结构,主要定义了标志位,system call masks(?),同步警报定时器,I/O特权,硬件中断,通知等。每一个系统进程拥有一个结构体,而所有用户进程共享同一个结构体。
1.10 fproc结构
打开文件的管理
系统启动,选择映像,进入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 检查有效性指针 |
特权结构,主要定义了标志位,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 授权数量 |
打开文件的管理
相关文章推荐
- Java集合源码解读(一):集合总体框架
- 【视频】自然框架源码的类库、控件、模块的总体简介
- 【视频】自然框架源码的类库、控件、模块的总体简介
- groupcache常用框架以及源码解读
- 安卓andbase框架源码解读(二)
- 安卓andbase框架源码解读( 一)
- Jquery1.3源码解读(一):总体结构
- CI框架源码解读之利用Hook.php文件完成功能扩展的方法
- 安卓andbase框架源码解读(二)
- android AChartEnginee讲解之源码框架解读
- Android 开源框架之 Android-async-http 源码解读
- ACE框架解读 - 源码篇
- Tor源码分析六 -- 总体框架图
- 安卓andbase框架源码解读( 一)
- HTMLparser开源框架包源码解读
- 【视频】自然框架源码的类库、控件、模块的总体简介
- 【ci框架】源码解读:URI.php中_fetch_uri_string()函数的解析
- String系列源码解析01 - 总体框架
- ntv.js框架源码解读 - 1common.js和2core.js