資源簡介
本資源含所有三個任務的源代碼,采用Visual Studio.NET 2003的C++與MFC編寫(前端有圖形化界面),供各位參考。
課程設計目的
本設計的目的是實現操作系統和相關系統軟件的設計,其中涉及進程編程、I/O操作、存儲管理、文件系統等操作系統概念。
課程設計要求
(1)對進行認真分析,列出實驗具體步驟,寫出符合題目要求的程序清單,準備出調試程序使用的數據。
(2)以完整的作業包的形式提交原始代碼、設計文檔和可運行程序。提交的光盤應當包括:設計題目,程序清單,運行結果分析,所選取的算法及其優缺點,以及通過上機取得了哪些經驗。程序清單要求格式規范,注意加注釋(包含關鍵字、方法、變量等),在每個模塊前加注釋,注釋不得少于20%。課程設計要求同時上交打印文檔,設計報告包括設計題目,算法分析,關鍵代碼及其數據結構說明,運行結果分析以及上機實踐的經驗總結。
設計一:
設計任務:模擬Linux文件系統
在任一OS下,建立一個大文件,把它假象成一張盤,在其中實現一個簡單的模擬Linux文件系統。
在現有機器硬盤上開辟100M的硬盤空間,作為設定的硬盤空間。
編寫一管理程序simdisk對此空間進行管理,以模擬Linux文件系統,要求:
盤塊大小1k
空閑盤塊的管理:Linux位圖法
結構:超級塊, i結點區, 根目錄區
該simdisk管理程序的功能要求如下:
info: 顯示整個系統信息(參考Linux文件系統的系統信息),文件可以根據用戶進行讀寫保護。目錄名和文件名支持全路徑名和相對路徑名,路徑名各分量間用“/”隔開。
cd …: 改變目錄:改變當前工作目錄,目錄不存在時給出出錯信息。
dir …: 顯示目錄:顯示指定目錄下或當前目錄下的信息,包括文件名、物理地址、保護碼、文件長度、子目錄等(帶/s參數的dir命令,顯示所有子目錄)。
md …: 創建目錄:在指定路徑或當前路徑下創建指定目錄。重名時給出錯信息。
rd …: 刪除目錄:刪除指定目錄下所有文件和子目錄。要刪目錄不空時,要給出提示是否要刪除。
newfile …: 建立文件。
cat …: 打開文件。
copy …: 拷貝文件,除支持模擬Linux文件系統內部的文件拷貝外,還支持host文件系統與模擬Linux文件系統間的文件拷貝,host文件系統的文件命名為…,如:將windows下D:盤的文件\data\sample\test.txt文件拷貝到模擬Linux文件系統中的/test/data目錄,windows下D:盤的當前目錄為D:\data,則使用命令:
simdisk copy D:\data\sample\test.txt /test/data
或者:simdisk copy D:sample\test.txt /test/data
del …: 刪除文件:刪除指定文件,不存在時給出出錯信息。
check: 檢測并恢復文件系統:對文件系統中的數據一致性進行檢測,并自動根據文件系統的結構和信息進行數據再整理。
程序的總體流程為:
初始化文件目錄;
輸出提示符,等待接受命令,分析鍵入的命令;
對合法的命令,執行相應的處理程序,否則輸出錯誤信息,繼續等待新命令,直到鍵入EXIT退出為止。
設計二:
設計任務:模擬文件系統的前端操作shell
實現一個簡單的shell(命令行解釋器)。
將設計一的管理程序simdisk作為后臺進程運行,利用本設計任務的shell操作simdisk。
本設計任務在于學會如何實現在前端的shell進程和后端的simdisk進程之間利用共享內存進行進程間通信(IPC)。
設計三:
設計任務:模擬文件系統的操作管理
實現多個進程同時對模擬文件系統進行操作。設計管理程序simdisk的用戶訪問權限管理。訪問模擬文件系統的每個進程都屬于某個用戶,管理程序simdisk根據其訪問權限決定其對模擬文件系統的操作。
對模擬文件系統的操作要求做到:共享讀,互斥寫。
本設計任務在于學會如何實現信息的安全管理和進程同步。
注:要求從課程設計的整體來考慮設計任務一、二、三,并分階段實現。
代碼片段和文件信息
/*?alloc.cpp
虛擬磁盤空間分配與釋放相關函數的實現?*/
#include?“simdisk.h“
//在虛擬磁盤中分配i-節點,返回分配到的結點號
int?alloc_inode()
{
int?nIndex?nInodeIndex?=?-1;
int?nTemp?i?j;
//檢查是否有足夠的空間用于分配
for(i?=?0;?i? {
for(j?=?0;?j? {
nTemp?=?(int)bgBlockGroups[i].gdInfos.nInodeBmp?+?j;
if(bsInodeBmp[nTemp]?==?NOT_USED)
{
nIndex?=?i;
nInodeIndex?=?nTemp;
break;
}
}
if(nInodeIndex?!=?-1)
break;
}
//分配成功,則修改相應的信息
if(nInodeIndex?!=?-1)
{
for(i?=?0;?i? bgBlockGroups[i].sbBlocks.nFreeInodes?-=?1;
bgBlockGroups[nIndex].gdInfos.nFreeInodesNum?-=?1;
bsInodeBmp[nInodeIndex]?=?USED;
}
return?nInodeIndex;
}
//在虛擬磁盤中釋放i-結點
void?free_inode(unsigned?int?nInode)
{
int?i;
//清除相應的信息
for(i?=?0;?i? bgBlockGroups[i].sbBlocks.nFreeInodes?+=?1;
bgBlockGroups[nInode?/?BLOCKS_EACH].gdInfos.nFreeInodesNum?+=?1;
bsInodeBmp[nInode]?=?NOT_USED;
}
//在虛擬磁盤中數據塊位圖?nIndex?處分配數據塊空間,返回分配得到的空間的首地址
long?alloc_block(unsigned?int?nLen?unsigned?int?&nIndex)
{
long?lAddr?=?-1;
//磁盤空間不足
if(bgBlockGroups[0].sbBlocks.nFreeBlocks?
int?ij;
int?nCount?=?0; //連續空閑盤塊數
int?nAvailIndex?=?0; //可用數據塊位置索引
int?nBlockGroupIndex?=?0; //首個數據塊組的位置索引
bool?bBlockGroup[BLOCK_GROUPS_NUM]; //數據組的組信息需要修改
int?nBlockGroupNum[BLOCK_GROUPS_NUM]; //用了多少塊
for(i?=?0;?i? {
bBlockGroup[i]?=?false;
nBlockGroupNum[i]?=?0;
}
for(i?=?0;?i? {
if(nCount?==?0)
if((int)bgBlockGroups[i].gdInfos.nFreeBlocksNum? for(j?=?0?;?j? {
if(bsBlockBmp[(bgBlockGroups[i].gdInfos.nBlockBmp?+?j)]?==?NOT_USED)
{
nCount++;
bBlockGroup[i]?=?true;
nBlockGroupNum[i]++;
if(nCount?==?1)
{
lAddr?=?bgBlockGroups[i].gdInfos.lBlockAddr?+?j?*?BLOCK_SIZE;
nAvailIndex?=?i?*?BLOCKS_EACH?+?j;
nIndex?=?nAvailIndex;
nBlockGroupIndex=i;
}
}
else //沒有連續的
{
//還原,重新開始
nCount?=?0;
if(j?==?0?&&?(i?-?1)?>=?0?&&?bBlockGroup[i?-?1])
{
bBlockGroup[i?-?1]?=?false;
nBlockGroupNum[i?-?1]?=?0;
}
bBlockGroup[i]?=?false;
nBlockGroupNum[i]?=?0;
}
if(nCount?==?nLen)?break;
}
if(nCount?==?nLen)?break;
}
if(nCount?!=?nLen)
{
lAddr?=?-1;
return?lAddr;
}
//分配成功,則修改相應的信息
for(i?=?0;?i? bgBlockGroups[i].sbBlocks.nFreeBlocks?-=?nLen;
j?=?nAvailIndex?+?nLen;
for(i?=?nAvailIndex;i? bsBlockBmp[i]?=?USED;
for(i?=?nBlockGroupIndex;i? if(bBlockGroup[i])?bgBlockGroups[i].gdInfos.nFreeBlocksNum?-=?nBlockGroupNum[i];
return?lAddr;
}
//在虛擬磁盤中數據塊位圖?nIndex?處釋放數據塊
void?free_block(unsigned?int?nLen?unsigned?int?nIndex)
{
unsigned?int?i;
unsigned?int?nBlockEnd?=?nIndex?+?nLen; //計算結尾地址
unsigned?int?nBlockGroup[BLOCK_GROUPS_NUM]; //
評論
共有 條評論