您的位置 首页 应用

arm linux 从入口到start_kernel 代码剖析 – 5

4.调用平台特定的__cpu_flush函数当__create_page_tables返回之后此时,一些特定寄存器的值如下所示:r4=pgtbl(pagetable…

4. 调用渠道特定的 __cpu_flush 函数

当 __create_page_tables 回来之后

此刻,一些特定寄存器的值如下所示:
r4 = pgtbl (page table 的物理基地址)
r8 = machine info (struct machine_desc的基地址)
r9 = cpu id (经过cp15协处理器取得的cpu id)
r10 = procinfo (struct proc_info_list的基地址)

在咱们需求在敞开mmu之前,做一些有必要的作业:铲除ICache, 铲除 DCache, 铲除 Writebuffer, 铲除TLB等.
这些一般是经过cp15协处理器来完成的,并且是渠道相关的. 这便是 __cpu_flush 需求做的作业.

在 arch/arm/kernel/head.S中
00091: ldrr13, __switch_data@ address to jump to after
00092: @ mmu has been enabled
00093: adrlr, __enable_mmu@ return (PIC) address
00094: addpc, r10, #PROCINFO_INITFUNC

第91行: 将r13设置为 __switch_data 的地址
第92行: 将lr设置为 __enable_mmu 的地址
第93行: r10存储的是procinfo的基地址, PROCINFO_INITFUNC是在 arch/arm/kernel/asm-offset.c 中107行界说.
则该即将pc设为 proc_info_list的 __cpu_flush 函数的地址, 即下面跳转到该函数.
在剖析 __lookup_processor_type 的时分,咱们现已知道,关于 ARM926EJS 来说,其__cpu_flush指向的是函数 __arm926_setup


下面咱们来剖析函数 __arm926_setup

在 arch/arm/mm/proc-arm926.S 中:
00391: .type__arm926_setup, #function
00392: __arm926_setup:
00393: movr0, #0
00394: mcrp15, 0, r0, c7, c7@ invalidate I,D caches on v4
00395: mcrp15, 0, r0, c7, c10, 4@ drain write buffer on v4
00396: #ifdef CONFIG_MMU
00397: mcrp15, 0, r0, c8, c7@ invalidate I,D TLBs on v4
00398: #endif
00399:
00400:
00401: #ifdef CONFIG_CPU_DCACHE_WRITETHROUGH
00402: movr0, #4@ disable write-back on caches explicitly
00403: mcrp15, 7, r0, c15, c0, 0
00404: #endif
00405:
00406: adrr5, arm926_crval
00407: ldmiar5, {r5, r6}
00408: mrcp15, 0, r0, c1, c0@ get control register v4
00409: bicr0, r0, r5
00410: orrr0, r0, r6
00411: #ifdef CONFIG_CPU_CACHE_ROUND_ROBIN
00412: orrr0, r0, #0x4000@ .1.. …. …. ….
00413: #endif
00414: movpc, lr
00415: .size__arm926_setup, . – __arm926_setup
00416:
00417:
00423: .typearm926_crval, #object
00424: arm926_crval:
00425: crvalclear=0x00007f3f, mmuset=0x00003135, ucset=0x00001134

第391, 392行: 是函数声明
第393行: 将r0设置为0
第394行: 铲除(invalidate)Instruction Cache 和 Data Cache.
第395行: 铲除(drain) Write Buffer.
第396 – 398行: 假如有装备了MMU,则需求铲除(invalidate)Instruction TLB 和Data TLB

接下来,是对操控寄存器c1进行装备,请参阅 ARM926 TRM.

第401 – 404行: 假如装备了Data Cache运用writethrough方法, 需求关掉write-back.

第406行: 取arm926_crval的地址到r5中, arm926_crval 在第424行

第407行: 这儿咱们需求看一下424和425行,其间用到了宏crval,crval是在 arch/arm/mm/proc-macro.S 中:

00053: .macrocrval, clear, mmuset, ucset
00054: #ifdef CONFIG_MMU
00055: .word\clear
00056: .word\mmuset
00057: #else
00058: .word\clear
00059: .word\ucset
00060: #endif
00061: .endm

合作425行,咱们能够看出,首先在arm926_crval的地址处寄存了clear的值,然后接下来的地址寄存了mmuset的值(关于装备了MMU的状况)

所以,在407行中,咱们将clear和mmuset的值别离存到了r5, r6中

第408行: 取得操控寄存器c1的值
第409行: 将r0中的 clear (r5) 对应的位都铲除去
第410行: 设置r0中 mmuset (r6) 对应的位

第411 – 413行: 假如装备了运用 round robin方法,需求设置操控寄存器c1的 Bit[16]
第412行: 取lr的值到pc中.
而lr中的值寄存的是 __enable_mmu 的地址(arch/arm/kernel/head.S 93行),所以,接下来便是跳转到函数 __enable_mmu

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/yingyong/275642.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部