Linux作業系統程式設計 實驗五 塊裝置實驗

2022-05-03 07:06:08 字數 3816 閱讀 7649

1、了解linux塊裝置管理機制

2、學習塊裝置的基本管理

3、編寫乙個簡單的塊裝置驅動程式sbull,實現一套記憶體中的虛擬磁碟驅動器

4、通過操作驗證塊裝置驅動器

5、實驗內容:

編寫乙個簡單的塊裝置驅動程式:

通過實際操作驗證塊裝置驅動

我的虛擬機器版本cenos 7.8 x64,核心版本3.10.0-1127.el7.x86_64。

切換到root許可權,隨後編寫sbull.c和makefile

#include //module_author,module_license等

#include //alloc_disk

#include //blk_init_queue

#include //register_blkdev,unregister_blkdev

#include //u_char,u_short

#include #include #include #include #include #include //kmap kunmap

#include #include #include #define ramblk_size (1024*1024*2)//分配的記憶體2mb大小空間

/*bio代表乙個io請求,裡面有io請求的所有資訊

request是bio提交給io排程器產生的資料,乙個request放著順序排列的bio

request_queue代表著乙個物理裝置,順序的放著request

*/static struct gendisk * ramblk_disk = null;/*gendisk表示乙個獨立的磁碟裝置,核心還可以用它來表示分割槽*/

static struct request_queue * ramblk_request_queue = null;

static int major = 0;//塊裝置的主裝置號

static define_spinlock(ramblk_spinlock);//定義並初始化乙個自旋鎖

static char * ramblk_buf = null;//申請的記憶體起始位址

/*上面定義位址是用到char *,是十分有用的。類似於list中container_of一樣*/

int ramblk_getgeo(struct block_device * blk_dev, struct hd_geometry * hg)

/*如果說file_operation結構是連線虛擬的vfs檔案的操作與具體檔案系統的檔案操作之間的樞紐,那麼block_device_operations就是連線抽象的塊裝置操作與具體塊裝置操作之間的樞紐。

*/static const struct block_device_operations ramblk_fops = ;

static void ramblk_make_request(struct request_queue *q, struct bio *bio)

kunmap(bvec->bv_page);

disk_mem += bvec->bv_len;

} bio_endio(bio, 0);//bio中所有的bio_vec處理完後報告處理結束}

static int ramblk_init(void)

/*使用製造請求的方式,先分配queue*/

ramblk_request_queue = blk_alloc_queue(gfp_kernel);

/*在繫結請求製造函式*/

blk_queue_make_request(ramblk_request_queue, ramblk_make_request);

disk = ramblk_disk = alloc_disk(16);//minors=分割槽+1

// 2.2 設定disk的其他資訊,比如容量、主裝置號等

//設定主裝置號

ramblk_disk->major = major;

ramblk_disk->first_minor = 0;//設定第乙個次裝置號

ramblk_disk->minors=1;//設定最大的次裝置號,=1表示磁碟不能被分割槽

sprintf(ramblk_disk->disk_name, "sbull%c", 'a');//設定裝置名

ramblk_disk->fops = &ramblk_fops;//設定fops 設定前面表述的各種裝置操作

ramblk_disk->queue = ramblk_request_queue;//設定請求佇列

set_capacity(ramblk_disk, ramblk_size/512);//設定容量

// 3.硬體相關的操作

ramblk_buf = (char*)vmalloc(ramblk_size);//申請ramblk_size記憶體

// 4.註冊

add_disk(ramblk_disk);//add partitioning information to kernel list

printk("ramblk_init.\n");

return 0;}

static void ramblk_exit(void)

module_init(ramblk_init);//入口

module_exit(ramblk_exit);//出口

module_author("hustcs");

module_license("dual bsd/gpl");

ifneq ($(kernelrelease),)

obj-m += sbull.o

else

pwd := $(shell pwd)

kver ?= $(shell uname -r)

kdir := /usr/src/kernels/$(kver)

all:

@$(make) -c $(kdir) m=$(pwd)

clean:

@rm -rf .*.cmd *.o *.mod.c *.ko *.symvers *.ko.unsigned *.order

endif

執行make命令

安裝核心模組sbull.ko,然後在已安裝的模組中查詢sbull

使用指令dmesg,檢視核心輸出資訊

檢視模組資訊

獲取裝置列表

檢視sbulla資料夾

檢視sbull裝置資訊

格式化sbull裝置

建立掛載點並掛載該裝置

進入目錄/mnt/sbull,並嘗試建立乙個檔案

作業系統實驗五

實驗內容 理髮店問題 假設理髮店的理髮室中有3個理髮椅子和3個理髮師,有乙個可容納4個顧客坐等理髮的沙發。此外還有一間等候室,可容納13位顧客等候進入理髮室。顧客如果發現理髮店中顧客已滿 超過20人 就不進入理髮店。在理髮店內,理髮師一旦有空就為坐在沙發上等待時間最長的顧客理髮,同時空出的沙發讓在等...

作業系統實驗五

16281271 巫勐 本實驗要求在模擬的i o系統之上開發乙個簡單的檔案系統。使用者通過create,open,read等命令與檔案系統互動。檔案系統把磁碟視為順序編號的邏輯塊序列,邏輯塊的編號為0至l 1。i o系統利用記憶體中的陣列模擬磁碟。實際物理磁碟的結構是多維的 有柱面 磁頭 扇區等概念...

Linux系統程式設計(八)目錄作業系統呼叫

包含標頭檔案 include include 函式原型 int mkdir const char pathname,mode t mode 引數 返回值 chmod 示例程式 include include include intmain return0 編譯執行結果,檔案許可權0777與許可權掩碼...