简单操作系统实现之进程分析.docx
- 文档编号:10049496
- 上传时间:2023-05-23
- 格式:DOCX
- 页数:9
- 大小:147.18KB
简单操作系统实现之进程分析.docx
《简单操作系统实现之进程分析.docx》由会员分享,可在线阅读,更多相关《简单操作系统实现之进程分析.docx(9页珍藏版)》请在冰点文库上搜索。
简单操作系统实现之进程分析
简单操作系统实现之进程分析
学院:
信息工程学院
专业:
计算机应用技术
学号:
姓名:
目录
一.引言1
二.关键技术原理分析1
2.1简单进程实现步骤1
2.2进程表结构2
2.3进程栈和内核栈3
2.4特权级变换3
2.5中断重入3
三.关键代码段分析4
3.1特权级由内层变换到外层4
3.2时钟中断处理程序5
四.运行结果7
一.引言
进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。
它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。
进程的概念主要有两点:
第一,进程是一个实体。
每一个进程都有它自己的地址空间,一般情况下,包括文本区域(textregion)、数据区域(dataregion)和堆栈(stackregion)。
文本区域存储处理器执行的代码;数据区域存储变量和进程执行期间使用的动态分配的内存;堆栈区域存储着活动过程调用的指令和本地变量。
第二,进程是一个“执行中的程序”。
程序是一个没有生命的实体,只有处理器赋予程序生命时,它才能成为一个活动的实体,我们称其为进程。
进程是操作系统中最基本、重要的概念。
是多道程序系统出现后,为了刻画系统内部出现的动态情况,描述系统内部各道程序的活动规律引进的一个概念,所有多道程序设计操作系统都建立在进程的基础上。
Linux的一个未发布版本Linux0.00是一个十分简单的操作系统雏形,其最终运行结果为在终端不断打印A、B两个字符,是多进程调度运行的结果。
本文主要对操作系统中进程的实现做简单分析。
二.关键技术原理分析
2.1简单进程实现步骤
本文实现的进程遵循如下运行步骤:
1.进程A运行中。
2.时钟中断发生,特权级由1变换到0,时钟中断处理程序启动。
3.进程调度,下一个应运行的进程(假设为进程B)被指定。
4.进程B被恢复,特权级由0变换回1.
5.进程B运行中。
要实现上述功能,必须考虑的实现有:
1.时钟中断处理程序。
2.进程调度模块。
3.两个进程。
2.2进程表结构
进程A在运行中被中断,调度程序将CPU控制权交给另一个进程B,等到B运行结束或被中断后控制权又回到A中,A继续运行。
要实现这点,必然要有一个结构保存进程被中断时的状态,包括各种寄存器等,我们把这种结构称之为进程表。
本文实现的进程表结构如下:
L
gs
fs
es
ds
edi
esi
ebp
esp
ebx
edx
ecx
eax
retaddr
eip
cs
eflags
esp
ss
LDTSelector
Descriptor1
Descriptor2
H
……
其中从retaddr向低地址方向的位置保存进程调度时压栈的寄存器,retaddr向高地址方向的位置保存中断发生时压栈的返回地址等,其余的位置保存进程自己的局部描述符。
2.3进程栈和内核栈
由以上进程表结构我们可以看到,如果要在进程调度模块中保存各寄存器值,其栈指针在此时必然指向的是进程表的一个位置,当寄存器值已经被保存到进程表内,进程调度模块就开始执行了。
但这时如果我们在调度模块中使用了堆栈,而栈指针指向的是进程表,就会有问题发生,因此,为了避免错误的出现,我们在调度模块中将esp指向专门的称之为内核栈的区域。
这样,在进程切换的过程中,esp的位置出现在3个不同的区域:
进程栈——进程运行时自身的栈。
进程表——存储进程状态信息的数据结构。
内核栈——进程调度模块运行时使用的栈。
2.4特权级变换
如果由外层特权级向内核的内层特权级变换时,需要从TSS中取出内层ss和esp作为目标代码的ss和esp。
因此,我们必须准备好TSS。
由于每个进程相对独立,我们把涉及到的描述符放在局部描述符表LDT中。
而开始程序是运行在特权级0的,因此,我们要在外层特权级运行进程,必须在进程运行前变换到外层特权级,这点可以运用中断返回的运行原理来模拟一次中断返回,从而实现特权级到外层的变换。
2.5中断重入
CPU在响应中断的过程中会自动关闭中断,但是中断处理程序的执行也需要一定的时间,而且系统中随时发生着各种内部或外部中断,因此在中断处理程序中必然要开启中断来保证其他事件的响应。
但是如果当前中断还没有处理完成,又发生了下一次的相同中断,就会发生中断嵌套情况,在这种情况下,如果只是简单的中断处理例程,就有可能发生中断一直嵌套而不能继续执行的情况。
由此,我们必须在打开中断的同时处理中断重入的情况,其思想很简单,就是使用一个变量记录当前中断的发生次数,如果在中断处理程序中发现当前中断发生次数大于1,则简单返回,由此解决中断重入情况。
三.关键代码段分析
3.1特权级由内层变换到外层
restart:
;将当前栈指针指向进程表首地址
movesp,[p_proc_ready]
;将要启动的进程的LDT寄存器设置好
lldt[esp+P_LDT_SEL]
;下面两行代码是为下一次外层特权级到内层0级特权级的变换做准备,
;因为由外层向内层变换时,内层堆栈指针是从TSS中获得的,在这里把
;内层的0级堆栈指针设为进程栈的首地址,这样,在时钟中断中进行返
;回地址以及寄存器的压栈过程会将其保存到进程的进程表中,从而实现
;了进程状态的保存。
leaeax,[esp+P_STACKTOP]
movdword[tss+TSS3_S_SP0],eax
restart_reenter:
;中断重入计数器减1。
中断进入时计数器加1判断是否为0,如果为0
;则不是重入中断,如果不为0则是中断重入。
中断结束后需要将计数
;器加1
decdword[k_reenter]
;恢复将要启动的进程的寄存器值
popgs
popfs
popes
popds
popad
;这行是跳过进程表的retaddr域,使栈指针指向eip
addesp,4
;中断返回指令会由当前栈指针处分别取出cs、eip等信息进行进程的恢
;复执行,进程表中这一区域存储的正是进程被中断时的cs:
eip,因此
;通过这种机制达到了进程的恢复执行目的,在第一次启动进程时我们
;是将进程A的入口地址直接写到了进程表的相应域
Iretd
3.2时钟中断处理程序
%macrohwint_master1
;这个语句会向进程表栈中压入返回地址retaddr,即下一条语句
callsave
;到这里不管是不是重入了中断,其实都已经切换到了内核栈,而内核栈
;的栈指针当前指向的正是restart或者restart_reenter的地址
inal,INT_M_CTLMASK
oral,(1<<%1);屏蔽当前中断
outINT_M_CTLMASK,al;不允许再发生中断
moval,EOI
outINT_M_CTL,al
sti
push%1
call[irq_table+4*%1]
popecx
cli
inal,INT_M_CTLMASK
andal,~(1<<%1)
outINT_M_CTLMASK,al
ret;利用内核栈栈顶保存的restartxxx的地址返回
%endmacro
save:
pushad
pushds
pushes
pushfs
pushgs;以上把各个寄存器保存到进程表中
movdx,ss
movds,dx
moves,dx
movesi,esp;esi=进程表起始地址-栈顶
incdword[k_reenter];中断进入时判断k_reenter
cmpdword[k_reenter],0;判断是否是重入中断
jne.1
movesp,StackTop;不是重入中断正常处理,切换到内核栈
pushrestart;把这个函数的地址压入到内核堆栈,注意这时已经进行了
;堆栈切换,而且现在的栈指针指向的是一个函数的首地址
jmp[esi+RETADR-P_STACKBASE]
.1:
;是重入中断
pushrestart_reenter;是重入中断的话已经在内核栈了,在栈指针处压
;入一个返回地址
jmp[esi+RETADR-P_STACKBASE]
上面代码是一个使用call指令调用的函数,call指令的调用本来应该用ret返回,使用的返回地址是call指令压入的,但是在这里我们并没有使用ret从save函数中返回,而是使用的jmp指令,同时我们在堆栈的顶端压入了一个函数地址,这个函数地址或者是重入中断需要执行的restart_reenter函数,或者是正常中断需要执行的restart函数。
而我们上面的时钟中断可以仅仅看做是上半部分代码,其下半部分代码即为在3.1中分析的那两段,由此我们看到时钟中断最后有一个iret指令并非是完全退出了中断,而是根据当前栈指针指向的内核栈顶的restart或者restart_reenter地址跳转到了这两个函数其中之一执行。
然后,如果当前是非重入中断,程序会正常执行,在restart中又一次切换了栈指针指向下一个进程的进程栈,在恢复了寄存器值后利用iret指令从进程表中取出下一次启动进程的地址而继续执行。
四.运行结果
以上运行截图证实我们的几个进程正常启动执行。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 简单 操作系统 实现 进程 分析
![提示](https://static.bingdoc.com/images/bang_tan.gif)