您的位置: 额尔古纳信息网 > 育儿

Linux系统对ISA总线DMA的实现(下) (1)

发布时间:2019-09-13 19:40:00

3.3 对DMAC的保护 DMAC是一种全局的共享资源,为了保证设备驱动程序对它的独占访问,Linux在kernel/dma.c文件中定义了自旋锁dma_spin_lock来保护它(实际上是保护DMAC的I/O端口资源)。任何想要访问DMAC的设备驱动程序都首先必须先持有自旋锁dma_spin_lock。如下: static __inline__ unsigned long claim_dma_lock(void){unsigned long flags;spin_lock_irqsave(&dma_spin_lock, flags); /* 关中断,加锁*/return flags;}static __inline__ void release_dma_lock(unsigned long flags){spin_unlock_irqrestore(&dma_spin_lock, flags);/* 开中断,开锁*/}

4 Linux对ISA DMA通道资源的管理 DMA通道是一种系统全局资源。任何ISA外设想要进行DMA传输,首先都必须取得某个DMA通道资源的使用权,并在传输结束后释放所使用DMA通道资源。从这个角度看,DMA通道资源是一种共享的独占型资源。 Linux在kernel/Dma.c文件中实现了对DMA通道资源的管理。 4.1 对DMA通道资源的描述 Linux在kernel/Dma.c文件中定义了数据结构dma_chan来描述DMA通道资源。该结构类型的定义如下: struct dma_chan {int lock;const char *device_id;};

其中,如果成员lock!=0则表示DMA通道正被某个设备所使用;否则该DMA通道就处于free状态。而成员device_id就指向使用该DMA通道的设备名字字符串。 基于上述结构类型dma_chan,Linux定义了全局数组dma_chan_busy[],以分别描述8个DMA通道资源各自的使用状态。如下: static struct dma_chan dma_chan_busy[MAX_DMA_CHANNELS] = {{ 0, 0 },{ 0, 0 },{ 0, 0 },{ 0, 0 },{ 1, "cascade" },{ 0, 0 },{ 0, 0 },{ 0, 0 }};

显然,在初始状态时除了DMA通道4外,其余DMA通道皆处于free状态。 4.2 DMA通道资源的申请 任何ISA卡在使用某个DMA通道进行DMA传输之前,其设备驱动程序都必须向内核提出DMA通道资源的申请。只有申请获得成功后才能使用相应的DMA通道。否则就会发生资源冲突。 函数request_dma()实现DMA通道资源的申请。其源码如下: int request_dma(unsigned int dmanr, const char * device_id){if (dmanr >= MAX_DMA_CHANNELS)return -EINVAL;if (xchg(&dma_chan_busy[dmanr].lock, 1) != 0)return -EBUSY;dma_chan_busy[dmanr].device_id = device_id;/* old flag was 0, now contains 1 to indicate busy */return 0;}

孩子发烧38度怎么办
小孩干咳
薏芽健脾凝胶怎么样
双侧颈动脉硬化
猜你会喜欢的
猜你会喜欢的