Uploaded by 1584094780

os-Chapter 2

advertisement
第2章: 操作系统结构
Operating System Concepts – 7th Edition, Jan 14, 2005
2.1
Silberschatz, Galvin and Gagne ©2005
目录
 操作系统服务
 操作系统的用户界面
 系统调用
 系统调用类型
 系统程序
 操作系统设计和实现
 操作系统结构
 虚拟机
 系统生成
 系统启动
Operating System Concepts – 7th Edition, Jan 14, 2005
2.2
Silberschatz, Galvin and Gagne ©2005
本章目标
 介绍操作系统为用户、进程和其他系统提供的
服务
 讨论组织操作系统的不同方法
 解释如何安装、定制操作系统,以及如何启动
Operating System Concepts – 7th Edition, Jan 14, 2005
2.3
Silberschatz, Galvin and Gagne ©2005
Operating System Concepts – 7th Edition, Jan 14, 2005
2.4
Silberschatz, Galvin and Gagne ©2005
2.1 操作系统服务
 操作系统向用户和程序提供一个环境以执行程

用户界面

程序执行

I/O 操作

文件系统操作

通信

安全与保护

错误检测
Operating System Concepts – 7th Edition, Jan 14, 2005
2.5
Silberschatz, Galvin and Gagne ©2005
2.1 操作系统服务
 操作系统向程序和用户提供一个环境以执行程序
 用户界面
– 命令行、图形、批界面
Operating System Concepts – 7th Edition, Jan 14, 2005
2.6
Silberschatz, Galvin and Gagne ©2005
操作系统服务
 操作系统向程序和用户提供一个环境以执行程序
 程序执行 -程序必须能结束执行,包括正常或不正常
结束(指明错误)
Operating System Concepts – 7th Edition, Jan 14, 2005
2.7
Silberschatz, Galvin and Gagne ©2005
操作系统服务
 操作系统向程序和用户提供一个环境以执行程序
 I/O
操作
 每个设备根据ICH的规范有专用I/O地址
 用户不能直接控制I/O
 BIOS(Basic
Input/Output System,基本输入输出系统),
提供最低级硬件控制的程序,是程序和备间的枢纽
 CPU与外设的交互方式
– 中断处理方式
– io内存(设备寄存器参与内存统一编址)
– io端口(独立地址空间,内存指令不能访问)
Operating System Concepts – 7th Edition, Jan 14, 2005
2.8
Silberschatz, Galvin and Gagne ©2005
操作系统服务
 操作系统向程序和用户提供一个环境以执行程序
 文件系统操作
创建、删除、搜索、列出信息,访问权限
Operating System Concepts – 7th Edition, Jan 14, 2005
2.9
Silberschatz, Galvin and Gagne ©2005
操作系统服务
 操作系统向程序和用户提供一个环境以执行程序

通信 – 进程间可能需要交换信息 (共享内存,消息交换)
 同一台计算机运行的进程间
 网络连接的不同计算机上的进程间
各并发进程之间并不是完全互相独立的
• 竞争共享资源
• 通过数据交换来协调、协作
Operating System Concepts – 7th Edition, Jan 14, 2005
2.10
Silberschatz, Galvin and Gagne ©2005
操作系统服务
 操作系统向程序和用户提供一个环境以执行程序

错误检测 – OS 需要知道可能出现的错误
 可能发生在CPU
或内存硬件(电源失败)、I/O设备(网络
磁盘、打印机)、用户程序(溢出、越界、超时)中
 对于每种类型的错误,OS 应该采取适当的动作以确保正
确和一致的计算
 调试工具可以在很大程度上加强用户和程序员有效使用
系统的能力
Operating System Concepts – 7th Edition, Jan 14, 2005
2.11
Silberschatz, Galvin and Gagne ©2005
操作系统服务
 还有一组操作系统函数通过共享计算机资源提高效率
 资源分配 – 当多个用户或多个作业并发运行时,系统必须
为它们中的每一个分配资源
 统计 – 需要记录哪些用户使用了多少和什么类型的资源
 保护和安全 – 对于保存在多用户或网络连接的计算机系统
中的信息,用户可能需要控制信息的使用
保护即确保所有对系统资源的访问是受控的
Security系统安全 不受外界侵犯,延伸到外部I/O设备不
受非法访问
如果一个系统需要保护和安全,那么系统中的所有部分
都要预防。一条链子的强度与其最弱的链环有关
Operating System Concepts – 7th Edition, Jan 14, 2005
2.12
Silberschatz, Galvin and Gagne ©2005
2.1 操作系统服务
 操作系统向程序和用户提供一个环境以执行程

用户界面

程序执行

I/O 操作

文件系统操作

通信

安全与保护

错误检测
Operating System Concepts – 7th Edition, Jan 14, 2005
2.13
Silberschatz, Galvin and Gagne ©2005
2.2 操作系统用户界面
− 命令行界面 CLI
− 图形界面 GUI
Operating System Concepts – 7th Edition, Jan 14, 2005
2.14
Silberschatz, Galvin and Gagne ©2005
命令解释程序
CLI 允许用户直接输入操作系统完成的命令
 主要作用是获取并执行用户指定的命令
 有时有多种实现方式
– 外壳(shells)
– 命令解释器
– Bourne
shell,C Shell, Korn Shell...
 内核实现:包含代码以执行命令
– rm
file.txt
– 跳转到相应的代码段(rm),设置参数、执行系统调用
 系统程序实现:搜索rm文件,加载代码进内存
– 增加新命令通过创建文件实现,无需修改shell
Operating System Concepts – 7th Edition, Jan 14, 2005
2.15
Silberschatz, Galvin and Gagne ©2005
操作系统用户界面 - GUI
 用户界面友好的桌面接口

通常使用鼠标、键盘和监视器

图标代表文件、程序、系统功能等

不同对象上鼠标按钮导致不同的动作

GUI首次出现在 Xerox PARC
 现在许多系统同时包含CLI和GUI界面

Microsoft Windows使用带有命令行的图形界面

Apple Mac OS X, Aqua, Tiger, Leopard, Lion, Mavericks...

UNIX 使用命令行界面并有多个shell可用

Solaris 是 CLI 界面带有可选的图形界面
Operating System Concepts – 7th Edition, Jan 14, 2005
2.16
Silberschatz, Galvin and Gagne ©2005
2.3 系统调用
 操作系统提供的编程接口(面向程序)
 常用高级语言编写 (C or C++)
 大部分程序通过高层应用程序接口(API)访问,不直接
使用系统调用
 三种常用 APIs:

用于Windows 的Win32 API,

适用于POSIX的系统 (包括几乎所有版本的UNIX, Linux,
和Mac OS X)的POSIX API

用于 Java 虚拟机 (JVM) 的Java API
Operating System Concepts – 7th Edition, Jan 14, 2005
2.17
Silberschatz, Galvin and Gagne ©2005
函数库调用
系统调用
在所有的ANSI C编译器版本中,C库
各操作系统的系统调用是不同的
函数是相同的
它调用函数库中的一段程序(或函数)它调用系统内核的服务
与用户程序相联系
是操作系统的一个入口点
在用户地址空间执行
在内核地址空间执行
它的运行时间属于“用户时间”
它的运行时间属于“系统”时间
需要在用户空间和内核上下文环境间
属于过程调用,调用开销较小
切换,开销较大
在C函数库libc中有大约300个函数
在UNIX中大约有90个系统调用
典型的C函数库调用:system fprintf
典型系统调用:chdir fork write brk
malloc
内核态(内核模式)
用户态(用户模式)
Operating System Concepts – 7th Edition, Jan 14, 2005
2.18
Silberschatz, Galvin and Gagne ©2005
系统调用举例
 拷贝一个文件的内容到另一个文件的系统调用序列
Operating System Concepts – 7th Edition, Jan 14, 2005
2.19
Silberschatz, Galvin and Gagne ©2005
标准 API的例子
 可考虑Win32 API中ReadFile()方法 ,从文件中读取内容
 ReadFile()函数的参数描述如下:





HANDLE file—所要读取的文件
LPVOID buffer—读进写出的数据缓冲
DWORD bytesToRead—将要读入缓冲区的字节数
LPDWORD bytesRead—上次读操作读的字节数
LPOVERLAPPED ovl—指示是否使用重叠 I/O,异步读取?
Operating System Concepts – 7th Edition, Jan 14, 2005
2.20
Silberschatz, Galvin and Gagne ©2005
系统调用实现
 每个系统调用对应一个与其相关的数字

系统调用接口根据这些数字维护一个列表索引
 系统调用接口调用所需的系统调用(操作系统内
核中),并返回系统调用状态及其他返回值
 调用者不需要知道系统调用具体实现

只需遵循API并了解执行系统调用后系统做了什么

通过API操作系统接口,大部分细节对程序员都隐藏起来,
并由执行支持库所管理
Operating System Concepts – 7th Edition, Jan 14, 2005
2.21
Silberschatz, Galvin and Gagne ©2005
API – 系统调用 – OS 之间的关系
只能受限的访问内存,
不允许访问外围设备
陷阱指令
用户程序不能控制在内核态中执行的指令
内核代码
CPU可以访问所有内存数据
CPU可以访问外围设备
Operating System Concepts – 7th Edition, Jan 14, 2005
2.22
Silberschatz, Galvin and Gagne ©2005
标准的C库例子
 C 程序库调用 printf(), 其调用了write()系统调用
printf()
putc()
int write(int,void*,int)
宏STUB
Operating System Concepts – 7th Edition, Jan 14, 2005
2.23
user.h
找不到具体实现
Silberschatz, Galvin and Gagne ©2005
系统调用参数传递(略)
 通常,要提供比所需系统调用识别符更多的信息

信息的类型和数量根据操作系统和调用有所不同
 向操作系统传递参数有三种方法

通过寄存器传递参数 (最简单的)
 一些情况下,参数数量比寄存器多

参数存在内存的块和表中,并将块的地址通过寄存器传递
 Linux
和 Solaris 采用这种方法

参数也可通过程序放在或压入堆栈中,通过操作系统弹出

块或堆栈方法不限制所传递参数的数量或长度
Operating System Concepts – 7th Edition, Jan 14, 2005
2.24
Silberschatz, Galvin and Gagne ©2005
通过表传递参数(略)
Operating System Concepts – 7th Edition, Jan 14, 2005
2.25
Silberschatz, Galvin and Gagne ©2005
2.4 系统调用类型
 进程控制
 文件管理
 设备管理
 信息维护
 通信
Operating System Concepts – 7th Edition, Jan 14, 2005
2.26
Silberschatz, Galvin and Gagne ©2005
MS-DOS 执行状态
(a) 系统启动时
Operating System Concepts – 7th Edition, Jan 14, 2005
(b) 执行程序时
2.27
Silberschatz, Galvin and Gagne ©2005
FreeBSD 运行多个程序
Operating System Concepts – 7th Edition, Jan 14, 2005
2.28
Silberschatz, Galvin and Gagne ©2005
dtrace
 如何找出系统运行瓶颈?
 dtrace:动态跟踪系统性能及其他问题的工具
 Solaris中分散着30,000多的位置指针,也叫探测器probes
,DTrace可激活成千上万的探测器,记录所关注的位
置指定的数据.如命中,即可从该地址显示用户进程或
系统内核的数据,从而了解系统,包括:

任何函数的参数

内核的任何全局变量

函数调用的时间(NS,十亿分之一秒,无任何其他PC/Unix在
ns一级精度)

跟踪堆栈,包括指明函数调用的代码

函数调用时运行的进程

产生函数调用的线程

统计调用次数、磁盘占用等信息
Operating System Concepts – 7th Edition, Jan 14, 2005
2.29
Silberschatz, Galvin and Gagne ©2005
Solaris 10 dtrace 动态跟踪工具
begin{
trace("now begin\n");
}
pid$1::Function:{
ustack();
}
end{
trace("now end\n");
} Concepts – 7th Edition, Jan 14, 2005
Operating System
2.30
Silberschatz, Galvin and Gagne ©2005
2.5 系统程序
提供开发和执行程序的环境
 文件管理 – 创建、删除、复制、重命名、打印、
转储、列出和操作文件和目录
 状态信息

一些程序从系统那里得到状态信息 – 日期、时间、可用
内存、磁盘空间和用户数等

另一些需要提供详细的性能、登录和调试信息

这些信息经格式化后打印到终端、输出设备或文件

有些系统支持注册表 –用于存储和检索配置信息, regedit
Operating System Concepts – 7th Edition, Jan 14, 2005
2.31
Silberschatz, Galvin and Gagne ©2005
系统程序
 文件修改
有多个文件编辑器创建和修改文件
 也有特殊命令用于查找文件内容或完成文本转换
 程序语言支持
 常用程序设计语言的编译程序、汇编程序、调试程
序和解释程序
 程序装入和执行
 加载程序、重定位加载程序、链接编辑器和覆盖式
加载程序,还有高级语言或机器语言的调试程序
 通信
 提供在进程、用户和计算机系统之间创建虚拟链接
的机制。浏览网页、电子邮件、远程登录

Operating System Concepts – 7th Edition, Jan 14, 2005
2.32
Silberschatz, Galvin and Gagne ©2005
2.6 操作系统设计和实现
 OS的设计和实现没有完整的解决方案,但有些方
法还是成功的
 不同操作系统的内部结构也有很大不同
 从定义系统的目标和规格开始
 系统设计受到硬件选择和系统类型的影响
 用户目标 和系统目标

用户目标 – 系统应该方便和容易使用、易学、可靠、
安全和快速

系统目标 – 系统应该容易设计、实现和维护,也应该
灵活、可靠、高效且没有错误
Operating System Concepts – 7th Edition, Jan 14, 2005
2.33
Silberschatz, Galvin and Gagne ©2005
操作系统设计和实现
 区分的重要原则
策略(Policy): case sensitive
机制(Mechanism): case independent
 机制决定如何做, 策略决定做什么

策略与机制的区分对于灵活性来说很重要

策略可能会随时间或位置而有所改变
 实现

高级语言 vs. 汇编 : 性能 vs. 通用性
Operating System Concepts – 7th Edition, Jan 14, 2005
2.34
Silberschatz, Galvin and Gagne ©2005
2.7 系统结构
 MS-DOS
 分层
 微内核
 模块
源代码(万行)
9000
8000
7000
6000
5000
4000
3000
2000
1000
0
Unix V1.0
Operating System Concepts – 7th Edition, Jan 14, 2005
Linux 2.2.0
2.35
Windows 7
Windows VistaSilberschatz,
Mac OS XGalvin and Gagne ©2005
2.7.1 简单结构
 无结构
 早期操作系统:规模小,简单,功能有限
 问题

混乱

难以维护和更新

易受错误或恶意代码伤害

不适合大规模系统开发
Operating System Concepts – 7th Edition, Jan 14, 2005
2.36
Silberschatz, Galvin and Gagne ©2005
MS-DOS 层次结构
 不划分模块
 尽管MS-DOS有某种
结构,其接口和功能
层没有划分清楚
程序错误导致整个系统崩溃
Operating System Concepts – 7th Edition, Jan 14, 2005
2.37
Silberschatz, Galvin and Gagne ©2005
早期 UNIX
 UNIX – 受到硬件功能的限制,原始的UNIX操作系统为
受限结构。 UNIX OS 由两个独立部分组成

系统程序: 用户界面,编译器,系统库...

内核
 接口和驱动程序,硬件上和系统调用接口下的所有部分
 文件系统、CPU调度、内存管理和其他操作系统功能
越来越大,难以管理
Operating System Concepts – 7th Edition, Jan 14, 2005
2.38
Silberschatz, Galvin and Gagne ©2005
2.7.2 层次结构
 操作系统划分为若干层,在低层上构建高层。底层(0层)为硬
件;最高层( N层)为用户层
 考虑模块化,每层只使用低层次的功能和服务
 THE 操作系统 (By Edsger Wybe Dijkstra)
优点: 更灵活、维护效率低
缺点: 影响效率、分层不是普适思想
* File <--> I/O 调用关系
Operating System Concepts – 7th Edition, Jan 14, 2005
2.39
Silberschatz, Galvin and Gagne ©2005
Dijkstra
 Edsger Wybe Dijkstra
− 提出信号量和PV原语
− 解决了“哲学家聚餐”问题
− 最短路径算法(SP)和银行家算法的创造者
− 结构程序设计之父
− THE操作系统的设计者和开发者
 与D.E. Knuth并成为当代最伟大的计算机科学家
Operating System Concepts – 7th Edition, Jan 14, 2005
2.40
Silberschatz, Galvin and Gagne ©2005
2.7.3 微内核
 Fact 1: 服务器对系统稳定性和安全性要求更高
 Fact 2: 代码运行总会出错
Operating System Concepts – 7th Edition, Jan 14, 2005
2.41
Silberschatz, Galvin and Gagne ©2005
2.7.3 微内核
 从核内移出尽可能多的部分到用户空间
 发生在用户模块间的通信使用消息传递形式
 好处:

便于扩充OS

用户空间,不改变内核

内核修改所做的改变小

便于移植操作系统到新架构系统上

更稳定 (更少的代码运行在核心态)

更安全
多数服务是用户态执行
 坏处: 用户空间和内核空间通信的系统开销增加
Operating System Concepts – 7th Edition, Jan 14, 2005
2.42
Silberschatz, Galvin and Gagne ©2005
微内核系统
 第一个微内核系统:CMU的Mach
 Tru64 Unix使用Mach内核
 QNX-基于微内核的实时操作系统
 Windows NT,2000,2003等
Operating System Concepts – 7th Edition, Jan 14, 2005
2.43
Silberschatz, Galvin and Gagne ©2005
2.7.4 模块
 大部分现代操作系统用内核模块来实现

使用面向对象方法

每个核心部件是分开的

每个与其他组件的会话被称为接口

每个组件在需要时被加载到内核
 总体而言,类似于分层方法,但更灵活
Operating System Concepts – 7th Edition, Jan 14, 2005
2.44
Silberschatz, Galvin and Gagne ©2005
Solaris 模块
类似微内核,核心模块提供核心功能及其他模块加载和
通信的相关信息,模块不需要调用消息来通信
Operating System Concepts – 7th Edition, Jan 14, 2005
2.45
Silberschatz, Galvin and Gagne ©2005
Mac OS X 结构
混合结构
Operating System Concepts – 7th Edition, Jan 14, 2005
2.46
Silberschatz, Galvin and Gagne ©2005
iOS
 基于Mac OS X, 增加部分功能性部件
− Cocoa Touch:提供Objective C
API用于开发apps
− Media Services:图像/音视频服务
− Core Services:提供云计算、数据
库等服务
Cocoa Touch
Media Service
Core Services
Core OS
− Core OS: Mac OS X内核
Operating System Concepts – 7th Edition, Jan 14, 2005
2.47
Silberschatz, Galvin and Gagne ©2005
2.8 虚拟机 Virtual Machines
 虚拟机:一种通过软件模拟实现,具有完整硬件
系统功能,并运行在一个完全隔离环境中的完整
计算机系统
 物理计算机资源共享以创建虚拟机
 每个虚拟机同其他虚拟机隔离
 由于需要对物理机器进行精确复制,虚拟机实现
困难
 上个世纪60年代,虚拟机用于大型机

IBM VM操作系统
Operating System Concepts – 7th Edition, Jan 14, 2005
2.48
Silberschatz, Galvin and Gagne ©2005
虚拟机实现
 高级语言虚拟机

模拟代码执行

目的:跨平台
 工作站虚拟机

Guest OS

面向工作站、PC

目的:多个操作系统可以同时在一个计算机上使用
 服务器虚拟机

多用户、多操作系统并存

目的:把一个物理计算机虚拟化为多个虚拟机
Operating System Concepts – 7th Edition, Jan 14, 2005
2.49
Silberschatz, Galvin and Gagne ©2005
高级语言虚拟机
 目前,有上百种不同的高级语言虚拟机
 JAVA虚拟机-JVM

JAVA VM

Oracle Hotspot VM

IBM J9 VM

Zing VM

CLDC-HI

Dalvik VM
50
Operating System Concepts – 7th Edition, Jan 14, 2005
2.50
Silberschatz, Galvin and Gagne ©2005
Java 虚拟机
 Java虚拟机(JVM):JAVA语言的解释器

可运行Java代码的假想计算机

只要根据JVM规格将解释器移植到特定的操作系统上,
就能运行经过编译的任何Java代码

特点:平台无关性
Operating System Concepts – 7th Edition, Jan 14, 2005
2.51
Silberschatz, Galvin and Gagne ©2005
工作站虚拟机
 工作站虚拟机:操作系统上的虚拟机

宿主操作系统(Host OS):安装在硬件上的OS

客户操作系统(Guest OS)安装在操作系统上的操
作系统

工作站虚拟机安装在宿主操作系统上,在工作站虚拟
机中可以安装客户操作系统
 好处

同时在一个计算机上使用多个操作系统

一个宿主操作系统,若干个客户操作系统
52
Operating System Concepts – 7th Edition, Jan 14, 2005
2.52
Silberschatz, Galvin and Gagne ©2005
虚拟机工作站软件
 VMWare Station
 Virtual Box
 Virtual PC
 Parallels Desktop
53
Operating System Concepts – 7th Edition, Jan 14, 2005
2.53
Silberschatz, Galvin and Gagne ©2005
VMware Station
Operating System Concepts – 7th Edition, Jan 14, 2005
2.54
Silberschatz, Galvin and Gagne ©2005
运行例子
Windows 7
Mac OS X
Operating System Concepts – 7th Edition, Jan 14, 2005
2.55
Silberschatz, Galvin and Gagne ©2005
服务器虚拟机
 服务器虚拟化:将服务器物理资源抽象成逻辑资源
,让一台服务器变成几台甚至上百台相互隔离的虚
拟服务器
 常用模式:


一虚多:一台服务器虚拟成多台服务器虚拟机
多虚一:多个独立物理服务器虚拟为一个服务器虚拟机
VM1
 优点

安全性好

资源共享

可扩展性好

便于隔离

相价比高
Operating System Concepts – 7th Edition, Jan 14, 2005
VM2
VM3
VM4
VM5
2.56
Silberschatz, Galvin and Gagne ©2005
服务器虚拟机架构
57
Operating System Concepts – 7th Edition, Jan 14, 2005
2.57
Silberschatz, Galvin and Gagne ©2005
Vmware vSphere
Operating System Concepts – 7th Edition, Jan 14, 2005
2.58
Silberschatz, Galvin and Gagne ©2005
使用例子
Operating System Concepts – 7th Edition, Jan 14, 2005
2.59
Silberschatz, Galvin and Gagne ©2005
虚拟机(续)
 物理计算机的资源被共享,以创建虚拟机

CPU调度使得用户好像有自己的处理器

Spooling和文件系统提供了虚拟卡片阅读机和打印机

普通用户终端成为虚拟机操作员的控制台
Operating System Concepts – 7th Edition, Jan 14, 2005
2.60
Silberschatz, Galvin and Gagne ©2005
虚拟机(续)
Non-virtual Machine
Operating System Concepts – 7th Edition, Jan 14, 2005
Virtual Machine
2.61
Silberschatz, Galvin and Gagne ©2005
虚拟机的优缺点
 虚拟机概念提供对系统资源的完全保护,因为每个虚拟
机同其他虚拟机隔离。当然,隔离不允许直接共享资源
 虚拟机是研发操作系统的完美载体。系统开发在虚拟机
上而不是在物理硬件上完成,从而不会打扰正常系统运
行
 由于需要对下面的机器进行精确的复制,所以虚拟机的
概念实现困难
Operating System Concepts – 7th Edition, Jan 14, 2005
2.62
Silberschatz, Galvin and Gagne ©2005
VMware 结构
Operating System Concepts – 7th Edition, Jan 14, 2005
2.63
Silberschatz, Galvin and Gagne ©2005
Java 虚拟机
Operating System Concepts – 7th Edition, Jan 14, 2005
2.64
Silberschatz, Galvin and Gagne ©2005
系统生成
 操作系统被设计成能运行在一类计算机上;系统必须
为每个特定的计算机场所进行配置
 SYSGEN 程序获得硬件系统特定配置的相关信息
 引导(Booting) – 通过装载内核启动计算机
 引导程序(Bootstrap program) –存在ROM中的代码,这
段能够定位内核,将它装入内存并运行
Operating System Concepts – 7th Edition, Jan 14, 2005
2.65
Silberschatz, Galvin and Gagne ©2005
系统启动
 操作系统必须被硬件所用,使硬件可以启动它

一小块代码 – 引导转载程序,定位内核,将它装入内
存,并运行

有时采用两步完成:在固定位置加载引导程序的引导块

当电源初始化系统时,开始在一个固定的内存位置执行
 固件用于保存初始引导代码
Operating System Concepts – 7th Edition, Jan 14, 2005
2.66
Silberschatz, Galvin and Gagne ©2005
End of Chapter 2
Operating System Concepts – 7th Edition, Jan 14, 2005
2.67
Silberschatz, Galvin and Gagne ©2005
Download