Linux kmap和kmap_atomic解析

名为解析,名不符实,简单记录一下。

kmap函数将分配到的高端内存映射到永久内存映射区域.。

kmap函数不能用于中断处理程序, 因为它可能进入睡眠状态。

上面内容引用自https://blog.csdn.net/gatieme/article/details/52705178

kmap_atomic用于高端内存映射,用于紧急的,短时间的映射,它没有使用任何锁,完全靠一个数学公式来避免混乱,它空间有限且虚拟地址固定,这意味着它映射的内存不能长期被占用而不被unmap,kmap_atomic在效率上要比kmap提升不少,然而它和kmap却不是用于同一场合的。不管怎么说,它的设计是很完美的。
     kernel可以在多个cpu上同时运行不同的task,然而它们共同使用一个内存地址空间,也就是说,地址空间对于多个cpu看到的是同一个,kmap_atomic使用的是地址空间顶部的一小段地址空间,内核逻辑将这一小段地址空间分成了若干个节,每一节的大小是一个page的大小,可以用来映射一个page,根据公用地址空间的原理,所有的cpu共同使用这些节,因此如何能保证N个cpu调用kmap_atomic不会将page映射到一个地址呢?这就是这个数学公式所起的作用:
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
};

以上内容来自于 https://blog.csdn.net/dog250/article/details/6129826

在早期的kernel中的,原型为

void *kmap_atomic(struct page *page,km_type  type)

新版本kernel中没有了第二个参数

void *kmap_atomic(struct page *page)

猜你喜欢

转载自blog.csdn.net/zhanghaiyang9999/article/details/82143032