⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 disk.h

📁 美国加州大学操作系统课程实验平台Nachos
💻 H
字号:
// disk.h //	Data structures to emulate a physical disk.  A physical disk//	can accept (one at a time) requests to read/write a disk sector;//	when the request is satisfied, the CPU gets an interrupt, and //	the next request can be sent to the disk.////	Disk contents are preserved across machine crashes, but if//	a file system operation (eg, create a file) is in progress when the //	system shuts down, the file system may be corrupted.////  DO NOT CHANGE -- part of the machine emulation//// Copyright (c) 1992-1993 The Regents of the University of California.// All rights reserved.  See copyright.h for copyright notice and limitation // of liability and disclaimer of warranty provisions.#ifndef DISK_H#define DISK_H#include "copyright.h"#include "utility.h"#include "callback.h"// The following class defines a physical disk I/O device.  The disk// has a single surface, split up into "tracks", and each track split// up into "sectors" (the same number of sectors on each track, and each// sector has the same number of bytes of storage).  //// Addressing is by sector number -- each sector on the disk is given// a unique number: track * SectorsPerTrack + offset within a track.//// As with other I/O devices, the raw physical disk is an asynchronous device --// requests to read or write portions of the disk return immediately,// and an interrupt is invoked later to signal that the operation completed.//// The physical disk is in fact simulated via operations on a UNIX file.//// To make life a little more realistic, the simulated time for// each operation reflects a "track buffer" -- RAM to store the contents// of the current track as the disk head passes by.  The idea is that the// disk always transfers to the track buffer, in case that data is requested// later on.  This has the benefit of eliminating the need for // "skip-sector" scheduling -- a read request which comes in shortly after // the head has passed the beginning of the sector can be satisfied more // quickly, because its contents are in the track buffer.  Most // disks these days now come with a track buffer.//// The track buffer simulation can be disabled by compiling with -DNOTRACKBUFconst int SectorSize = 128;		// number of bytes per disk sectorconst int SectorsPerTrack  = 32;	// number of sectors per disk track const int NumTracks = 32;		// number of tracks per diskconst int NumSectors = (SectorsPerTrack * NumTracks);					// total # of sectors per diskclass Disk : public CallBackObj {  public:    Disk(CallBackObj *toCall);          // Create a simulated disk.  					// Invoke toCall->CallBack() 					// when each request completes.    ~Disk();				// Deallocate the disk.        void ReadRequest(int sectorNumber, char* data);    					// Read/write an single disk sector.					// These routines send a request to     					// the disk and return immediately.    					// Only one request allowed at a time!    void WriteRequest(int sectorNumber, char* data);    void CallBack();			// Invoked when disk request 					// finishes. In turn calls, callWhenDone.    int ComputeLatency(int newSector, bool writing);	    					// Return how long a request to 					// newSector will take: 					// (seek + rotational delay + transfer)  private:    int fileno;				// UNIX file number for simulated disk     char diskname[32];			// name of simulated disk's file    CallBackObj *callWhenDone;		// Invoke when any disk request finishes    bool active;     			// Is a disk operation in progress?    int lastSector;			// The previous disk request     int bufferInit;			// When the track buffer started 					// being loaded    int TimeToSeek(int newSector, int *rotate); // time to get to the new track    int ModuloDiff(int to, int from);        // # sectors between to and from    void UpdateLast(int newSector);};#endif // DISK_H

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -