1. windows操作系统和linux操作系统中是如何使用DMA方式实现输入输出的
大概知道一点DMA是啥东西,简单说一下大家不要见笑:
DMA是用硬件管理存储器IO的一种方式,这样可以节省CPU周期以处理其它事务,使CPU从繁重的IO操作中解放出来,DMA也有周期的,每个存储周期,CPU收到存储中断请求,将相关参量和信息传递给DMA芯片,然后存储过程就交给DMA芯片了,DMA芯片代替CPU设置内存和存储器的状态、地址等等信息,等每个存储周期完成就产生一个中断通知CPU,我的这次存储过程结束了,CPU再分配下一次存储任务给DMA芯片,基本就是这么个过程,输出就是输入的逆向,一个从内存到磁盘,一个从磁盘到内存
2. linux中DMA申请空间的疑问
多次kmalloc 是肯定不行的,dma 内存在物理上要连续.
可以使用get_free_pages, 然后使用dma_map_single, dma_map_pages, dma_map_sg将之前分配的内存空间映射, 但也不会太大。
dma 内存不光是申请就可以的,因为传输时不经cpu, 所以要对 cache 进行clean 或invalidate 操作,上面的方式就不保证cache 的一致性。
使用dma_alloc_coherent申请的保证一致性.
不管那种方式,申请过大内存都存在失败的可能性,不建议一次申请很大内存,申请的小点,加大传输次数。
3. linux内核中的DMA engine是什么,求详解!
从硬件上来说,dma engine即dma引擎,就是dma控制器;从软件上来说,其实就是一个dma框架,在该框架下针对你的具体的dma控制器开发出dma驱动,然后其他drivers比如audio,network,crypto等就都可以调用统一的dma相关的api来使用你的dma。
4. 在Linux操作系统下如何开启硬盘DMA
如果在安装时DMA是disable的,那该怎么才能激活DMA呢?通过重新编译内核可以激活DMA支持,但编译内核对新手显然太过复杂。下面的方法无需编译内核,就可以激活DMA支持。
一、检查系统中的DMA选项是否已被激活
在进行操作前,先确认硬盘是否已经在使用DMA方式传输数据了。方法:查看/proc/ide/hda/settings文件,其中有一行的内容为:using_dma,如果其后面的值被设置为1就说明系统已经支持DMA了,那么下面的操作就可以免了,当然如果你要关闭DMA功能的话,还要往下看看哟:)。
Linux中的hdparm命令是用来进行与硬盘相关操作的,用hdparm -i /dev/hda可以列出IDE可能支持的DMA模式,如:
DMA modes: mdma0 mdma1 mdma2 udma0 udma1 udma2 udma3 *udma4
二、激活DMA支持
方法1:在lilo.conf中加入:idex=dma,其中x代表硬盘序号,其取值范围0-3,分别代表系统中的四个IDE硬盘设备。
方法2:使用hdparm命令,hdparm d1 /dev/hda 其中d1表示使能DMA,你可以将其加到rc.locl中以便每次启动时都硬盘都能使用DMA方式传输数据。
三、关闭DMA支持
希望对你有帮助,祝你好运!
5. 怎样看linux串口驱动中断 dma
查询就是一直在查看标志位,是不是被置1了,如果是就去读或者其他操作专
中断就是平时不用属管,一单有东西来就会进入中断服务程序,你再去操作
DMA是你初始化的时候把串口地址和需要传输的地址写上,来东西他就自己把数据存到你初始化的地址上
6. Linux内核态申请一块DMA内存,通过什么函数或方式判断内存中的数据发生了变化
这个只能自己弄,
建议自己写一个函数,
思路:读取一次你申请的DMA内存,并计算它的md5,
下次当你需要判断内存是否改变的时候再次读取内存并获取md5
如果两次md5不一样的时候,那么,内存一定是被修改了
7. linux 应用层可以使用DMA进行数据传输吗
dma只能在驱动层面实现至于用户层操作,理论上可以,但应该比较复杂