[TZ]内存与IO访问(4)-IO内存静态映射

转载请注明原文地址:http://blog.csdn.net/ts_dchs/article/details/50246543

1 流程分析

(本节以s5pv210(ARM A8) of Linux 3.0.26为例)
Linux提供外设IO内存物理地址到Linux虚拟地址的静态映射。静态映射是指通过map_desc结构体静态创建I/O资源映射表。
struct map_desc[code]结构体包含虚拟地址,设备物理地址。常用于寄存器资源映射,这样静态映射之后在编写内核代码或驱动时就不需要再ioremap。系统启动时创建好静态映射,程序直接通过映射后的虚拟地址去访问它们。

先说启动时做初始化的工作。内核提供了一个重要的结构体struct machine_desc[code] ,内核通过machine_desc结构体来控制系统体系架构相关部分的初始化。为了初始化工作,包括map_io, init_irq, init_machine以及phys_io , timer成员等。

这里的map_io成员即内核提供给用户的创建外设I/O资源到内核虚拟地址静态映射表的接口函数。map_io成员函数会在系统初始化过程中Start_kernel -> setup_arch() –> paging_init() –> devicemaps_init()中被调用。结构体通过MACHINE_START[code]宏初始化。这部分根据平台不同设计。

//LinuxSrc/arch/arm/mach-s5pv210/mach-smdkv210.c
MACHINE_START(SMDKV210, "SMDKV210")
    /* Maintainer: Kukjin Kim <[email protected]> */
    .boot_params    = S5P_PA_SDRAM + 0x100,
    .init_irq       = s5pv210_init_irq,
    .map_io         = smdkv210_map_io,
    .init_machine   = smdkv210_machine_init,
    .timer          = &s5p_timer,
MACHINE_END

在上面的代码中,map_io初始化为smdkv210_map_iocode。如下:

//LinuxSrc/arch/arm/mach-s5pv210/mach-smdkv210.c
static void __init smdkv210_map_io(void)
{
        s5p_init_io(NULL, 0, S5P_VA_CHIPID);
        s3c24xx_init_clocks(24000000
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值