第11章 内存与IO访问之I/O内存静态映射

11.5 I/O内存静态映射

    在将Linux移植到目标电路板的过程中,有得会建立外围设备I/O内存物理地址到虚拟地址的静态映射,这个映射通过在与电路板对应的map_desc结构体数组中添加新的成员来完成,map_desc结构体的定义:

arch/arm/include/asm/mach/map.h

struct map_desc {
        unsigned long virtual;    /* 虚拟地址 */
        unsigned long pfn;    /* __phys_to_pfn(phy_addr) */
        unsigned long length;     /* 大小 */
        unsigned int type;     /* 类型 */
};

代码清单11.11 在电路板文件中增加物理地址到虚拟地址的静态映射

 static struct map_desc ixdp2x01_io_desc _ _initdata = {
        .virtual        = IXDP2X01_VIRT_CPLD_BASE,
        .pfn            = _ _phys_to_pfn(IXDP2X01_PHYS_CPLD_BASE), /*把物理地址转换为页帧号*/
        .length         = IXDP2X01_CPLD_REGION_SIZE,
        .type           = MT_DEVICE
 };
 
 static void _ _init ixdp2x01_map_io(void)
 {
       ixp2000_map_io();
       iotable_init(&ixdp2x01_io_desc, 1); //建立页映射

}

将Linux操作系统移植到特定平台上,MACHINE_START(或者DT_MACHINE_START)、MACHINE_END宏之间的定义针对特定电路板而设计,其中的map_io()成员函数完成I/O内存的静态映射

备注:

在一个已经移植好操作系统的内核中,驱动工程师可以对非常规内存区域的I/O内存(外设控制器寄存器、MCU内部集成的外设控制器寄存器等)依照电路板的资源使用情况添加到map_desc数组中,但目前该方法不值得推荐。

猜你喜欢

转载自blog.csdn.net/xiezhi123456/article/details/80453071