- 论坛徽章:
- 0
|
回复 #1 jjjjffff 的帖子
1:在读写回调(read_end_io/write_end_io)中怎样进行页数据拷贝?
在读写回调中进行数据拷贝与其他的地方拷贝没什么不同,只不过读写回调是处在中断中而已。
2:memcpy使用虚拟地址,这是肯定的,也是必须的。
alloc_page返回的是struct page*, 由页指针要转换到虚拟地址,这里面涉及到:低端内存和高端内存这一知识点。
如果该页指针对应的是低端内存页框,则使用page_address(page)即可将page->虚拟地址。
如果。。。。。。。。高端内存页框, 由于高端内存页框并不映射在内核线性地址空间的第4个GB上,因此内核不能直接访问他们,所以这时就需要建立映射了。
有两种方式:永久映射(使用函数:kmap,kunmap); 临时映射(kmap_atomic,kunmap_atomic)
kmap的实现:
void *kmap(struct page *page)
{
might_sleep();
if (!PageHighMem(page))
return page_address(page);
return kmap_high(page);
}
其中:永久映射是可能被阻塞的,所以不能用在中断中,而临时映射可以用在中断中。 |
|