操作系统课程设计- 教程_第1页
操作系统课程设计- 教程_第2页
操作系统课程设计- 教程_第3页
操作系统课程设计- 教程_第4页
操作系统课程设计- 教程_第5页
已阅读5页,还剩57页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

操作系统课程设计-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

print

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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论