Linux kmap和kmap_atomic解析
名為解析,名不符實,簡單記錄一下。
kmap函數(shù)將分配到的高端內(nèi)存映射到永久內(nèi)存映射區(qū)域.。
kmap函數(shù)不能用于中斷處理程序, 因為它可能進(jìn)入睡眠狀態(tài)。
上面內(nèi)容引用自https://blog.csdn.net/gatieme/article/details/52705178
kmap_atomic用于高端內(nèi)存映射,用于緊急的,短時間的映射,它沒有使用任何鎖,完全靠一個數(shù)學(xué)公式來避免混亂,它空間有限且虛擬地址固定,這意味著它映射的內(nèi)存不能長期被占用而不被unmap,kmap_atomic在效率上要比kmap提升不少,然而它和kmap卻不是用于同一場合的。不管怎么說,它的設(shè)計是很完美的。
???? kernel可以在多個cpu上同時運行不同的task,然而它們共同使用一個內(nèi)存地址空間,也就是說,地址空間對于多個cpu看到的是同一個,kmap_atomic使用的是地址空間頂部的一小段地址空間,內(nèi)核邏輯將這一小段地址空間分成了若干個節(jié),每一節(jié)的大小是一個page的大小,可以用來映射一個page,根據(jù)公用地址空間的原理,所有的cpu共同使用這些節(jié),因此如何能保證N個cpu調(diào)用kmap_atomic不會將page映射到一個地址呢?這就是這個數(shù)學(xué)公式所起的作用:
idx = type + KM_TYPE_NR*smp_processor_id();
vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx);
其中KM_TYPE_NR代表type的最大值加1:
enum km_type {
??? KM_BOUNCE_READ,
??? KM_SKB_SUNRPC_DATA,
??? KM_SKB_DATA_SOFTIRQ,
??? KM_USER0,
??? KM_USER1,
...
??? KM_TYPE_NR
};
以上內(nèi)容來自于 https://blog.csdn.net/dog250/article/details/6129826
?
在早期的kernel中的,原型為
void *kmap_atomic(struct page *page,km_type? type)
新版本kernel中沒有了第二個參數(shù)
void *kmap_atomic(struct page *page)
?
總結(jié)
以上是生活随笔為你收集整理的Linux kmap和kmap_atomic解析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 转载:谢谢原作者:块设备驱动实战基础篇四
- 下一篇: Linux 如何获取PAGE size的