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與許可權掩碼...