devicemaps_init的参数为machine_desc结构体。以s3c6410为例,在arch/arm/mach-s3c64xx/mach-smdk6410.c中使用上述宏声明machine_desc结构体

MACHINE_START(SMDK6410, "SMDK6410")
/* Maintainer: Ben Dooks <ben-linux@fluff.org> */
//.phys_io = S3C_PA_UART & 0xfff00000,
//.io_pg_offst = (((u32)S3C_VA_UART) >> 18) & 0xfffc,
.boot_params = S3C64XX_PA_SDRAM + 0x100, .init_irq = s3c6410_init_irq,
.map_io = smdk6410_map_io,
.init_machine = smdk6410_machine_init,
.timer = &s3c24xx_timer,
MACHINE_END

devicemaps_init的作用:

1.为中断向量分配内存,为中断向量虚拟地址映射的页表分配内存,建立虚拟地址到物理地址的映射。

具体参考create_mapping(&map)函数。

linux中ARM处理器使用的是高端中断向量地址0xffff_0000.

这一点可以在进入start_kernel之前的汇编函数__v6_setup中看到,该函数的返回值r0中保存的是要写入CP15 C1中的值。

/*
* __v6_setup
*
* Initialise TLB, Caches, and MMU state ready to switch the MMU
* on. Return in r0 the new CP15 C1 control register setting.
*
* We automatically detect if we have a Harvard cache, and use the
* Harvard cache control instructions insead of the unified cache
* control instructions.
*
* This should be able to cover all ARMv6 cores.
*
* It is assumed that:
* - cache type register is implemented
*/
__v6_setup:
#ifdef CONFIG_SMP
mrc p15, , r0, c1, c0, @ Enable SMP/nAMP mode
orr r0, r0, #0x20
mcr p15, , r0, c1, c0,
#endif mov r0, #
mcr p15, , r0, c7, c14, @ clean+invalidate D cache
mcr p15, , r0, c7, c5, @ invalidate I cache
mcr p15, , r0, c7, c15, @ clean+invalidate cache
mcr p15, , r0, c7, c10, @ drain write buffer
#ifdef CONFIG_MMU
mcr p15, , r0, c8, c7, @ invalidate I + D TLBs
mcr p15, , r0, c2, c0, @ TTB control register
orr r4, r4, #TTB_FLAGS
mcr p15, , r4, c2, c0, @ load TTB1
#endif /* CONFIG_MMU */
adr r5, v6_crval
ldmia r5, {r5, r6}
mrc p15, , r0, c1, c0, @ read control register
bic r0, r0, r5 @ clear bits them
orr r0, r0, r6 @ set them
mov pc, lr @ return to head.S:__ret

v6_crval宏的定义如下:

    .macro    crval, clear, mmuset, ucset
#ifdef CONFIG_MMU
.word \clear
.word \mmuset
#else
.word \clear
.word \ucset
#endif
.endm .type v6_crval, #object
v6_crval:
crval clear=0x01e0fb7f, mmuset=0x00c0387d, ucset=0x00c0187c

r0 = r0 & (~clear) | (mmuset)

可以看到,最终V是被设置为1了,所以是高端地址中断。

2.调用mdesc->map_io()进行SOC相关的初始化。

以S3C6410为例调用的是smdk6410_map_io(),这个函数的具体实现以后再详细分析。

最新文章

  1. CSharpGL(13)用GLSL实现点光源(point light)和平行光源(directional light)的漫反射(diffuse reflection)
  2. AlloyTouch插件
  3. Spark-Mllib(二)基本统计
  4. guava 学习笔记 使用瓜娃(guava)的选择和预判断使代码变得简洁
  5. T138
  6. 【转】Windows下搭建cvs服务器
  7. 编写一个函数func(),将此函数的输入参数(int型)逆序输出显示,如54321 –&gt; 12345,要求使用递归,并且函数体代码不超过8行
  8. 深入C语言内存区域分配(进程的各个段)详解(转)
  9. SE 2014年4月4日
  10. HTML转PDF
  11. 【hihoCoder 第133周】2-SAT&#183;hihoCoder音乐节
  12. 【原】eclipse创建maven工程时,如何修改默认JDK版本?
  13. 程序员如何避免996、icu?欢迎来讨论一下。
  14. Android 解析标准的点击第三方文件管理器中的视频的intent
  15. Java多线程概念
  16. Spring boot多模块(moudle)中的一个注入错误(Unable to start embedded container; nested exception is org)
  17. 四则运算生成器功能完善&amp;&amp;界面设计——结对项目
  18. hdu 1811 Rank of Tetris - 拓扑排序 - 并查集
  19. OpenCV学习C++接口 Mat像素遍历详解
  20. java中的不同的value类型从map中获取不同的value值

热门文章

  1. Golang: runnerw.exe: CreateProcess failed with error 216 (no message available)
  2. js中===、==、!=、!===的区别
  3. Linux常用命令汇总(渐更)
  4. 从零开始的全栈工程师——js篇2.13(字符串与数组的方法)
  5. 【MFC】获取文件大小的方法
  6. Sqlserver计算本年度工作日
  7. ubuntu下JDK安装(更新旧版本JAVA)
  8. 更新KB915597补丁后导致“您的windows副本不是正版”的解决方案
  9. 查看SAP CRM和C4C的UI technical信息
  10. 新建framework的bundle资源 linker command failed with exit code 1解決