物理地址转换为虚拟地址(静态).doc
上传人:sy****28 上传时间:2024-09-14 格式:DOC 页数:5 大小:15KB 金币:16 举报 版权申诉
预览加载中,请您耐心等待几秒...

物理地址转换为虚拟地址(静态).doc

物理地址转换为虚拟地址(静态).doc

预览

在线预览结束,喜欢就下载吧,查找使用更方便

16 金币

下载此文档

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

物理地址转换为虚拟地址(静态)说明:参考http://www.embedu.org/Column/Column225.htm物理地址可以静态地转换为虚拟地址,因为静态所以必须编译进内核。因此如需变动,必须更改内核代码,重新编译内核。内核提供在系统启动时通过map_desc结构体静态创建I/O资源到内核地址空间的线性映射表。程序员可以自己定义该I/O内存资源映射后虚拟地址。创建好静态映射表后,在内核驱动访问I/O资源是无需ioremap动态映射,可以直接通过静态映射后的I/O虚拟地址访问。静态映射表主要通过structmap_desc描述,主要有3个,分别是s3c_iodesc,s3c6410_iodesc,smdk6410_iodesc。map_desc定义在文件arch/arm/include/asm/mach/map.h中,如下:1structmap_desc{2unsignedlongvirtual;3unsignedlongpfn;4unsignedlonglength;5unsignedinttype;6};s3c_iodesc在文件arch/arm/plat-s3c64xx/cpu.c中定义,如下:1staticstructmap_descs3c_iodesc[]__initdata={2{3.virtual=(unsignedlong)S3C_VA_SYS,4.pfn=__phys_to_pfn(S3C64XX_PA_SYSCON),5.length=SZ_4K,6.type=MT_DEVICE,7},{8.virtual=(unsignedlong)(S3C_VA_UART+UART_OFFS),9.pfn=__phys_to_pfn(S3C_PA_UART),10.length=SZ_4K,11.type=MT_DEVICE,12},{13.virtual=(unsignedlong)S3C_VA_VIC0,14.pfn=__phys_to_pfn(S3C64XX_PA_VIC0),15.length=SZ_16K,16.type=MT_DEVICE,17},{18.virtual=(unsignedlong)S3C_VA_VIC1,19.pfn=__phys_to_pfn(S3C64XX_PA_VIC1),20.length=SZ_16K,21.type=MT_DEVICE,22},{23.virtual=(unsignedlong)S3C_VA_TIMER,24.pfn=__phys_to_pfn(S3C_PA_TIMER),25.length=SZ_16K,26.type=MT_DEVICE,27},{28.virtual=(unsignedlong)S3C64XX_VA_GPIO,29.pfn=__phys_to_pfn(S3C64XX_PA_GPIO),30.length=SZ_4K,31.type=MT_DEVICE,32},33};s3c6410_iodesc在文件arch/arm/mach-s3c6410/cpu.c中定义,如下:1staticstructmap_descs3c6410_iodesc[]__initdata={2IODESC_ENT(LCD),3IODESC_ENT(SROMC),4IODESC_ENT(HOSTIFB),5IODESC_ENT(OTG),6IODESC_ENT(OTGSFR),7};smdk6410_iodesc在文件arch/arm/mach-s3c6410/mach-smdk6410.c中定义,如下:1structmap_descsmdk6410_iodesc[]={2{3.virtual=(u32)S3C64XX_VA_DM9000,4.pfn=__phys_to_pfn(S3C64XX_PA_DM9000),5.length=S3C64XX_SZ_DM9000,6.type=MT_DEVICE,7},8};我们若要添加新的静态映射,一般通过在smdk6410_iodesc结构体最后添加一项实现。例如:把LED对应地址0x7F008820,按页对齐方式,映射一页。如下:1structmap_descsmdk6410_iodesc[]={2{3.virtual=(u32)S3C64XX_VA_DM9000,4.pfn=__phys_to_pfn(S3C64XX_PA_DM9000),5.length=S3C64XX_SZ_DM9000,6.type=MT_DEVICE,7},8{9.