linux block設備,Linux I/O Block--塊設備的表示

塊設備的分區信息由struct hd_struct結構描述,其中最重要的信息就是分區的起始扇區號和分區的大小。所有分區信息都一起保存在gendisk的part_tbl結構中,同時每個分區的block_device也可以通過bd_part來查詢對應的分區信息。

下圖描述了block_device,gendisk以及分區描述符之間的關系(塊設備有兩個分區)

8096a944bc1cb29166ce96c659985ea6.png

下面通過打開一個塊設備的過程,來理解這些結構之間的聯系。

對于塊設備文件的操作,通過block_dev偽文件系統來完成,open操作定義的函數為blkdev_open()

blkdev_open的主要任務有兩個

1.獲取設備的block_device信息

2.從gendisk中讀取相關信息保存到block_device,同時建立數據結構之間的聯系

static int blkdev_open(struct inode * inode, struct file * filp)

{

struct block_device *bdev;

int res;

/*

* Preserve backwards compatibility and allow large file access

* even if userspace doesn't ask for it explicitly. Some mkfs

* binary needs it. We might want to drop this workaround

* during an unstable branch.

*/

filp->f_flags |= O_LARGEFILE;

if (filp->f_flags & O_NDELAY)

filp->f_mode |= FMODE_NDELAY;

if (filp->f_flags & O_EXCL)

filp->f_mode |= FMODE_EXCL;

if ((filp->f_flags & O_ACCMODE) == 3)

filp->f_mode |= FMODE_WRITE_IOCTL;

bdev = bd_acquire(inode);//獲取block device實例

if (bdev == NULL)

return -ENOMEM;

filp->f_mapping = bdev->bd_inode->i_mapping;

res = blkdev_get(bdev, filp->f_mode);//通過gendisk獲取信息并建立聯系

if (res)

return res;

if (filp->f_mode & FMODE_EXCL) {

res = bd_claim(bdev, filp);

if (res)

goto out_blkdev_put;

}

return 0;

out_blkdev_put:

blkdev_put(bdev, filp->f_mode);

return res;

}

bd_acquire()負責獲取block_device的實例

static struct block_device *bd_acquire(struct inode *inode)

{

struct block_device *bdev;

spin_lock(&bdev_lock);

bdev = inode->i_bdev;//如果這個設備之前被打開過則可以直接通過i_bdev獲取

if (bdev) {

atomic_inc(&bdev->bd_inode->i_count);

spin_unlock(&bdev_lock);

return bdev;

}

spin_unlock(&bdev_lock);

bdev = bdget(inode->i_rdev);//通過設備號的信息來獲取block device實例

if (bdev) {

spin_lock(&bdev_lock);

if (!inode->i_bdev) {

/*

* We take an additional bd_inode->i_count for inode,

* and it's released in clear_inode() of inode.

* So, we can access it via ->i_mapping always

* without igrab().

*/

atomic_inc(&bdev->bd_inode->i_count);

inode->i_bdev = bdev;

inode->i_mapping = bdev->bd_inode->i_mapping;

list_add(&inode->i_devices, &bdev->bd_inodes);

}

spin_unlock(&bdev_lock);

}

return bdev;

}

-------------------------------分割線-------------------------------

struct block_device *bdget(dev_t dev)

{

struct block_device *bdev;

struct inode *inode;

/*這里先在inode的哈希表中進行查找與dev設備號對應的inode,如果沒找到的話,

則通過bdev偽文件系統創建bdev_inode(包含inode和block device的結構體)*/

inode = iget5_locked(blockdev_superblock, hash(dev),

bdev_test, bdev_set, &dev);

if (!inode)

return NULL;

//通過inode獲取bdev_inode,再通過bdev_inode獲取block device實例

bdev = &BDEV_I(inode)->bdev;

if (inode->i_state & I_NEW) {

/*分別設置block device和inode的相關域*/

bdev->bd_contains = NULL;

bdev->bd_inode = inode;

bdev->bd_block_size = (1 << inode->i_blkbits);

bdev->bd_part_count = 0;

bdev->bd_invalidated = 0;

inode->i_mode = S_IFBLK;

inode->i_rdev = dev;

inode->i_bdev = bdev;

inode->i_data.a_ops = &def_blk_aops;

mapping_set_gfp_mask(&inode->i_data, GFP_USER);

inode->i_data.backing_dev_info = &default_backing_dev_info;

spin_lock(&bdev_lock);

list_add(&bdev->bd_list, &all_bdevs);

spin_unlock(&bdev_lock);

unlock_new_inode(inode);

}

return bdev;

}0b1331709591d260c1c78e86d0c51c18.png

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/287208.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/287208.shtml
英文地址,請注明出處:http://en.pswp.cn/news/287208.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【搶鮮版】ArcGIS 10.7手把手經典圖文安裝教程(附安裝包下載地址)

軟件更新真是個快,ArcGIS10.7已經亮相了!回頭想想,作者追隨ArcGIS已經有11個年頭了(從ArcGIS 9.2到ArcGIS10.7,每個版本都搶鮮使用,先睹為快),本文演示10.7完美安裝過程(附下載地址),親測可用! 目 錄 一、系統環境要求 二、軟件安裝過程 三、軟件下載地址 一、…

Android之解決ViewPager2+PhotoView滑動圖片花屏問題

1 問題 用ViewPager2和開源框架PhotoView(com.github.chrisbanes.photoview.PhotoView)組合實現滑動預覽圖片, 但是部分機型出現花屏效果 2 原因 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas…

請來圍觀:WPF開發的微信客戶端!!!

本文經原作者授權以原創方式二次分享&#xff0c;歡迎轉載、分享。原文作者&#xff1a;眾尋原文鏈接&#xff1a;https://www.cnblogs.com/ZXdeveloper/p/6058206.html公司的同事離職了&#xff0c;接下來的日子可能會忙碌&#xff0c;能完善DEMO的時間也會少了&#xff0c;因…

C#字符串、字節數組和內存流間的相互轉換 - IT浪潮之巔

定義string變量為str,內存流變量為ms,比特數組為bt 1.字符串>比特數組 (1)byte[] btSystem.Text.Encoding.Default.GetBytes("字符串");(2)byte[] btConvert.FromBase64String("字符串"); 補充&#xff1a; System.Text.Encoding.Unicode.GetBytes(str)…

ios-新浪微博-下拉刷新獲取最新的消息(解決消息重復的問題)(五)

2019獨角獸企業重金招聘Python工程師標準>>> 第一步 在上一篇博文的基礎上&#xff0c;利用新浪提供的since_id進行判斷&#xff0c;在刷新監聽的方法中&#xff0c;引入下面的代碼 結果如下圖 轉載于:https://my.oschina.net/iOSliuhui/blog/520495

sqlserver快速查找所有存儲過程中是否包含某字符

--將text替換成你要查找的內容 select name from sysobjects o, syscomments s where o.id s.id and text like %text% and o.xtype P --將text替換成你要查找的內容 SELECT ROUTINE_NAME, ROUTINE_DEFINITION FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_DEFINITION LI…

《看聊天記錄都學不會Python到游戲實戰?太菜了吧》(7)我用函數寫了個特洛伊木馬

本系列文章將會以通俗易懂的對話方式進行教學&#xff0c;對話中將涵蓋了新手在學習中的一般問題。此系列將會持續更新&#xff0c;包括別的語言以及實戰都將使用對話的方式進行教學&#xff0c;基礎編程語言教學適用于零基礎小白&#xff0c;之后實戰課程也將會逐步更新。 若…

【經典回放】多種語言系列數據結構算法:隊列(C版)

一、隊列ADT以及C語言實現 1 隊列的原理以及ADT分析 隊列是說:把一些數據按先進先出來組織,如同日常生活中的排隊過程。 隊列最主要的操作是 <1> 數據加入隊列;<2> 從隊列中取出數據; 加入隊列只能加入到隊列尾巴上,而從隊列中取出數據、則只能是取出隊列…

linux修改windows注冊表,妙招:讓修改的注冊表立即生效的幾種方法

建站學院(LieHuo.Net)Windows文檔Windows操作系統是全球最廣泛&#xff0c;使用者最多的軟件&#xff0c;熟悉Windows軟件成了電腦操作者必不可少的功課&#xff0c;注冊表作為“Windows的神經系統”非常重要&#xff0c;相信很多朋友都非常熟悉注冊&#xff0c;在開始&#xf…

Android之通過用戶名和密碼連接指定wifi熱點(兼容Android9.0和Android10.0和addNetwork(wifiNewConfiguration)返回-1問題)

1 需求 通過用戶名和密碼連接指定wifi熱點,網上的代碼亂七八糟,沒幾個可以用,我這邊整理了下,測試了華為Android9.0和小米Android9.0和10.0和OPPO Android9.0 都沒問題,直接回調結果就行。 2 問題 在Android10.0手機上 mWifiManager.addNetwork(wifiNewConfiguration);…

hdu 4530(數學)

小Q系列故事——大笨鐘 Time Limit: 600/200 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 1458 Accepted Submission(s): 734 Problem Description飽嘗情感苦惱的小Q本打算隱居一段時間&#xff0c;但僅僅在3月25號一天沒有出現&am…

WPF怎么做新手引導界面?

本文經原作者授權以原創方式二次分享&#xff0c;歡迎轉載、分享。原文作者&#xff1a;眾尋原文鏈接&#xff1a;https://www.cnblogs.com/ZXdeveloper/p/8391864.html這兩天不忙&#xff0c;所以&#xff0c;做了一個簡易的新手引導小Demo。因為&#xff0c;不是項目上應用&a…

最全js表單驗證

/***************************************************************** 表單校驗工具類 (linjq) *****************************************************************//** * 判斷整數num是否等于0 * * param num * return * author jiqinlin */function isIntEqZero(num){ r…

《看聊天記錄都學不會C語言?太菜了吧》(19)鞏固開始,數字1、2、3、4能夠組成多少個 3 位數的不同的排列

若是大一學子或者是真心想學習剛入門的小伙伴可以私聊我&#xff0c;若你是真心學習可以送你書籍&#xff0c;指導你學習&#xff0c;給予你目標方向的學習路線&#xff0c;無套路&#xff0c;博客為證。 本系列文章將會以通俗易懂的對話方式進行教學&#xff0c;對話中將涵蓋…

阿里云MaxCompute香港開服 將引入更多人工智能服務

9月18日&#xff0c;阿里云宣布大數據計算服務MaxCompute在香港正式開服。通過MaxCompute強大的計算能力&#xff0c;阿里云將為香港市場提供更多的人工智能產品&#xff0c;助力當地企業智能化升級。據了解&#xff0c;MaxCompute向用戶提供了完善的數據導入方案以及多種經典的…

【經典回放】多種語言系列數據結構算法:串(C版)

我們這里說的串、就是標準的C語言的串,這點,和我們教材中另行定義的串并不一致。我們這里強調僅僅是按C語言的標準處理串,是因為你會按C語言的標準構造串、而不是按其它的模式定義的。在我們的教材上,串相當與一個: struct ElemType {char *str; }; 構造的順序表、或者是…

Android之解決開啟熱點后跳轉頁面不穩定問題

1 問題 在Android8.0版本以后,開啟熱點我們采用的下面這種方式,但是跳轉頁面后熱點會斷開,手機不能互相傳文件了 權限說明:Android8.0需要位置權限和GPS權限,同時手機熱點還不能是開啟狀態。 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {try {mWifiManag…

linux如何獲取網卡計數信息,Linux下如何獲取網卡信息

有時候&#xff0c;寫程序的時候需要獲取計算機的網絡信息&#xff0c;比如IP地址、電腦名稱、DNS等信息。IP地址和電腦名稱是比較容易獲取到的&#xff0c;而要想獲取地址掩碼、DNS、網關等信息就有些麻煩了。在Windows下我們一般都是通過從注冊表讀取這些信息。在Linux怎么做…

Redis命令總結

1.用腳本批量刪除key redis-cli -h 127.0.0.1 keys "MAIN:GAME:GID:*" | xargs redis-cli -h 127.0.0.1 del轉載于:https://www.cnblogs.com/hiwen/p/4900968.html

可以只讀的 ServiceCollection

可以只讀的 ServiceCollectionIntro在 .NET 7 Preview 4 中&#xff0c;ServiceCollection 可以聲明為只讀了&#xff0c;這使得我們可以有效避免在構建了 ServiceProvider 之后再新增服務&#xff0c;導致服務注冊失敗。Sample在新的版本中&#xff0c;ServiceCollection 新增…