当前位置:首页 > 计算机操作系统实验指导书
《操作系统管理》实验指导书
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
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
共分享92篇相关文档