块设备驱动介绍
以下內(nèi)容源于朱有鵬《物聯(lián)網(wǎng)大講堂》課程的學(xué)習(xí),如有侵權(quán),請(qǐng)告知?jiǎng)h除。
一、正確理解塊設(shè)備驅(qū)動(dòng)的概念
1、塊設(shè)備和字符設(shè)備的差異
- 塊和字符是兩種不同的訪問設(shè)備的策略;
- 同一個(gè)設(shè)備可以同時(shí)支持塊和字符兩種訪問策略;
- 設(shè)備本身的物理特性決定了哪一種訪問策略更適合;
- 塊設(shè)備本身驅(qū)動(dòng)層支持緩沖區(qū),而字符設(shè)備驅(qū)動(dòng)層沒有緩沖;
- 塊設(shè)備驅(qū)動(dòng)最適合存儲(chǔ)設(shè)備。
2、塊設(shè)備驅(qū)動(dòng)的特點(diǎn)
- 字符設(shè)備只能順序訪問(如串口發(fā)送數(shù)據(jù)順序),而塊設(shè)備可以隨機(jī)訪問(不連續(xù)塊訪問);
- 傳統(tǒng)的機(jī)械式塊設(shè)備(如硬盤、DVD)可以隨機(jī)訪問,但是連續(xù)訪問效率更高,因此塊設(shè)備驅(qū)動(dòng)中有排序邏輯將用戶的隨機(jī)訪問重新調(diào)整成盡量連續(xù)訪問以提升效率;
- 電磁設(shè)備Nand、SD卡等隨機(jī)訪問效率等同于順序訪問;
- 塊設(shè)備驅(qū)動(dòng)和字符設(shè)備驅(qū)動(dòng)不同,應(yīng)用層對(duì)塊設(shè)備驅(qū)動(dòng)的訪問一般不是直接操作設(shè)備文件(/dev/block/xxx,或者/dev/sdax),而是通過文件系統(tǒng)來簡(jiǎn)潔操作。(思考裸機(jī)階段時(shí)刷機(jī)燒錄SD卡時(shí)說過的對(duì)SD卡的2種訪問:文件系統(tǒng)下訪問和扇區(qū)級(jí)訪問)
3、塊設(shè)備相關(guān)的幾個(gè)單位
(1)扇區(qū)(Sector)
- 概念來自于早期磁盤,在硬盤、DVD中還有用,在Nand/SD中已經(jīng)沒意義了。
- 扇區(qū)是塊設(shè)備本身的特性,大小一般為512的整數(shù)倍,因?yàn)闅v史原因很多時(shí)候都向前兼容定義為512。
(2)塊(block)
- 概念來自于文件系統(tǒng),是內(nèi)核對(duì)文件系統(tǒng)數(shù)據(jù)處理的基本單位,大小為若干個(gè)扇區(qū),常見有512B、1KB、4KB等
(3)段(Section)
- 概念來自于內(nèi)核,是內(nèi)核的內(nèi)存管理中一個(gè)頁或者部分頁,由若干個(gè)連續(xù)為塊組成。
(4)頁(Page)
- 概念來自于內(nèi)核,是內(nèi)核內(nèi)存映射管理的基本單位。linux內(nèi)核的頁式內(nèi)存映射名稱來源于此。
(5)總結(jié):塊設(shè)備驅(qū)動(dòng)對(duì)下以Sector為單位管理塊設(shè)備,對(duì)上以Block為單位和文件系統(tǒng)交互。
二、塊設(shè)備驅(qū)動(dòng)框架簡(jiǎn)介
1、塊設(shè)備驅(qū)動(dòng)框圖
(1)VFS
- 虛擬文件系統(tǒng),是文件系統(tǒng)的抽象,對(duì)上可以接各種文件系統(tǒng),是一對(duì)多的關(guān)系,是分層理論。
(2)通用塊層
- 對(duì)所有塊設(shè)備都適用,屏蔽了不同硬件的差異。類似于字符設(shè)備驅(qū)動(dòng)框架的第一部分。
(3)IO調(diào)度層(電梯算法)
- 有別于其他設(shè)備的地方。這里提供了合并、排序等機(jī)制。
- 讀寫相當(dāng)于電梯上、下的操作。
(4)塊設(shè)備驅(qū)動(dòng)層(真正硬件操作部分)
2、重點(diǎn)結(jié)構(gòu)體
(1)struct request,對(duì)設(shè)備的每一次操作(譬如讀或者寫一個(gè)扇區(qū))
(2)struct request_queuerequest,隊(duì)列
(3)struct bio,通用塊層用bio來管理一個(gè)請(qǐng)求
(4)struct gendisk,表示一個(gè)磁盤設(shè)備或一個(gè)分區(qū)
三、塊設(shè)備驅(qū)動(dòng)案例分析
1、塊設(shè)備驅(qū)動(dòng)案例演示
(1)驅(qū)動(dòng)簡(jiǎn)單介紹
(2)編譯
(3)模塊安裝
(4)查看信息:cat /proc/devices(查看字符和塊設(shè)備),cat /proc/partitions(查看磁盤及分區(qū)),ls /dev/,lsmod
(5)掛載測(cè)試
2、塊設(shè)備驅(qū)動(dòng)簡(jiǎn)單分析
(1)如何證明塊設(shè)備驅(qū)動(dòng)真的工作了:格式化、掛載- 格式化:mkfs.ext2 /dev/my_ramblock
- 掛載:mount -t ext2 /dev/my_ramblcok /tmp,之后在/tmp進(jìn)行的操作(創(chuàng)建文件,寫內(nèi)容),都是在此塊設(shè)備進(jìn)行操作
- 卸載:umount /tmp,卸載之后,/tmp沒有之前的文件
(2)注意各種打印信息
(3)體會(huì)塊設(shè)備驅(qū)動(dòng)的整體工作框架
3、源碼分析
(1)register_blkdev(kernel/block/genhd.c)
- 內(nèi)核提供的注冊(cè)塊設(shè)備驅(qū)動(dòng)的注冊(cè)接口,在塊設(shè)備驅(qū)動(dòng)框架中的地位,等同于register_chrdev在字符設(shè)備驅(qū)動(dòng)框架中的地位。
(2)blk_init_queue?
- 用來實(shí)例化產(chǎn)生一個(gè)等待隊(duì)列,將來應(yīng)用層對(duì)本塊設(shè)備所做的所有的讀寫操作,都會(huì)生成一個(gè)request然后被加到這個(gè)等待隊(duì)列中來。
(3)blk_init_queue
- 函數(shù)接收2個(gè)參數(shù),第一個(gè)是等待隊(duì)列的回調(diào)函數(shù),這個(gè)函數(shù)是驅(qū)動(dòng)提供的用來處理等待隊(duì)列中的request的函數(shù)(IO調(diào)度層通過電梯算法從等待隊(duì)列中取出一個(gè)request,就會(huì)調(diào)用這個(gè)回調(diào)函數(shù)來處理這個(gè)請(qǐng)求),第二個(gè)參數(shù)是一個(gè)自旋鎖,這個(gè)自旋鎖是要求我們驅(qū)動(dòng)提供給等待隊(duì)列去使用的。
(4)blk_fetch_request
- 函數(shù)是IO調(diào)度層提供的接口,作用是從request_queue中(按照電梯算法)取出一個(gè)(算法認(rèn)為當(dāng)前最應(yīng)該去被執(zhí)行的一個(gè)請(qǐng)求,是被算法排序、合并后的)請(qǐng)求,取出的請(qǐng)求其實(shí)就是當(dāng)前硬件(塊設(shè)備)最應(yīng)該去執(zhí)行的那個(gè)讀寫操作。
總結(jié)
- 上一篇: asp.net matlab,ASP.N
- 下一篇: 计算机游戏设计专业世界大学排名,看过来,