2012-06-02 47 views
0

當「讀出」的調用之後被阻塞的方法,該內核從IOS讀取數據並將其應對到緩衝器,但如果是緩衝器,在內核中或在用戶空間(這是該參數的「讀「功能),從內核空間到用戶空間節省應對資源,以供後續選擇,而且用戶空間中的緩衝區更多。但每次應對時都應該改變cr3,這會刷新所有TLB數據。這就是我所知道的兩個選擇,還有別的嗎?讀取的實現:是否直接將內存複製到內核空間優先於用戶空間?

回答

1

其中一個方法是詢問設備驅動程序通過mmap將映射其內核緩衝區進程的用戶地址空間,並輪流使用類似於remap_pfn_range。

當驅動程序完成的I/O操作,複製到它的內核緩衝區並不需要CR3的改變或擊落的TLB。

當用戶進程正在等待I/O時,它很可能會被調度爲另一個新進程運行,然後cr3必須更改(+ TLB刷新)整個I/O操作完成。

1

,我在內核中看到一個常見的模式是一個緩衝區通常分配在內核空間 - kzalloc(PAGE_SIZE, GFP_KERNEL)(不一定是PAGE_SIZE),然後讀上發生了緩衝區。然後,它被複制到使用simple_read_from_buffer(..)(FS/libfs.c)用戶空間 - 其內部使用copy_to_user()。儘管這通常是爲了簡單的I/O操作或其他(例如debugfs)讀取而完成的。

相關問題