当前位置: 技术问答>linux和unix
程序运行速度疑问
来源: 互联网 发布时间:2016-10-13
本文导语: 程序如下: *(volatile short *)(Bankaddr)=1; *(volatile short *)(Bankaddr)=0; 这段对外设地址访问的程序,在驱动程序里面的速度和在应用程序里面的速度相差一倍 在应用程序里,外设地址是通过mmap映射的 在驱动程序里,外...
程序如下:
*(volatile short *)(Bankaddr)=1;
*(volatile short *)(Bankaddr)=0;
这段对外设地址访问的程序,在驱动程序里面的速度和在应用程序里面的速度相差一倍
在应用程序里,外设地址是通过mmap映射的
在驱动程序里,外设地址是通过ioremap映射的,
(我将访问外设的时序参数设定的一样。并且编译应用程序时,带上了优化参数O2,
我将驱动程序和应用程序反汇编,代码也差不多,没有什么太大区别)
为何驱动程序运行的速度要比应用程序快一倍左右呢,(我是通过示波器测量数据总线发现的)
(目标板是linux2.6.31+s3c6410)
*(volatile short *)(Bankaddr)=1;
*(volatile short *)(Bankaddr)=0;
这段对外设地址访问的程序,在驱动程序里面的速度和在应用程序里面的速度相差一倍
在应用程序里,外设地址是通过mmap映射的
在驱动程序里,外设地址是通过ioremap映射的,
(我将访问外设的时序参数设定的一样。并且编译应用程序时,带上了优化参数O2,
我将驱动程序和应用程序反汇编,代码也差不多,没有什么太大区别)
为何驱动程序运行的速度要比应用程序快一倍左右呢,(我是通过示波器测量数据总线发现的)
(目标板是linux2.6.31+s3c6410)
|
是不是和内存区域有关系的?
VMALLOC_START VMALLOC_END-1 vmalloc() / ioremap() space.
Memory returned by vmalloc/ioremap will
be dynamically placed in this region.
VMALLOC_START may be based upon the value
of the high_memory variable.
00001000 TASK_SIZE-1 User space mappings
Per-thread mappings are placed here via
the mmap() system call.
VMALLOC_START VMALLOC_END-1 vmalloc() / ioremap() space.
Memory returned by vmalloc/ioremap will
be dynamically placed in this region.
VMALLOC_START may be based upon the value
of the high_memory variable.
00001000 TASK_SIZE-1 User space mappings
Per-thread mappings are placed here via
the mmap() system call.
|
我觉得LZ在12楼的解释挺好的呀。
这个时候的确不应该用cache。目的是只写,希望立即生效,当中垫上个高速缓存,应该是降低响应的。
做为验证,要么检查一下内核代码,ioremap和mmap是否在这方面有差异?
|
当然有区别,在有 mmu 的硬件上就有区别。