当前位置: 技术问答>linux和unix
关于DMA操作的问题
来源: 互联网 发布时间:2015-11-19
本文导语: 查了相关的资料,讲它是指一种高速的数据传输操作,允许在外部设备和存储器之间直接读写数据,即不通过CPU,也不需要CPU干预.整个数据传输操作在一个称为"DMA控制器"的控制下进行的.CPU除了在数据传输开始和结束时...
查了相关的资料,讲它是指一种高速的数据传输操作,允许在外部设备和存储器之间直接读写数据,即不通过CPU,也不需要CPU干预.整个数据传输操作在一个称为"DMA控制器"的控制下进行的.CPU除了在数据传输开始和结束时作一点处理外,在传输过程中CPU可以进行其它的工作.这样,在大部分时间里,CPU和输入输出都处在并行操作.因此,使整个计算机系统的效率大大提高.
但是,还是并不清楚其工作机制。比如说,对DMA控制器的配置,是在程序中进行的吗?它怎么会知道要搬移的数据的起始地址和目的地址,是在程序中配置的吗?可是,我在看linux的驱动代码时,并没有找到这些.
还有,程序是要CPU来执行的.CPU要执行的读写操作都是要对内存的操作,假设在DMA过程中,CPU继续并行工作的话,其读写内存,必然要影响DMA的进行,怎样还能并行操作呢?
最后,我想问一下,在编写驱动程序时,程序中使用的全局变量也好,临时变量也罢,它们占用的是内存的空间吗?如果是的话,它们是算内存的核心空间呢,还是用户空间呢?还是都有呢?是怎样划分的呢?为什么,我看到代码中,有copy to usr和coppy from usr的变量拷贝呢?
问题比较多,希望大家赐教.
但是,还是并不清楚其工作机制。比如说,对DMA控制器的配置,是在程序中进行的吗?它怎么会知道要搬移的数据的起始地址和目的地址,是在程序中配置的吗?可是,我在看linux的驱动代码时,并没有找到这些.
还有,程序是要CPU来执行的.CPU要执行的读写操作都是要对内存的操作,假设在DMA过程中,CPU继续并行工作的话,其读写内存,必然要影响DMA的进行,怎样还能并行操作呢?
最后,我想问一下,在编写驱动程序时,程序中使用的全局变量也好,临时变量也罢,它们占用的是内存的空间吗?如果是的话,它们是算内存的核心空间呢,还是用户空间呢?还是都有呢?是怎样划分的呢?为什么,我看到代码中,有copy to usr和coppy from usr的变量拷贝呢?
问题比较多,希望大家赐教.
|
在驱动里会设置DMA的源地址和目的地址, 并启动相应的DMA,
DMA虽然可以不用CPU来传输, 但是总线还是共享的,DMA访问内存时,CPU还是不能访问内存,但是可以做别的事情。
编写驱动程序时,程序中使用的全局变量也好,临时变量也罢,它们占用的是内存空间,它们是算内存的核心空间
copy to usr和coppy from usr是在内核空间和用户空间之间拷贝数据
DMA虽然可以不用CPU来传输, 但是总线还是共享的,DMA访问内存时,CPU还是不能访问内存,但是可以做别的事情。
编写驱动程序时,程序中使用的全局变量也好,临时变量也罢,它们占用的是内存空间,它们是算内存的核心空间
copy to usr和coppy from usr是在内核空间和用户空间之间拷贝数据