linux内核启动时,第一次创建页表
来源:互联网 发布:南京行知基地住宿条件 编辑:程序博客网 时间:2024/06/03 16:03
/* * Setup the initial page tables. We only setup the barest * amount which are required to get the kernel running, which * generally means mapping in the kernel code. * * r8 = machinfo * r9 = cpuid * r10 = procinfo * * Returns: * r0, r3, r6, r7 corrupted * r4 = physical page table address */__create_page_tables:pgtblr4@ page table address /*r4为页表的基地址0x30004000*//* * Clear the 16K level 1 swapper page table */ /*清除页表所用的内存为0,0x30004000~0x30007fff*/movr0, r4movr3, #0addr6, r0, #0x40001:strr3, [r0], #4strr3, [r0], #4strr3, [r0], #4strr3, [r0], #4teqr0, r6bne1b/*将内核镜像中的MMU flag数值取出,准备设置page table*/ldrr7, [r10, #PROCINFO_MM_MMUFLAGS] @ mm_mmuflags 假如r7=0xabced/* * Create identity mapping for first MB of kernel to * cater for the MMU enable. This identity mapping * will be removed by paging_init(). We use our current program * counter to determine corresponding section base address. */movr6, pc@ 取当前pc的值到r6,对当前的地址进行映射movr6, r6, lsr #20@ start of kernel section, 每页的大小为1M,高12位为页表项的索引,mini2440上r6=0x300orrr3, r7, r6, lsl #20@ flags + kernel base <span style="color: rgb(102, 102, 102); font-family: 宋体;font-size:12px; line-height: 26px;">根据上句得出的段计数左移20位算出段地址,并将将低20bit设置成MMU的flag,得到一个map entry,假如r3=0x300abced</span>strr3, [r4, r6, lsl #2]@ identity mapping r4=0x30004000 r6=0x300<<2=0xc00; *(0x30004c00)=0x300abcde/* * Now setup the pagetables for our kernel direct * mapped region. */addr0, r4, #(KERNEL_START & 0xff000000) >> 18 /*为什么是0xff000000,用r0来作为以后建立一个表项后,来增加4个字节的基地址,右移18位=(<pre name="code" class="cpp">#(KERNEL_START & 0xff000000)<<20)>>2*/str r3, [r0, #(KERNEL_START & 0x00f00000) >> 18]!ldr r6, =(KERNEL_END - 1)add r0, r0, #4add r6, r4, r6, lsr #181: cmp r0, r6/*对内核虚拟地址的开始KERNEL_START到结束KERNEL_END 做映射*/
add r3, r3, #1 << 20 /*r3的高12位为对应物理页高12位的索引,*/strls r3, [r0], #4/*r0为要将要写页表内容的页表项地址*/bls 1b/* * Then map first 1MB of ram in case it contains our boot params. */add r0, r4, #PAGE_OFFSET >> 18orr r6, r7, #(PHYS_OFFSET & 0xff000000).if (PHYS_OFFSET & 0x00f00000)orr r6, r6, #(PHYS_OFFSET & 0x00f00000).endifstr r6, [r0]#endifmov pc, lrENDPROC(__create_page_tables)
0 0
- linux内核启动时,第一次创建页表
- ARM Linux 内核启动总结 之 创建临时页表
- 第一次编译linux内核
- 第一次编译Linux内核
- Linux 内核临时页表的创建
- Linux内核分析 第一次作业
- 第一次启动Android studio创建文档时出现错误解决方法
- linux升级内核之后Virtualbox启动出错无法创建任务
- Linux内核启动分析之初始化临时页表
- linux内核启动(2)——2.2.创建和中止任务与内核线程
- 在Linux内核启动时打印时间
- 在Linux内核启动时打印时间
- 在Linux内核启动时打印时间
- Linux centos7第一次启动时无图形界面安装
- Linux内核启动地址
- Linux 内核启动分析
- Linux内核启动参数
- Linux内核启动分析
- lru 清缓存(IOS)
- ubuntu下配置OpenVPN
- Git的深入理解与GitHub托管服务的使用
- 淘宝客小心被坑
- 字典使用
- linux内核启动时,第一次创建页表
- jQuery炫酷3D旋转幻灯片特效插件
- 1.3 C++中的并行和多线程
- Redis 集群方案
- Java ArrayList源代码学习笔记
- C++小知识(不断更新)
- 不水好好学——Kali Linux初识
- eclipse link方式安装插件安装不上
- 权威披露2014微信十大最火谣言 | 调查称女性最爱传谣,你服不服?