没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
1. 确定 processor type
arch/arm/kernel/head.S 中:
00075: mrc p15, 0, r9, c0, c0 @ get processor id
00076: bl __lookup_processor_type @ r5=procinfo r9=cpuid
00077: movs r10, r5 @ invalid processor (r5=0)?
00078: beq __error_p @ yes, error 'p'
75 行: 通过 cp15 协处理器的 c0 寄存器来获得 processor id 的指令. 关于 cp15
的详细内容可参考相关的 arm 手册
76 行: 跳转到__lookup_processor_type.在__lookup_processor_type 中,会把
processor type 存储在 r5 中
77,78 行: 判断 r5 中的 processor type 是否是 0,如果是 0,说明是无效的
processor type,跳转到__error_p(出错)
__lookup_processor_type 函数主要是根据从 cpu 中获得的 processor id 和系统
中的 proc_info 进行匹配,将匹配到的 proc_info_list 的基地址存到 r5 中, 0 表示没
有找到对应的 processor type.
下面我们分析__lookup_processor_type 函数
arch/arm/kernel/head-common.S 中:
00145: .type __lookup_processor_type, %function
00146: __lookup_processor_type:
00147: adr r3, 3f
00148: ldmda r3, {r5 - r7}
00149: sub r3, r3, r7 @ get offset between virt&phys
00150: add r5, r5, r3 @ convert virt addresses to
00151: add r6, r6, r3 @ physical address space
00152: 1: ldmia r5, {r3, r4} @ value, mask
00153: and r4, r4, r9 @ mask wanted bits
00154: teq r3, r4
00155: beq 2f
00156: add r5, r5, #PROC_INFO_SZ @ sizeof(proc_info_list)
00157: cmp r5, r6
00158: blo 1b
00159: mov r5, #0 @ unknown processor
00160: 2: mov pc, lr
00161:
00162:
00165: ENTRY(lookup_processor_type)
00166: stmfd sp!, {r4 - r7, r9, lr}
00167: mov r9, r0
00168: bl __lookup_processor_type
00169: mov r0, r5
00170: ldmfd sp!, {r4 - r7, r9, pc}
00171:
00172:
00176: .long __proc_info_begin
00177: .long __proc_info_end
00178: 3: .long .
00179: .long __arch_info_begin
00180: .long __arch_info_end
145, 146 行是函数定义
147 行: 取地址指令,这里的 3f 是向前 symbol 名称是 3 的位置,即第 178 行,将该
地址存入 r3.
这里需要注意的是,adr 指令取址,获得的是基于 pc 的一个地址,要格外注意,
这个地址是 3f 处的"运行时地址",由于此时 MMU 还没有打开,也可以理解成物理
地址(实地址).(详细内容可参考 arm 指令手册)
148 行: 因为 r3 中的地址是 178 行的位置的地址,因而执行完后:
r5 存的是 176 行符号 __proc_info_begin 的地址;
r6 存的是 177 行符号 __proc_info_end 的地址;
r7 存的是 3f 处的地址.
这里需要注意链接地址和运行时地址的区别. r3 存储的是运行时地址(物理
地址),而 r7 中存储的是链接地址(虚拟地址).
__proc_info_begin 和__proc_info_end 是在
arch/arm/kernel/vmlinux.lds.S 中:
00031: __proc_info_begin = .;
00032: *(.proc.info.init)
00033: __proc_info_end = .;
这里是声明了两个变量:__proc_info_begin 和 __proc_info_end,其中等
号后面的"."是 location counter(详细内容请参考 ld.info)
这三行的意思是: __proc_info_begin 的位置上,放置所有文件中的
".proc.info.init" 段的内容,然后紧接着是 __proc_info_end 的位置.
kernel 使用 struct proc_info_list 来描述 processor type.
在 include/asm-arm/procinfo.h 中:
00029: struct proc_info_list {
00030: unsigned int cpu_val;
00031: unsigned int cpu_mask;
00032: unsigned long __cpu_mm_mmu_flags;
00033: unsigned long __cpu_io_mmu_flags;
00034: unsigned long __cpu_flush;
00035: const char *arch_name;
00036: const char *elf_name;
00037: unsigned int elf_hwcap;
00038: const char *cpu_name;
00039: struct processor *proc;
00040: struct cpu_tlb_fns *tlb;
00041: struct cpu_user_fns *user;
00042: struct cpu_cache_fns *cache;
00043: };
我们当前以 at91 为例,其 processor 是 926 的.
在 arch/arm/mm/proc-arm926.S 中:
00464: .section ".proc.info.init", #alloc, #execinstr
00465:
00466: .type __arm926_proc_info,#object
00467: __arm926_proc_info:
00468: .long 0x41069260 @ ARM926EJ-S (v5TEJ)
00469: .long 0xff0ffff0
00470: .long PMD_TYPE_SECT | \
00471: PMD_SECT_BUFFERABLE | \
00472: PMD_SECT_CACHEABLE | \
00473: PMD_BIT4 | \
00474: PMD_SECT_AP_WRITE | \
00475: PMD_SECT_AP_READ
00476: .long PMD_TYPE_SECT | \
00477: PMD_BIT4 | \
00478: PMD_SECT_AP_WRITE | \
00479: PMD_SECT_AP_READ
00480: b __arm926_setup
00481: .long cpu_arch_name
00482: .long cpu_elf_name
00483: .long
HWCAP_SWP|HWCAP_HALF|HWCAP_THUMB|HWCAP_FAST_MULT|HW
CAP_VFP|HWCAP_EDSP|HWCAP_JAVA
00484: .long cpu_arm926_name
00485: .long arm926_processor_functions
00486: .long v4wbi_tlb_fns
00487: .long v4wb_user_fns
00488: .long arm926_cache_fns
00489: .size __arm926_proc_info, . - __arm926_proc_info
从 464 行,我们可以看到 __arm926_proc_info 被放到了".proc.info.init"段
中.
剩余19页未读,继续阅读
资源评论
苦茶子12138
- 粉丝: 1w+
- 资源: 6万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 农村信用社联合社计算机信息系统投产与变更管理办.docx
- 农村信用社联合社计算机信息系统数据管理办法.docx
- 利用SPSS作临床效度分析线上计算网站介绍-医学研究部统计谘.(医学PPT课件).ppt
- 利用Zabbix监控mysqldump定时备份数据库状态.docx
- 利用计算机解决问题的基本过程.doc
- 化工铁路通信工程总结.doc
- 北京大学网络教育软件工程作业.docx
- 医药公司(连锁店)计算机操作规程未新系统的自行按照旧制修改-新系统过制的编号加修模版.doc
- 医药公司(连锁店)计算机系统操作规程模版.doc
- 医药连锁门店计算机系统的操作和管理程序未新系统的自行按照旧制修改-新系统过制的编号加修模版.docx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功