版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
操作系统课程设计-6Nachos操作系统中系统调用的设计和实现系统调用的实现4.2张鸿烈2005n
系统调用是用户程序和操作系统内核的接口。用户程序从系统调用函数取得系统服务。n
当CPU控制从用户程序切换到系统态时,
CPU的工作方式由用户态改变为系统态。而当内核完成系统调用功能时,CPU工作状态又从系统态改变回用户态并且将控制再次返回给用户程序。两种不同的CPU工作状态提供了操作系统基本的保护方式。系统调用的实现4.3张鸿烈2005n
我们已经实验过了一个用户程序是怎样被格式化为一个可运行于Nachos模拟的MIPS虚拟机上的进程的。我们也设计和实现了将多个用户程序同时装入内存。因此现在我们可以设计和实现Nachos的系统调用,从而增加用户程序的多种功能,实现用户程序的多道程序并发执行。Nachos用户程序的结构4.4张鸿烈2005n
在Nachos系统中用户程序是怎样编译的呢?实际这些C语言编写的用户程序在由
gcc
MIPS交叉编译后都在前面连接上一个由MIPS汇编程序start.s生成的叫start.o的目标模块。start是用户程序真正的启动入口,由它来调用C程序的main函数。所
以不要求用户编程时一定要把main函数作为第一个函数。这个汇编程序也为Nachos系统调用提供了一个汇编语言的存根(stub)。汇编程序start.s的汇编清单:.text.align
2*
start* Initialize
running
a
C
program,
by
calling
"main".*n
9 #define
IN_ASMn
10 #include
"syscall.h"n
11n
12n
13n
14n
15
/*n
16n
17n
18n
19
*NOTE:
This
has
to
be
first,
so
that
it
getsloaded
at
location
0.n
20
* The
Nachos
kernel
always
starts
a
program
byjumping
to
location
0.n21*n22*/4.5张鸿烈2005汇编程序start.s的汇编清单4.6张鸿烈2005.globl
start
startn
23n
24n
25
.entn
26
start:n
27
jaln
28
moven
29
jalmain$4,$0Exit/*
if
we
returnfrom
main,
exit(0)
*/.end
startn
30n
31汇编程序start.s的汇编清单4.7张鸿烈2005n
33 *
System
call
stubs:n34
* Assembly
language
assist
to
makesystem
calls
to
the
Nachos
kernel.n
35
* There
is
one
stub
per
system
call,
thatplaces
the
code
for
then
36
* system
call
into
register
r2,
and
leavesthe
arguments
to
then
37
* system
call
alone
(in
other
words,
arg1is
in
r4,
arg2
isn
38
* in
r5,
arg3
is
in
r6,
arg4
is
in
r7)n
39
*n
40
*The
return
value
is
in
r2.
This
followsthe
standard
C
callingn
41
* convention
on
the
MIPS.汇编程序start.s的汇编清单4.8张鸿烈2005n
45.globl
Haltn
46.ent
Haltn
47Halt:n
48addiu
$2,$0,SC_Haltn
49syscalln
50j
$31n
51.end
Halt汇编程序start.s的汇编清单4.9张鸿烈2005n
………n
61n
62n
63
Exec:n
64n
65n
66n
67.globl
Exec.ent
Execaddiu
$2,$0,SC_Execsyscallj
$31.end
Exec汇编程序start.s的汇编清单4.10张鸿烈2005n
133 /*
dummy
function
to
keep
gcchappy
*/n
134n
135.globl.ent
main
main
main:n
136n
137n
138j.end$31
mainhalt.c和它生成的汇编语言halt.s4.11张鸿烈2005n
例如C程序halt.c被编译为haltt.o,同时start.s也被汇编为start.o。之后两个目标模块被连接成可执行的Coff格式的可执行文件,最后这个Coff文
件又被转换为Noff格式的Nachos可执行文件。n
我们看一下halt.c和它生成的汇编语言halt.s的清单就可以比较清楚start.s和helt.s之间的关系以及系统调用的定义和执行的过程了。halt.c程序非常简单,它只有一个main函数且仅执行了一句Nachos的停机系统调用Halt():halt.c的清单4.12张鸿烈2005Halt();/*
not
reached
*/n
13 #include
"syscall.h“n
14n
15
intn
16
main()n
17
{n
23n
24n
25
}由halt.c生成的汇编语言halt.s的清单4.13张鸿烈2005n
1
.file
1
"halt.c“n
2
gcc2_compiled.:n
3
gnu_compiled_c:n
……n
12.textn
13.align2n
14.globlmainn
15.entmain由halt.c生成的汇编语言halt.s的清单4.14张鸿烈2005n
16
main:n
17#
vars=
0,.frame
$fp,24,$31regs=
2/0,
args=
16,extra=0n
18.mask
0xc0000000,-4n
19.fmask
0x00000000,0n
20subu
$sp,$sp,24n
21sw
$31,20($sp)n
22sw
$fp,16($sp)n
23move
$fp,$sp由halt.c生成的汇编语言halt.s的清单4.15张鸿烈2005n
24jal
mainn
25jalHaltn
26$L1:n
27move$sp,$fpn
28lw$31,20($sp)n
29lw$fp,16($sp)n
30addu$sp,$sp,24n
31j$31n
32.endmainhalt.s汇编清单的说明4.16张鸿烈2005n
可以看到main做的第一件事情就是栈顶指针减去一个帧长度以建立一个新的栈帧。然后在这一帧中保存返回地址寄存器($31)和帧指针寄存器($fp)。(line20-30)。n
主例程的主体简单的调用汇编例程Halt(jal
Halt)。这个Halt定义在start.s的47-54行。(
main子例程是一个钩子,gcc产生这个钩子程序是为了在main函数主体开始之前提供一个做一些其它事情的机会。它定义在start.s的136-138行,此时它什么事情也没做,是个虚拟例程)。如果主函数正常退出,27-31行上的指令将取消这一帧。这几行恰为20-23行上的逆操作。最后CPU控制将由31行上的”j
$31”指令返回到调用这个主函数的例程中去。在此例中,如果控制到达这条指令,它将返回到start.s的第28行。系统调用接口4.17张鸿烈2005n
现在我们已经看到了系统调用Halt的汇编代码,它没有携带任何要传送到内核中的参数。如果系统调用携带参数,编译又怎样来生成传送参数的指令呢?n
所有Nachos系统调用的接口原型都定义在文件userprog/syscall.h中。当编译用户程序时编译器会括入这个文件并取得这些
系统调用接口原型的信息(这就是为什么
当你编译halt.c时Makefile文件中必须加入-I../userprog定义)。syscall.h文件中系统调用的定义4.18张鸿烈2005n
当前,Nachos支持11个系统调用。这些系统调用接口原型在userprog/syscall.h文件的45-125行上。n
21#defineSC_Halt0n
22#defineSC_Exit1n
23#defineSC_Exec2n
24#defineSC_Join3n
25#defineSC_Create4syscall.h文件中系统调用的定义4.19张鸿烈2005n
26#defineSC_Open5n
27#defineSC_Read6n
28#defineSC_Write7n
29#defineSC_Close8n
30#defineSC_Fork9n
31#defineSC_Yield10syscall.h文件中系统调用的定义4.20张鸿烈2005n
33 #ifndef
IN_ASMn
45 /*
Stop
Nachos,
and
outperformance
stats
*/n
46n
49void
Halt();/*
Address
space
controloperations:
Exit,
Exec,
and
Join
*/n
51 /*
This
user
program
is
done(status
=
0
means
exited
normally).
*/n
52
void
Exit(int
status);syscall.h文件中系统调用的定义4.21张鸿烈2005n
54 /*
A
unique
identifier
for
anexecuting
user
program
(addressspace)
*/n
55typedef
int
SpaceId;n
57/*
Run
the
executable,
stored
intheNachos
file
"name",
and
return
then
58*
address
space
identifiern
59*/n
60SpaceId
Exec(char
*name);syscall.h文件中系统调用的定义4.22张鸿烈2005n
64*/n
65intJoin(SpaceIdid);n
62 /*
Only
return
once
the
the
userprogram
"id"
has
finished.n
63 *
Return
the
exit
status.n
……n
对应的系统调用的汇编语言存根在test/start.s文件中的45-131行。如果你要添加你自己的系统调用,就应当首先在syscall.h和start.s中声明你的系统调用原型和存根。系统调用基本过程4.23张鸿烈2005n
当一个系统调用由一个用户进程发出时,由汇编语言编写的对应于存根的程序就被执行。然后,这个存根程序会由执行一个系统调用指令而引发一个异常或自陷。n
在start.s中的这些系统调用的接口程序代码都是一样的。即:n
将对应的系统调用的编码送$2寄存器n
执行系统调用指令SYSCALL且n
返回到用户程序异常和自陷4.24张鸿烈2005n
模拟MIPS计算机的异常和自陷管理的是Machine类中的函数RaiseException(ExceptionType
which,int
badVAddr)。n
其中的第一个参数which是一个
ExceptionType枚举类型的变量。
ExceptionType类型的定义也在
machine/machine.h文件中:异常和自陷4.25张鸿烈2005n
39
enum
ExceptionType
{
NoException,//
Everything
ok!n
40
SyscallException,//
A
programexecuted
a
system
call.n
41
PageFaultException,//
No
validtranslation
foundn
42
ReadOnlyException,//
Writeattempted
to
page
markedn
43 //
"read-only“n
44
BusErrorException,//
Translationresulted
in
an//
invalidn
45physical
address异常和自陷4.26张鸿烈2005n
46
AddressErrorException,
//Unaligned
reference
or
one
that//
was
beyondn
47the
end
of
then
48//
address
spacen
49
OverflowException, //
Integeroverflow
in
add
or
sub.n
50
IllegalInstrException,
//Unimplemented
or
reserved
instr.n
51n
52
NumExceptionTypesn
53
};异常和自陷4.27张鸿烈2005n
系统调用是这些异常中的一个。MIPS计算机的”SYSCALL”指令在Nachos中是
由machine/mipssim.cc中534-536行上的通过发系统调用异常模拟的:n
注意在系统调用异常处理之后的下一条语句是一条return返回语句,而不是break语句。这一点很重要,return语句不会使程序计数器PC向前推进,从而在异常处理之后同一条指令将会再次被启动。异常处理4.28张鸿烈2005n
函数RaiseException(ExceptionTypewhich,
int
badVAddr)的代码在machine/machine.cc文件中:n
100
voidn
101Machine::RaiseException(ExceptionTypewhich,
int
badVAddr)102
{n
103 DEBUG("m",
"Exception:
%s\n",
exceptionNames[which]);异常处理4.29张鸿烈2005n
105
// ASSERT(interrupt->getStatus()
==UserMode);n
106 registers[BadVAddrReg]
=badVAddr;n
107 DelayedLoad(0,
0);//
finish
anything
in
progressn
108n
109interrupt->setStatus(SystemMode);ExceptionHandler(which);//
interrupts
are
enabled
at
this
pointn
110 interrupt->setStatus(UserMode);n
111
}异常处理4.30张鸿烈2005n
这个函数模拟硬件的动作,切换到系统态并且在异常处理完成后返回到用户态。
108-110行代表了Nachos内核和用户程序
的一个界面接口。110行上的
ExceptionHandler(which)函数调用模拟硬件的动作发发一个异常中断到对应的异常处理程序。这个函数定在
userprog/execution.cc中:异常处理4.31张鸿烈2005n51voidn52ExceptionHandler(ExceptionType
which)n53{n54int
type
=
machine->ReadRegister(2);n55n56{if
((which
==
SyscallException)
&&
(type==
SC_Halt))n
57 DEBUG("a",
"Shutdown,
initiated
by
userprogram.\n");n
58n
59interrupt->Halt();}
else
{n
60 printf("Unexpected
user
mode
exception
%d
%d\n",which,
type);ASSERT(FALSE);}n
61n
62n
63
}异常处理4.32张鸿烈2005n
在此时,Nachos仅能处理带有SC
HALT代码的系统调用。寄存器$2包含系统调用代码(如果异常是一个系统调用异常)且寄存器$4-$7包含着当系统调用开始处理时的前4个参数。系统调用的返回值,如果有,都将返回$2。对于系统调用Halt的异常处理只是简单的模拟了Interrupt类指向的中断函数Halt()。虚拟内存4.33张鸿烈2005n
前面我们讨论的用户进程需要整个地址空间都进入物理内存后才能开始运行。这种进程全部进入内存后再运行的策略是很受限制和浪费内存空间的。实际上多数程序的工作方式是符合”局部性原理”的,即当前要执行的程序的和当前要访问的数据往往是集中在某些内存页面上,而当前执行不到程序和访问不到的数据完全可以先放在第二存储器中,等到用到时再从第二存储器中装入物理内存。请求式分页技术4.34张鸿烈2005n
虚拟内存技术就是解决程序部分装入物理
内存也能执行的技术。由于允许进程部分
驻留物理内存,所以一个进程的逻辑空间
可以远远大于分配给进程工作的物理空间。n
虚拟内存技术可以在带有分页式内存管理的系统中,通过采用请求式分页存储管理技术实现。请求式分页内存管理技术的意思是,装入物理内存的内存逻辑页仅在访问到它时才被分配到物理内存帧。请求式分页技术n
请求式分页关键的技术是,当请求的
页不在物理内存时使用缺页异常或自
陷进入内核,由内核缺页异常处理程
序从外存将该页装入一空闲内存帧中,如果无空闲帧,将选择已在物理内存
中的一页将其置换。在这一异常被处
理完成之后,发出对该内存访问的同
一条指令将再次被执行。4.35张鸿烈2005Nachos虚存基本机制4.36张鸿烈2005n
Nachos提供了实现虚拟内存技术的基本机制,你可以通过这些基本机制来实现
Nachos中的虚拟内存。其中缺页异常是由MIPS机模拟函数translate产生的。这个函数是由函数ReadMem和WriteMem调用的。让我们来看一下在文件
machine/translate.cc中的ReadMem函数的有关执行过程:Nachos虚存基本机制4.37张鸿烈2005nnboolMachine::ReadMem(int
addr,
int
size,
int
*value)n89
{n90
int
data;n91 ExceptionType
exception;n92
int
physicalAddress;n93n94 DEBUG("a",
"Reading
VA
0x%x,
size
%d\n",
addr,size);n95n96 exception
=
Translate(addr,
&physicalAddress,
size,FALSE);n97
if
(exception
!=
NoException)
{n98 machine->RaiseException(exception,
addr);n99
return
FALSE;n100
}Nachos虚存基本机制4.38张鸿烈2005n
参数addr是一条指令发出的要寻找的逻辑地址。这个地址通过调用函数translate被转换为物理地址。如果发生缺页异常,则会通过调用函数RaiseException将该异常分派到对应的异常处理函数处理。如果你想实现Nachos的虚拟内存,这儿就是你的设计起点。注意函数ReadMem在完成缺页异常处理之后将返回一个FALSE(97-99行),这一点很重要,它将使调用
ReadMem的指令重新执行。Nachos虚存基本机制n
在文件machine/mips.cc中定义的
MIPS模拟器在执行以下操作时都有可能引发缺页异常处理,调用函数
RaiseException:n
取一条指令(102)行或n
执行234、252、274、288、319、484、514行上的指令4.39张鸿烈2005Nachos虚存基本机制n
所有这些情况,如果相关函数返回值为FALSE,在函数Run的for循环中的
函数OneInstuction就不会向前推进程序计数器,而是立即返回被再次执行。即Nachos中MIPS机模拟器正确的模拟了请求式分页算法的第六步-
Restart
Instruction。4.40张鸿烈2005页置换4.41张鸿烈2005n
页置换是解决当物理内存已满且有一新页需要装入时怎样选择被淘汰页的问题。常用的页置换算法有:n
FIFO算法n
Optimal算法n
LRU算法n
要做好这方面的设计,你还需要明白
Belady’s异常和栈算法。页置换4.42张鸿烈2005n
除了Optimal算法外,应当搞清FIFO、LRU算法是怎样实现的。这些算法的实现经常是考虑花费和实用性而将FIFO、LUR算法结合起来的一些近似算法。页缓冲技术可以用来改进置换算法的执行效率。n
Nachos对于页置换的硬件模拟的支持反映在machine/translate.h文件中定义的页表结构TranslationEntry中,其中:页置换4.43张鸿烈2005n
变量valid和readonly对应MMU硬件的valid和read-only位,是用于内存管理和保护的。n变量use和dirty对应硬件的use位和dirty位,是用于虚拟内存页置换的。n
考虑一下你应当怎样利用一下这两个变量为Nachos的虚拟内存实现页置换。帧的分配n
在Nachos的MIPS模拟器中的物理内
存是通过一个字节型的数组模拟的。n
在文件machine/machine.cc中定义的
Machine类的构造函数初始化了这个基本内存(61-63行),其大小为
Memeorysiae字节或NumphysPages
帧。4.44张鸿烈2005帧的分配4.45张鸿烈2005n
55
Machine::Machine(bool
debug)n
56
{n
57inti;n
59for(i=0;i<NumTotalRegs;i++)n
60n
61registers[i]
=
0;mainMemory
=
newchar[MemorySize];n
62n
63for
(i
=
0;
i
<
MemorySize;
i++)mainMemory[i]
=
0;帧的分配4.46张鸿烈2005n
64 #ifdef
USE_TLBn
65 tlb
=
newTranslationEntry[TLBSize];n
66
for
(i
=
0;
i
<TLBSize;
i++)tlb[i].valid
=n
67FALSE;n
68pageTable
=
NULL;帧的分配4.47张鸿烈2005n
69
#else//
use
linear
pagetablen
70n
71tlb
=
NULL;pageTable
=
NULL;singleStep
=
debug;CheckEndian();n
72
#endifn
73n
74n
75n
76
}帧的分配4.48张鸿烈2005nNumPhysPages()(在文件machine.h中)当前定义的大小是:n
35 #define
NumPhysPages
32n
当你为Nachos实现一个虚拟内存时,你需要考虑:n
每个进程最小的页帧数是多少?n
使用什么样的帧分配算法?n
提供的帧算法是全局的还是局部的?系统调用的实现4.49张鸿烈2005n
在我们完成了多个程序同时驻留内存的内存分配算法后,我们就应当考虑用户父子进程并发执行的问题了。为了完成这一功能首先可以准备一个作为父进程的用户程序
exec.c:n
1 #include
"syscall.h"n
2
intn
3
main()n
4
{n
5 SpacId
pid;n
6 pid
=
Exec("../test/halt.noff");n
7
Halt()n
8
}系统调用的实现n
为了能和已有的用户C程序一起生成可执行文件,n
可以修改../test/Makefile文件,将
exec加入到targets定义中:targets=
halt
shell
matmult
sort
exec。在../test中重新make生成exec.noff可执行文件。4.50张鸿烈2005系统调用的实现4.51张鸿烈2005n在exec.c中为了生成子进程halt.noff,使用了Nachos的系统调用Exec。它带有一个字符串参数,是一个可执行文件名。在发生系统调用时系统内核怎样得到这个参数并根据它建立子进程呢?这需要我们看一下对应于exec.c的汇编代码,了解一下
MIPS机指令系统对于参数传递是如何安
排的:Exec的汇编清单4.52张鸿烈2005$LC0:"../test/halt.noff\000“n
1
.file
1
"exec.c“n
2
gcc2_compiled.:n
3
gnu_compiled_c:n
4
.rdatan
5
.align
2n
6n
7n
8n
9.ascii.text.align
2Exec的汇编清单4.53张鸿烈2005n10.globlmainn11.entmainn12main:n13.frame$fp,32,$31#
vars=8,regs=
2/0,
args=
16,
extra=0n14.mask
0xc0000000,-4n15.fmask
0x00000000,0n16subu
$sp,$sp,32n17sw
$31,28($sp)n18sw
$fp,24($sp)n19move
$fp,$spExec的汇编清单4.54张鸿烈2005n20jal
mainn21la$4,$LC0n22jalExecn23sw$2,16($fp)n24jalHaltn25$L1:n26move$sp,$fpn27lw$31,28($sp)n28lw$fp,24($sp)n29addu$sp,$sp,32n30j$31n31.endmain系统调用的实现4.55张鸿烈2005n
可以看到要传递的文件名字符串被汇
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 湘西土家族苗族自治州吉首市2025-2026学年第二学期四年级语文第七单元测试卷(部编版含答案)
- 典当业务员操作规程测试考核试卷含答案
- 殡仪服务员操作规程水平考核试卷含答案
- 糖料作物栽培工安全应急模拟考核试卷含答案
- 室内装修验房师发展趋势强化考核试卷含答案
- 厦门市同安区2025-2026学年第二学期四年级语文第八单元测试卷(部编版含答案)
- 桂林市雁山区2025-2026学年第二学期四年级语文第八单元测试卷(部编版含答案)
- 双鸭山市岭东区2025-2026学年第二学期五年级语文期末考试卷(部编版含答案)
- MBA金融方向就业前景分析
- 绵阳市盐亭县2025-2026学年第二学期五年级语文第八单元测试卷(部编版含答案)
- 2026高考蓝皮书高考关键能力培养与应用第1节 3.组织与运用
- 2025年智联招聘国企笔试题库及答案
- 2025年康复治疗师资格考试历年真题及解析
- 车间主任转正述职报告
- 输液科静脉输液操作规范
- 上海某高校学生心理健康事件应急干预与支持办法
- 2025广东广州市黄埔区文冲街招聘垃圾分类督导员和垃圾分类专管员3人备考练习题库及答案解析
- GB/T 18226-2025公路交通工程钢构件防腐技术条件
- 车间高温烫伤安全培训课件
- 新闻学专业毕业论文范文
- 2025四川省县域经济研究中心考核招聘2人笔试参考题库附答案解析
评论
0/150
提交评论