博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
__enable_mmu
阅读量:2443 次
发布时间:2019-05-10

本文共 3173 字,大约阅读时间需要 10 分钟。

/* * Setup common bits before finally enabling the MMU.  Essentially * this is just loading the page table pointer and domain access * registers. * *  r0  = cp#15 control register *  r1  = machine ID *  r2  = atags or dtb pointer *  r4  = page table (see ARCH_PGD_SHIFT in asm/memory.h) *  r9  = processor ID *  r13 = *virtual* address to jump to upon completion */__enable_mmu:#if defined(CONFIG_ALIGNMENT_TRAP) && __LINUX_ARM_ARCH__ < 6	orr	r0, r0, #CR_A  #r0为什么不先清0?#else	bic	r0, r0, #CR_A#endif#ifdef CONFIG_CPU_DCACHE_DISABLE	bic	r0, r0, #CR_C#endif#ifdef CONFIG_CPU_BPREDICT_DISABLE	bic	r0, r0, #CR_Z#endif#ifdef CONFIG_CPU_ICACHE_DISABLE	bic	r0, r0, #CR_I#endif#ifndef CONFIG_ARM_LPAE	mov	r5, #(domain_val(DOMAIN_USER, DOMAIN_MANAGER) | \		      domain_val(DOMAIN_KERNEL, DOMAIN_MANAGER) | \		      domain_val(DOMAIN_TABLE, DOMAIN_MANAGER) | \		      domain_val(DOMAIN_IO, DOMAIN_CLIENT))/*结合数据手册,此段是将D0、D1两个域,D1对应于USER域,D0对应于KERNEL和TABLE域,配置为管理模式,对这两个域的访问和执行不受TLB中相应标志位影响,D2域,对应于IO域,配置为客户模式,对此域的访问受TLB中相应标志位的检查;*/	mcr	p15, 0, r5, c3, c0, 0		@ load domain access register	mcr	p15, 0, r4, c2, c0, 0		@ load page table pointer#endif	b	__turn_mmu_onENDPROC(__enable_mmu)
/* * Enable the MMU.  This completely changes the structure of the visible * memory space.  You will not be able to trace execution through this. * If you have an enquiry about this, *please* check the linux-arm-kernel * mailing list archives BEFORE sending another post to the list. * *  r0  = cp#15 control register *  r1  = machine ID *  r2  = atags or dtb pointer *  r9  = processor ID *  r13 = *virtual* address to jump to upon completion * * other registers depend on the function called upon completion */	.align	5	.pushsection	.idmap.text, "ax"ENTRY(__turn_mmu_on)	mov	r0, r0	instr_sync	mcr	p15, 0, r0, c1, c0, 0		@ write control reg	mrc	p15, 0, r3, c0, c0, 0		@ read id reg	instr_sync	mov	r3, r3	mov	r3, r13	mov	pc, r3__turn_mmu_on_end:ENDPROC(__turn_mmu_on)	.popsection
/* * The following fragment of code is executed with the MMU on in MMU mode, * and uses absolute addresses; this is not position independent. * *  r0  = cp#15 control register *  r1  = machine ID *  r2  = atags/dtb pointer *  r9  = processor ID */	__INIT__mmap_switched:	adr	r3, __mmap_switched_data	ldmia	r3!, {r4, r5, r6, r7}	cmp	r4, r5				@ Copy data segment if needed,from[r4]__data_loc to [r5]_sdata@  __data_loc是数据段在内核代码映像中的存储位置@ _sdata是数据段的链接位置(在内存中的位置)@ 如果是XIP技术的内核,这两个数据肯定不同1:	cmpne	r5, r6	ldrne	fp, [r4], #4 @ fp(frame pointer) == r11	strne	fp, [r5], #4	bne	1b	mov	fp, #0				@ Clear BSS (and zero fp)1:	cmp	r6, r7	strcc	fp, [r6],#4	bcc	1b@ 这里将需要的数据从寄存器中转移到全局变量中,因为最后会跳入C代码,寄存器会被使用 ARM(	ldmia	r3, {r4, r5, r6, r7, sp}) THUMB(	ldmia	r3, {r4, r5, r6, r7}	) THUMB(	ldr	sp, [r3, #16]		)	str	r9, [r4]			@ Save processor ID	str	r1, [r5]			@ Save machine type	str	r2, [r6]			@ Save atags pointer	cmp	r7, #0	bicne	r4, r0, #CR_A			@ Clear 'A' bit @ 禁用对齐错误检查	stmneia	r7, {r0, r4}			@ Save control register values@ 保存控制寄存器值到全局变量cr_alignment(在arch/arm/kernel/entry-armv.S)/*	.globl cr_alignment @ [r0]	.globl cr_not_alignment @ [r4]cr_alignment:	.space 4cr_not_alignment		.space 4*/	b	start_kernelENDPROC(__mmap_switched)

转载地址:http://kcsqb.baihongyu.com/

你可能感兴趣的文章
MySQL购InnoDB不敌甲骨文宣布开放数据引擎(转)
查看>>
银行监会选红旗Linux建设公文传输系统(转)
查看>>
网上交易中帐号和密码被盗的解决途径(转)
查看>>
Java线程总结(转)
查看>>
Java学习之类的属性(转)
查看>>
轻松搞定Java内存泄漏(转)
查看>>
Java学习之值传递(转)
查看>>
linux中crontab命令(转)
查看>>
牛人请进 小弟跪求(转)
查看>>
Linux版本凌乱痛失市场(转)
查看>>
大家好,新学生。 请问怎么升级Redhat9.0 kernel 2.4.X-->2.6.18 的详细过程(转)
查看>>
FreeBSD6.1+无线+永中......桌面安装【附笔记】(转)
查看>>
adsl设置(转)
查看>>
Wii将有一个可升级的Linux操作系统(转)
查看>>
Linux机为先锋智能机和PDA06销量大(转)
查看>>
Oracle与SQL Server在企业应用中的比较(转)
查看>>
让FreeBSD使用ntpd同步时间(转)
查看>>
用cat命令查看文件内的特殊字符(转)
查看>>
debian sid下vmware不能运行一则(转)
查看>>
Linux操作系统套接字编程的5个隐患(转)
查看>>