内核与用户空间交换大量数据

驱动运行在内核态,一般的流程是:中断上下文中读取数据-->中断下半部处理数据-->发送到应用程序。。。。或者相反

中断上下文或者tasklet,工作队列都是工作在内核态,而且不同于系统调用进入内核的方式,无法得到进程的页表(尽管此时current宏就是当前进程的)。要想大量传输数据只有以下的方法了:

1.自己做一个系统调用或者ioctl。二者方法类似都是利用copy_to_usr()和copy_from_usr()。ioctl系统调用最后一个参数是一个用户空间地址,这个地址会被系统计算到内核空间,<这个是不对的:我想原理无非是把从户空间地址-->物理地址-->内核的地址。如果自己做系统调用的话估计这个地址转换工作就得自己做了,不过不推荐这种方法。>因为这个方法是通过系统调用进入的所以对于current宏可用,一次用户空间页表也是可用的。同理read()和write()函数。

2.上面的方法有时太慢,另外的方法是mmap()。

你可能感兴趣的:(工作)