移植内核必备知识

上传人:正** 文档编号:41294219 上传时间:2018-05-29 格式:DOC 页数:15 大小:45KB
返回 下载 相关 举报
移植内核必备知识_第1页
第1页 / 共15页
移植内核必备知识_第2页
第2页 / 共15页
移植内核必备知识_第3页
第3页 / 共15页
移植内核必备知识_第4页
第4页 / 共15页
移植内核必备知识_第5页
第5页 / 共15页
点击查看更多>>
资源描述

《移植内核必备知识》由会员分享,可在线阅读,更多相关《移植内核必备知识(15页珍藏版)》请在金锄头文库上搜索。

1、移植内核必备知识移植内核必备知识-6410 的寄存器物理虚拟的寄存器物理虚拟-地址映射方法地址映射方法嵌入式开发联盟 Osboy 站长原创QQ:82475491M(一)(一)64106410 设备的物理地址与虚拟地址的映射设备的物理地址与虚拟地址的映射MACHINE_START(MCUOS6410, “MCUOS6410“)/* Maintainer: Ben Dooks */.boot_params = S3C64XX_PA_SDRAM + 0x100,.init_irq = s3c6410_init_irq,.map_io.map_io = = mcuos6410_map_io,mcuos

2、6410_map_io,.init_machine = mcuos6410_machine_init,.timer = ARRAY_SIZE(mcuos6410_iodesc);s3c24xx_init_clocks(12000000);s3c24xx_init_uarts(mcuos6410_uartcfgs, ARRAY_SIZE(mcuos6410_uartcfgs);s3c64xx_init_ios3c64xx_init_io 最终会调用下面这个函数:最终会调用下面这个函数:iotable_init(s3c_iodesc,iotable_init(s3c_iodesc, ARRAY_S

3、IZE(s3c_iodesc);ARRAY_SIZE(s3c_iodesc);s3c_iodesc 结构体定义在:static struct map_desc s3c_iodescs3c_iodesc _initdata = .virtual.virtual = = (unsigned(unsigned long)S3C_VA_SYS,long)S3C_VA_SYS,.pfn.pfn = = _phys_to_pfn(S3C64XX_PA_SYSCON),_phys_to_pfn(S3C64XX_PA_SYSCON),.length.length = = SZ_4K,SZ_4K,.type.t

4、ype = = MT_DEVICE,MT_DEVICE, .virtual = (unsigned long)S3C_VA_MEM,.pfn = _phys_to_pfn(S3C64XX_PA_SROM),.length = SZ_4K,.type = MT_DEVICE, .virtual = (unsigned long)(S3C_VA_UART + UART_OFFS),.pfn = _phys_to_pfn(S3C_PA_UART),.length = SZ_4K,.type = MT_DEVICE, .virtual = (unsigned long)VA_VIC0,.pfn = _

5、phys_to_pfn(S3C64XX_PA_VIC0),.length = SZ_16K,.type = MT_DEVICE, .virtual = (unsigned long)VA_VIC1,.pfn = _phys_to_pfn(S3C64XX_PA_VIC1),.length = SZ_16K,.type = MT_DEVICE, .virtual = (unsigned long)S3C_VA_TIMER,.pfn = _phys_to_pfn(S3C_PA_TIMER),.length = SZ_16K,.type = MT_DEVICE, .virtual = (unsigne

6、d long)S3C64XX_VA_GPIO,.pfn = _phys_to_pfn(S3C64XX_PA_GPIO),.length = SZ_4K,.type = MT_DEVICE, .virtual = (unsigned long)S3C64XX_VA_MODEM,.pfn = _phys_to_pfn(S3C64XX_PA_MODEM),.length = SZ_4K,.type = MT_DEVICE, .virtual = (unsigned long)S3C_VA_WATCHDOG,.pfn = _phys_to_pfn(S3C64XX_PA_WATCHDOG),.lengt

7、h = SZ_4K,.type = MT_DEVICE, .virtual = (unsigned long)S3C_VA_USB_HSPHY,.pfn = _phys_to_pfn(S3C64XX_PA_USB_HSPHY),.length = SZ_1K,.type = MT_DEVICE,;linux/include/asm-arm/plat-s3c/map.h 中有如下定义,我们在这边手动的定义了寄存器的虚拟地址空间:#define#define S3C_ADDR_BASES3C_ADDR_BASE 0xF60000000xF6000000#ifndef _ASSEMBLY_#defi

8、ne S3C_ADDR(x) (void _iomem _force *)S3C_ADDR_BASE + (x)#else#define S3C_ADDR(x) (S3C_ADDR_BASE + (x)#endif#define S3C_VA_IRQ S3C_ADDR(0x00000000) /* irq controller(s) */#define S3C_VA_SYS S3C_ADDR(0x00100000) /* system control */#define S3C_VA_MEM S3C_ADDR(0x00200000) /* memory control */#define S3

9、C_VA_TIMER S3C_ADDR(0x00300000) /* timer block */#define S3C_VA_WATCHDOG S3C_ADDR(0x00400000) /* watchdog */#define S3C_VA_UART S3C_ADDR(0x01000000) /* UART */* This is used for the CPU specific mappings that may be needed, so that* they do not need to directly used S3C_ADDR() and thus make it easie

10、r to* modify the space for mapping.*/#define S3C_ADDR_CPU(x) S3C_ADDR(0x00500000 + (x)iotable_initiotable_init 函数原型为:函数原型为:void _init iotable_initiotable_init(struct map_desc *io_desc, int nr)int i;for (i = 0; i virtual != vectors_base() return;if (md-type = MT_DEVICE | md-type = MT_ROM) /这里有规定就是从这里

11、有规定就是从 0xc00000000xc0000000 VMALLOC_ENDVMALLOC_END 这段空间不能这段空间不能作为作为 MT_DEVICEMT_DEVICE 或者或者 MT_ROMMT_ROM 类型的设备的虚拟地址空间的。类型的设备的虚拟地址空间的。64106410这边的这边的 VMALLOC_ENDVMALLOC_END 为为 0xF60000000xF6000000,正好是上面我们手动定义的寄,正好是上面我们手动定义的寄存器的虚拟地址空间的基地址。存器的虚拟地址空间的基地址。type = 这个的有讲究哦,看下它的代码,当外设的类型为:这个的有讲究哦,看下它的代码,当外设的类

12、型为:MT_DEVICEMT_DEVICE的时候,下面的结构体定义的其实是一级段映射的描述符,结合前的时候,下面的结构体定义的其实是一级段映射的描述符,结合前面的面的 mmcmmc 基础知识,在联系这里的基础知识,在联系这里的 codecode,是不是有举一反三的效果?,是不是有举一反三的效果?static struct mem_type mem_typesmem_types = MT_DEVICEMT_DEVICE = /* Strongly ordered / ARMv6 shared device */.prot_pte = PROT_PTE_DEVICE | L_PTE_MT_DEV_

13、SHARED |L_PTE_SHARED,.prot_l1 = PMD_TYPE_TABLE,.prot_sect = PROT_SECT_DEVICE | PMD_SECT_S,.domain = DOMAIN_IO,/* Catch 36-bit addresses*/ifif (md-pfn(md-pfn = 0x100000)0x100000) /作为一个作为一个 4k4k 为基本页为基本页面的面的 linuxlinux,如果页帧超过,如果页帧超过 0x1000000x100000,那么地址空间将超过,那么地址空间将超过 100000100000 virtualmd-virtual /

14、PAGE_MASK;/取取 addraddr 为页对齐。为页对齐。phys = _pfn_to_phys(md-pfn);/页帧转化成页的函页帧转化成页的函数为将页帧左移数为将页帧左移 12bit12bit。length = PAGE_ALIGN(md-length + (md-virtual if (type-prot_l1 = 0 return;pgdpgd = = pgd_offset_k(addr);pgd_offset_k(addr);endend = = addraddr + + length;length;dodo unsignedunsigned longlong nextnext = = pgd_addr_end(addr,pgd_addr_end(addr, end);end);alloc_init_pud(pgd,alloc_init_pud(pgd, addr,addr, next,next, phys,phys, type);type);physph

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 其它办公文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号