devicemaps_init(mdesc)
2024-08-29 08:00:05
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(),这个函数的具体实现以后再详细分析。
最新文章
- CSharpGL(13)用GLSL实现点光源(point light)和平行光源(directional light)的漫反射(diffuse reflection)
- AlloyTouch插件
- Spark-Mllib(二)基本统计
- guava 学习笔记 使用瓜娃(guava)的选择和预判断使代码变得简洁
- T138
- 【转】Windows下搭建cvs服务器
- 编写一个函数func(),将此函数的输入参数(int型)逆序输出显示,如54321 –>; 12345,要求使用递归,并且函数体代码不超过8行
- 深入C语言内存区域分配(进程的各个段)详解(转)
- SE 2014年4月4日
- HTML转PDF
- 【hihoCoder 第133周】2-SAT&#183;hihoCoder音乐节
- 【原】eclipse创建maven工程时,如何修改默认JDK版本?
- 程序员如何避免996、icu?欢迎来讨论一下。
- Android 解析标准的点击第三方文件管理器中的视频的intent
- Java多线程概念
- Spring boot多模块(moudle)中的一个注入错误(Unable to start embedded container; nested exception is org)
- 四则运算生成器功能完善&;&;界面设计——结对项目
- hdu 1811 Rank of Tetris - 拓扑排序 - 并查集
- OpenCV学习C++接口 Mat像素遍历详解
- java中的不同的value类型从map中获取不同的value值
热门文章
- Golang: runnerw.exe: CreateProcess failed with error 216 (no message available)
- js中===、==、!=、!===的区别
- Linux常用命令汇总(渐更)
- 从零开始的全栈工程师——js篇2.13(字符串与数组的方法)
- 【MFC】获取文件大小的方法
- Sqlserver计算本年度工作日
- ubuntu下JDK安装(更新旧版本JAVA)
- 更新KB915597补丁后导致“您的windows副本不是正版”的解决方案
- 查看SAP CRM和C4C的UI technical信息
- 新建framework的bundle资源 linker command failed with exit code 1解決