Mmap and remap_page_range(), in the nutshell

繼 Linux programming 課程紀錄「小談 mmap() 與 VMA 」後,今天在 Linux device driver 課程再聊到有關 VMA 與 mmap driver function 的重要觀念;重點紀錄如下。

當 user-space 呼叫 mmap() system call wrapper function 後,kernel 會在 process address space 裡建立新的 VMA,並在 callback mmap driver function 時將「該」VMA 傳遞給 我們的驅動程式。

因此,在驅動程式裡,只需要利用 remap_page_range() 將 kernel-space 的 memory:

- I/O memory

- RAM(reserved pages)

- Virtual address space(reserved pages)

對應到該 VMA 即可。最後,寫出了 以下的 skeleton code:

// refer to: bttv-dirver.c
int do_card_mmap(struct vm_area_struct *vma, char *adr, unsigned long size)
{
unsigned long start = (unsigned long)adr;
unsigned long page, pos;

pos = (unsigned long)BaseIOAddress;
#if 1 // page or the total size ?
while (size >0) {
page = pos;
if (remap_page_range(vma, start, page, PAGE_SIZE, PAGE_SHARED))
return -EAGAIN;
start+=PAGE_SIZE;
pos+=PAGE_SIZE;
size-=PAGE_SIZE;
}
#else
if (remap_page_range(vma, start, pos, size, PAGE_SHARED))
return -EAGAIN;
#endif
return 0;
}

// refer to: videodev.c
int card_mmap(struct file *filp, struct vm_area_struct *vma)
{
do_card_mmap(vma, (char *)vma->vm_start, (unsigned long)(vma->vm_end-vma->vm_start));
return 0;
}
/**************************************************/

struct file_operations card_fops = {
open:card_open,
release:card_release,
ioctl:card_ioctl,
mmap:card_mmap,
};

remap_page_range() 的原理是去修改 page table,但是 要不要以 "page" 為最小單位做 page table 的修改(呼叫 'remap_page_range') ,必須視 情況而定!

同學對此部份如有觀念上的疑問,可透過 forum 討論。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值