栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Linux内核设备驱动程序将DMA从设备插入用户空间内存

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Linux内核设备驱动程序将DMA从设备插入用户空间内存

我现在实际上正在做完全相同的事情,并且正在走

ioctl()
路线。一般的想法是让用户空间分配缓冲区,该缓冲区将用于DMA传输,并且
ioctl()
将用于将缓冲区的大小和地址传递给设备驱动程序。然后,驱动程序将使用分散收集列表以及流DMA
API来直接与设备和用户空间缓冲区之间来回传输数据。

我正在使用的实现策略是,

ioctl()
驱动程序中的进入一个循环,该循环以256k的块(这是硬件对其可处理的分散/聚集条目的硬性限制)的形式进入DMA的用户空间缓冲区。这是隔离在一个函数内部的,该函数在每次传输完成之前都会阻塞(请参阅下文)。当所有字节传输完毕或增量传输函数返回错误时,
ioctl()
退出并返回用户空间

的伪代码

ioctl()

if (mutex_lock_interruptible( &device_ptr->mtx ) )    return -EINTR;chunk_data = (unsigned long) user_space_addr;while( *transferred < total_bytes && !ret ) {    chunk_bytes = total_bytes - *transferred;    if (chunk_bytes > HW_DMA_MAX)        chunk_bytes = HW_DMA_MAX;     ret = transfer_chunk(device_ptr, chunk_data, chunk_bytes, transferred);    chunk_data += chunk_bytes;    chunk_offset += chunk_bytes;}mutex_unlock(&device_ptr->mtx);

用于增量传递函数的伪代码:

first_page = (udata & PAGE_MASK) >> PAGE_SHIFT;last_page = ((udata+nbytes-1) & PAGE_MASK) >> PAGE_SHIFT;first_page_offset = udata & PAGE_MASK;npages = last_page - first_page + 1;down_read(&current->mm->mmap_sem);ret = get_user_pages(current,          current->mm,          udata,          npages,          is_writing_to_userspace,          0,          &pages_array,          NULL);up_read(&current->mm->mmap_sem);sg_set_page(&sglist[0], pages_array[0], PAGE_SIZE - fp_offset, fp_offset);for(i=1; i < npages-1; i++)    sg_set_page(&sglist[i], pages_array[i], PAGE_SIZE, 0);if (npages > 1) {    sg_set_page(&sglist[npages-1], pages_array[npages-1],        nbytes - (PAGE_SIZE - fp_offset) - ((npages-2)*PAGE_SIZE), 0);}ret = wait_event_interruptible_timeout( &device_ptr->dma_wait,          &device_ptr->flag_dma_done, HZ*2 );if (ret == 0)    else if (ret == -ERESTARTSYS )    else {        *transferred += nbytes;    return 0;}

中断处理程序非常简短:

device_ptr->flag_dma_done = 1;wake_up_interruptible(device_ptr->dma_wait);

请注意,这只是一种通用方法,最近几周我一直在研究此驱动程序,但尚未进行实际测试。因此,请不要将此伪代码视为福音,并且一定要加倍检查所有逻辑和参数;-)。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/397524.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号