Non-cached buffered (NCB)读、写都直达外设硬件; 写操作通过 buffer实现,CPU不等待写操作完成,CPU会马上执行下一条指令。写数据时会用 buffer进行优化,可能会有“写合并”,这适合显存的操作。因为对显存很少有读操作,基本都是写操作,而写操作即使被“合并”也没有关系。 pgprot_writethrough():生成一个表示可...
11 staticpgprot_t phys_mem_access_prot(structfile *file, unsignedlongpfn, unsignedlongsize, pgprot_t vma_prot) { #ifdef pgprot_noncached phys_addr_t offset = pfn << PAGE_SHIFT; if(uncached_access(file, offset)) returnpgprot_noncached(vma_prot); #endif returnvma_prot; } O_DSYNC标志将...
vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);表示要映射的内存是非cached的,这样不会存在缓存中的数据和实际数据不一致的情况,但是速度会比cached的要慢。 offset表示要映射的数据偏移,来自用户空间的mmap调用,在这里进行判断,虽然一般的文件就将这个偏移量做为文件偏移了,其实这个offset的含义,由驱...
4. 设置适当的标志,无论I/O内存是否存在: 使用vma->vm_page_prot =pgprot_noncached(vma->vm_page_prot)禁用缓存. 设置VM_IO标志:vma->vm_flags |= VM_IO。 防止VMA被换出:vma->vm_flags |= VM_DONTEXPAND |VM_DONTDUMP。在3.7以上的内核版本中,应该只使用VM_RESERVED标志。 5. 调用 remap_pfn_r...
pgport_t vm_page_prot指明了对VMA的保护权限。由于利用CS3对DSP的HPI接口进行控制,所以应用pgprot_noncached禁止高速缓冲。 通过mmap的构建就能够将内核空间的数据映射到用户空间去,也就是说可以在用户空间内直接对地址为0x4000_0000的内存空间进行操作,而该段空间正是DSP的HPI接口所对应的地址。
这段代码中的pgprot_noncached()是一个宏,它实际上禁止了相关页的cache和写缓冲(write buffer),另外一个稍微少的一些限制的宏是: #define pgprot_writecombine(prot) __pgprot(pgprot_val (prot) & –L_PTE_CACHEABLE); 它则没有禁止写缓冲 而除了rempa_pfn_range()外,在驱动程序中实现VMA的nopage()函数...
由于利用CS3对DSP的HPI接口进行控制,所以应用pgprot_noncached禁止高速缓冲。 通过mmap的构建就能够将内核空间的数据映射到用户空间去,也就是说可以在用户空间内直接对地址为0x4000_0000的内存空间进行操作,而该段空间正是DSP的HPI接口所对应的地址。 在实际应用中,应对CS3的低电平脉宽加以控制,方法是在初始化模块时...
注意:为了内容的一致性,映射设备内存不应当被处理器缓存。所以,除了通常系统的BIOS会为此做了正确的配置,我们也可以通过设置保护字段来关闭特定 VMA 的缓存,但它是高度处理器依赖的,更进一步了解请参考drivers/char/mem.c 的 pgprot_noncached 函数 。
pgport_t vm_page_prot指明了对VMA的保护权限。由于利用CS3对DSP的HPI接口进行控制,所以应用pgprot_noncached禁止高速缓冲。 通过mmap的构建就能够将内核空间的数据映射到用户空间去,也就是说可以在用户空间内直接对地址为0x4000_0000的内存空间进行操作,而该段空间正是DSP的HPI接口所对应的地址。
vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); if(rempa_pfn_range(vma, vma->vm_start, vma->vm_pgoff, vma->vm_end - vm_start, vma->vm_page_prot)) return - EAGAIN; 应用程序调用如下: void *p = mmap(0, DEV_MEM_LEN, // 设备内存长度 prot, flags, dev_fd, DEV_MEM...