计算机操作系统实验指导书 联系客服

发布时间 : 星期五 文章计算机操作系统实验指导书更新完毕开始阅读8f9190d380eb6294dd886c81

《操作系统管理》实验指导书

Reserved Reserved Reserved Reserved 2)从上述输出结果,对照分析清单5-2的程序,请简单描述程序运行的流程: ____________________________________________________________________ ________________________________________________________________________ ________________________________________________________________________ ________________________________________________________________________ ________________________________________________________________________ ________________________________________________________________________

2. 虚拟内存的分配与释放

能正确使用系统函数GetMeoryStatus()和数据结构MEMORY_STATUS了解系统内存和虚拟存储空间使用情况,会使用VirsualAlloc()函数和VirsualFree()函数分配和释放虚拟内存空间。

// GetMemoryStatus.cpp : Defines the entry point for the console application.

//

#include \

#include \

#ifdef _DEBUG

#define new DEBUG_NEW #undef THIS_FILE

static char THIS_FILE[] = __FILE__; #endif

void GetMemSta(void);

//The one and only application object CWinApp theApp; using namespace std;

int _tmain(int argc,TCHAR * argv[],TCHAR * envp[]) {

int nRetCode=0; LPVOID BaseAddr; char *str;

GetMemSta();

printf(\

BaseAddr=::VirtualAlloc(NULL,1024*1024*32,MEM_RESERVE|MEM_COMMIT,PAGE_READWRITE);//分配虚拟内存

if (BaseAddr==NULL) printf(\

str=(char *)malloc(1024*1024*2); //分配内存 GetMemSta(); printf(\

if (::VirtualFree(BaseAddr,0,MEM_RELEASE)==0) //释放虚拟内存 printf(\

free(str); //释放内存

38

《操作系统管理》实验指导书

GetMemSta(); return nRetCode;

}

void GetMemSta(void) {

MEMORYSTATUS MemInfo; GlobalMemoryStatus(&MemInfo);

printf(\

printf(\ printf(\ printf(\ printf(\ printf(\ printf(\ printf(\ }

步骤1:在VC 6.0环境下选择Win32 Console Application建立一个控制台工程文件,选择An application that Supports MFC。

步骤2:编辑并编译完成后,单击“Build”菜单中的“Build GetMemoryStatus.exe”命令,建立GetMemoryStatus.exe可执行文件。

操作能否正常进行?如果不行,则可能的原因是什么?

____________________________________________________________________ ________________________________________________________________________ 步骤3:在工具栏单击“Execute Program”按钮,执行GetMemoryStatus.cpp.exe程序。 分析程序GetMemoryStatus.cpp的运行结果

1) 请描述运行结果 (如果运行不成功,则可能的原因是什么?) :

________________________________________________________________________ ________________________________________________________________________ ________________________________________________________________________ ________________________________________________________________________ ________________________________________________________________________ 2) 根据运行输出结果,若要改变分配和回收的虚拟内存和物理内存的大小,要改变程序代码的语句,分别为:

________________________________________________________________________ ________________________________________________________________________

3) 根据运行输出结果,对照分析4-2程序,可以看出程序运行的流程吗?请简单描述: ________________________________________________________________________ ________________________________________________________________________ ________________________________________________________________________ ________________________________________________________________________ ________________________________________________________________________

39

《操作系统管理》实验指导书

实验四 设备管理

[1] 磁盘I/O API函数应用

背景知识

相关的API 介绍

1.获取磁盘的基本信息的磁盘I/O API函数DeviceIoControl格式如下:

BOOL DeviceIoControl( HANDLE hDevice, DWORD dwioControlCode, LPVOID lplnBuffer, DWORD nlnBufferSize, LPVOID lpOutBuffer, DWORD nOutBufferSize,

LPDWORD lpBytesReturned,LPOVERLAPPED lpOverlapped ); .hDevice:所要进行操作的设备的句柄,它通过调用CreateFile函数来获得。

.dwIoControlCode:指定操作的控制代码。这个值用来辨别将要执行的指定的操作,以及对哪一种设备进行操作。对磁盘应设置为IOCTL_DISK_GET_DRIVE_GEOMETRY。

.lpInBuffer:操作所要的输入数据缓冲区指针,NULL表示不需要输入数据。 .nInBufferSize:指定lpInBuffer所指向的缓冲区的大小(以字节为单位)。

.lpOutBuffer:接收操作输出的数据缓冲区指针,NULL表示操作没有产生输出数据。输出数据的缓冲区要足够大,对磁盘它采用固定的数据结构DISK_GEOMETRY,格式如下:

struct DISK_GEOMETRY {

unsigned bytesPerSector; unsigned sectorsPerTrack; unsigned heads; unsigned cylinders; }

.nOutBufferSize:指定lpOutBuffer所指向的缓冲区的大小(以字节为单位)。 .lpBytesReturned:指向一个变量,它接收lpOutBuffer所指的缓冲区储存的数据个数。 .lpOverlapped:指向一个OVERLAPPED结构。

返回值:如果函数调用成功,返回值是一个非0值。如果函数调用失败GetLastError函数来获得相关的错误信息。

2.建立文件或打开一个已存在文件API函数CreateFile

该函数用来创建或打开下列对象(文件、管道、目录、邮件插口、控制台、通信资源、磁盘设备等)并返回一个用于读取该对象的句柄。

HANDLE CreateFile ( LPCTSTR lpFilename , DWORD dwDesiredAccess ,

DWORD dwShareMode ,LPSECURITY_ATTRIBUTES lpSecurityAttributes , DWORD dwCreationDisposition , DWORD dwFlagsAndAttributes , HANDLE hTemplateFile );

.lpFileName:指向一个以NULL结束的字符串的指针,该字符串用于创建或打开对象、指定对象名。

.dwDesiredAccess:指定对对象的访问类型,一个应用程序可以得到读、写、读写或设备查询访问等类型,此参数可以为下列值的任意一个组合值:

.0:指定对象的查询访问权限,一个应用程序可以不通过访问设备来查询设备属性。 .GENERIC_READ:指定对象的读访问,可以读文件的数据且可移动文件中的指针。

.GENERIC_WRITE:指定对象的写访问,可以写文件的数据且可以移动文件指针,写访问GENERIC_WRITE要与GENERIC_READ联合使用。 .dwShoreMode:设成NULL即可。

.lpSecurityAttributes:设成NULL即可。

40

《操作系统管理》实验指导书

.dwCreationDisposition:指定对存在的文件采取哪种措施,且当文件不存在时采用哪种措施,此函数必须是下列值中的一个:

.CREAT_NEW:创建一个新文件,如果文件存在,则函数调用失败。

.CREAT_ALWAYS:创建一个新文件,如果文件存在,函数重写文件且清空现有属性。 .OPEN_EXISTING:打开文件,如果文件不存在,则函数调用失败。

.OPEN_ALWAYS:如果文件存在,则打开文件。如果文件不存在,则创建一个新文件。 .TRUNCATE_EXISTING:打开文件,一旦文件打开,就被删截掉,从而使文件的大小为0字节,调用函数必须用GENERIC_WRITE访问来打开文件,如果文件不存在,则函数调用失败。 .dwFlagsAndAttributes:指定文件属性和标志,该参数可取很多种组合,以下示三种: .FILE_FLAG_OVERLAPPED:指导系统对对象进行初始化,以便操作有足够的时间来处理返回ERROR_IO_PENDING,当完成操作时,指定事件被设置为发信号状态。

.FILE_FLAG_NO_BUFFERING:引导系统打开没有瞬间缓冲或缓存的文件,当与FILE_FLAG_0VERLAPPED结合时,标志给出最大的按时间顺序的操作,因为I/O不依靠内存管理器的时间顺序的操作,但是,因为数据没有在缓存中,一些I/O操作将长一些。

.FILE_FLAG_SEQUENTIAL_SCAN:表明文件从开头到结尾按顺序被访问。使用它,系统可 优化文件缓存。访问方式读大文件的应用程序,指定此标志可以增加它的性能。 .hTemplateFile:设成NULL即可。

返回值:如果函数调用成功,返回值为指向指定文件的打开句柄;如果函数调用失败,返回值为INVALID_HANDLE_VALUE。 实验目的

本实验着重于了解磁盘的物理组织,以及如何通过用户态的程序直接调用磁盘I/O API函数(DeviceIoControl)根据输入的驱动器号读取驱动器中磁盘的基本信息,在Windows2000环境进行。

实验内容与参考源代码:

SoftDiskIo-1.cpp

#include #include #include #include

struct Disk //关于Disk结构的定义 {

HANDLE handle;

DISK_GEOMETRY disk_info; };

Disk disk;

HANDLE Floppy; static _int64 sector; bool flag;

Disk physicDisk(char driverLetter);

void main(void)

41