注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

火车的家

Put first thing first

 
 
 

日志

 
 

2012.01.27 kernel porting ( 一 ) ---- machine_desc 的 phys_io 和 io_pg_offst 字段  

2012-01-28 00:03:04|  分类: linux kernel |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

下文讨论 phys_io 与 io_pg_offst 的作用及使用方法。文中引用的内核代码基于 android 2.6.32 baseline。

1. phys_io 与 io_pg_offst

在作 BSP porting 的时候需要填充 machine_desc 结构体,其中有两个字段 phys_io 和 io_pg_offst:

MACHINE_START(MAP100, "MAP100")
.phys_io    = FFUART_BASE_PA,
.io_pg_offst    = ((FFUART_BASE_UA) >> 18) & 0xfffc,

.boot_params    = PARAMS_PHYS,
.timer        = &map100_timer,
.init_irq    = map100_init_irq,
.map_io        = map100_map_io,
.init_machine    = map100_machine_init,
MACHINE_END

phys_io 用来保存 UART 的物理地址,io_pg_offst 用来保存 UART 的内核空间虚拟地址。两者的映射关系在 arch/arm/kernel/head.S 中建立。这样,在 kernel 没有初始化完 MMU 时,就可以通过写 io_pg_offst 向 UART 打印调试信息。这主要在 low level 的调试函数中使用,比如 printascii。

2. phys_io 与 io_pg_offst 的映射关系如何建立
arch/arm/kernel/head.S 文件的 __create_page_tables 函数中有如下代码:

#ifdef CONFIG_DEBUG_LL
    ldr    r7, [r10, #PROCINFO_IO_MMUFLAGS] @ io_mmuflags
    /*
     * Map in IO space for serial debugging.
     * This allows debug messages to be output
     * via a serial console before paging_init.
     */
    ldr    r3, [r8, #MACHINFO_PGOFFIO] @ 用 io_pg_offst 计算 MMU 中的表项索引
    add    r0, r4, r3
    rsb    r3, r3, #0x4000            @ PTRS_PER_PGD*sizeof(long)
    cmp    r3, #0x0800            @ limit to 512MB
    movhi    r3, #0x0800
    add    r6, r0, r3
    ldr    r3, [r8, #MACHINFO_PHYSIO]
    orr    r3, r3, r7
1:    str    r3, [r0], #4 @ 这个循环把 phys_io 填充到 io_pg_offst 对应的 MMU 表项中
    add    r3, r3, #1 << 20
    teq    r0, r6
    bne    1b

    . . .  . . .

这样, phys_io 和 io_pg_offst 就建立了映射关系。

3. printascii 与 uart
printascii 函数调用了一个 汇编宏 addruart。 这个宏在 arch/arm/mach-XXX/include/mach/debug-macro.S 中定义。它的代码一般是这种形式:
    .macro    addruart,rx
    @ see if the MMU is enabled and select appropriate base address
    mrc    p15, 0, \rx, c1, c0
    tst    \rx, #1
    ldreq    \rx, =SUART_BASE_PA
    ldrne    \rx, =SUART_BASE_UA
    .endm

显然,这里用到了在 head.S 中建立的映射关系。
  评论这张
 
阅读(753)| 评论(0)

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018