大部分程式設計師可能會有這樣的疑問:當在程式中呼叫庫函式 read 時,這個請求是經過哪些處理最終到達磁碟的呢,資料又是怎麼被拷貝到使用者快取區的呢?本文介紹了從 read 系統呼叫發出到結束處理的全過程。該過程包括兩個部分:使用者空間的處理、核心空間的處理。使用者空間處理部分是系統呼叫從使用者態切到核心態的過程。核心空間處理部分則是 read 系統呼叫在 linux 核心中處理的整個過程。
應用程式怎麼去呼叫這個驅動:
當使用者用cp 或者open read write等操作相對應的塊裝置的時候,底層呼叫對應快裝置的驅動的q.request_fn= rfn函式進行操作.
使用者層ioctl 等函式(可以讀寫)==》kcryptd_crypt==》crypt_map====》kcryptd_queue_io====》kcryptd_io===》generic_make_request(struct bio *bio)**********>_generic_make_request(bio);
__generic_make_request會呼叫q->make_request_fn=mfn 函式io schedule 注釋:mfn=__make_request
__make_request會呼叫__generic_unplug_device(q);
__generic_unplug_device 進一步呼叫q->request_fn= rfn; 也就是simp_blkdev_do_request。(也就是自己定義的函式)
simp_blkdev_queue = blk_init_queue(simp_blkdev_do_request, null);
struct request_queue *q = blk_alloc_queue_node(gfp_kernel, node_id);
q->request_fn = rfn;
blk_queue_make_request(q, __make_request);//注釋 其實q->make_request_fn =_make_request= mfn;等
想跳個io排程的話
模組初始化的時候:
simp_blkdev_queue = blk_alloc_queue(gfp_kernel);
blk_queue_make_request(simp_blkdev_queue, simp_blkdev_make_request);
實現這個函式即可 simp_blkdev_make_request
第一節 python基礎
2020 03 29 python基礎 多種python版本,直接編碼讓c解釋的是cpython,pypy是最快的python 編碼 ascll碼只能表示256種無法表示中文,utf8個根據字元長短按需表示最實用 unicode國標碼浪費資源 指令碼開頭定義編碼格式可以防止用python2直譯器解釋...
測試驅動開發(第一節)
今天看到一本書,測試驅動開發,感覺挺不錯的,在看的同時也記錄下了一些感覺不教不錯的東西,希望能對將來的工作有用。測試驅動開發 第一天 建立web projct 將junit加到專案的類路徑下 在沒有被測試物件的情況下,先在測試類中建立方法,寫出自己的測試思路。之後根據出錯提示,寫好相關的實體類或其他...
第一節,tensorflow基礎構架
1 tensorflow結構 import tensorflow as tf import numpy as np create data x data np.random.rand 100 astype np.float32 y data x data 0.1 0.3 定義線性方程 create ...