详解Linux内核在arm上的启动过程

Linux内核加载过程

通常,Linux内核都是经过gzip加载过之后的映像文件。

  • bootloader复制压缩内核到内存空间。

  • 内核自解压。

  • 运行内核。

编译完成的Linux内核存放在哪里?

  • ./vmlinux     elf格式未压缩内核。

  • arch/arm/boot/compressed/vmlinux    压缩以后的elf格式内核。

  • arch/arm/boot/zImage    压缩内核。

压缩内核(zImage)的入口

  • /arch/arm/boot/compressed/vmlinux.lds    该文件为编译器指定link顺序。

  • ENTRY(_start)    压缩内核从.start段开始执行。

  • 在/arch/arm/boot/compressed/head.S中执行以下爱操作:

        (1)检测系统空间。

        (2)初始化C代码空间。

        (3)跳转到C代码decompress_kernel,

                 arch/arm/boot/compressed/misc.c中。

解压之前的串口输出

  • include/asm-arm/arch-s3c2410/uncompress.h    中定义了puts作为串口输出函数。

  • 解压结束之后,程序跳转到r5:解压之后内核的起始地址。

开始真正的Linux内核

1、入口在arch/arm/kernel/head-armv.S

2、查找处理器类型

  • __lookup_processor_type

  • __lookup_architecture_type

3、初始化页表:__creat_page_tables

4、初始化C代码空间

5、跳转到C代码中,start_kernel

ARM的MMU单元

MMU:内存管理单元

作用:

  • 虚拟地址到物理地址的映射

  • 存储器访问权限

  • 控制Cache

通过MMU的访存

  • MMU会先查找TLB中的虚拟地址表

  • 如果TLB中没有虚拟地址的入口,硬件从主存储器中的转换表中获取转换与访问权限。

ARM的MMU访存原理

ARM的MMU页表格式

MMU支持基于节或者页的存储器访问。

  • 节:1MB的存储器块

  • 大页:64KB的存储器块

  • 小页:4KB的存储器块

  • 微页:1KB的存储器块

页表的级别

存在主存储器内的转换页表有两个级别:

  • 第一级表:存储节转换表与指向第二级表的指针

  • 第二级表:

    (1)存储大页和小页的转换表。

    (2)存储微页的转换表。

一级页表的地址

第一级表占用空间16KB,必须16KB对齐

第一级描述符

一级表每个入口描述了它所关联的1MB虚拟地址是如何映射的。

节描述符

  • Bits[1:0] 描述符类型(10b 表示节描述符)

  • Bits[3:2] 高速缓存(cache)和缓冲位(buffer)

  • Bits[4] 由具体实现定义

  • Bits[8:5] 控制的节的16 种域之一

  • Bits[9] 现在没有使用,应该为零

  • Bits[11:10] 访问控制(AP)

  • Bits[19:12] 现在没有使用,应该为零

  • Bits[31:20] 节基址,形成物理地址的高12 位

节的转换过程

临时内核页表的创建 __create_page_tables

__create_page_tables:
pgtbl r4 @ page table address 0x30008000-0x4000
mov r0, r4 @r0=0x30004000
mov r3, #0
add r2, r0, #0x4000
1: str r3, [r0], #4
str r3, [r0], #4
str r3, [r0], #4
str r3, [r0], #4
teq r0, r2
bne 1b

把一级页表0x30004000-0xa0080000清空

krnladr r2, r4 @ start of kernel

r4=0xa0004000,r2 = 内核起始地址所在1MB对齐空间,0x30000000

add r3, r8, r2 @ flags + kernel base

r8 为从处理器信息中得到的MMU 页表标志,r8=0xc0e, r3=0x30000c0e

str r3, [r4, r2, lsr #18]@ identity mapping

地址:0x300068000, value:0x30000c0e

add r0, r4, #(TEXTADDR & 0xff000000) >> 18 
@ start of kernel
bic r2, r3, #0x00f00000
str r2, [r0] @ PAGE_OFFSET + 0MB
add r0, r0, #(TEXTADDR & 0x00f00000) >> 18
str r3, [r0], #4 @ KERNEL + 0MB
......

映射表内容

映射结果

进入C代码

init/main.c中的start_kernel函数,进入到了Linux内核代码中。

  • printk函数

  • 重新初始化页表

  • 初始化中断,trap_init

  • 设置系统定时器、控制台…

  • 创建内核进程init


推荐阅读:

专辑|Linux文章汇总

专辑|程序人生

专辑|C语言

我的知识小密圈

关注公众号,后台回复「1024」获取学习资料网盘链接。

欢迎点赞,关注,转发,在看,您的每一次鼓励,我都将铭记于心~

嵌入式Linux

微信扫描二维码,关注我的公众号

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/465345.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java 数据库 properties_原生Java读取properties连接数据库

将数据库的驱动、url、用户名、密码等信息以键值对的形式存放在properties文件中,工具类初始化时从配置文件中读取所要连接数据库的信息。当需要更改连接的数据库时,只需要更改配置文件即可,而不必改写工具类的代码。1.在项目中创建一个prope…

【谱聚类算法总结】

前言:以前只是调用过谱聚类算法,我也不懂为什么各家公司都问我一做文字检测的这个算法具体咋整的,没整明白还给我挂了哇擦嘞?讯飞还以这个理由刷本宝,今天一怒把它给整吧清楚了,下次谁再问来!说…

嵌入式的汉字原来是这样显示的?

摘要:LCD是嵌入式常见设备,如何在LCD上显示汉字和英文?矢量字体和点阵字体有何不同?同一个字符为何有多种编码?GB2312、GB18030指什么?他们之间有关系吗?嵌入式设备如何支持多国语言&#xff1f…

查看数据库、表、索引的物理存储情况

在管理、维护数据库时,经常需要查看数据库文件、日志文件所占用的磁盘空间,以及磁盘还剩下的磁盘空间,你可以通过下面几种方面查看数据库文件详细情况:1: 是通过远程连接(或VPN)连接到数据库服务器,直接去查…

Spring简化Java开发_spring如何简化java开发

1、spring简介Spring的主要目的是用来替代更加重量级的企业级的java技术2、spring如何简化java开发1)基于POJO的轻量级和最小侵入性编程;2)通过依赖注入和面向接口实现松耦合;3)基于切面和惯例进行声明式编程;4)通过切面和模板减少样版式代码…

Linux 应用调试神器- ASan

今天有小伙伴跟我他的程序崩溃了要怎么办,刚好我最近做项目使用到这个神器,做应用开发的同学可以看看,可以在C/C上配置使用。不过这仅限于调试,如果你是发布版本,一定要把这个功能关闭。当然,这是我实操的结…

asp.net验证提示美化效果

前段时间做了个ymPrompt提示效果的验证控件,ymPrompt是弹出提示的。弹出提示会增加无畏的鼠标点击动作。前段时间看到园里有位高手写了个纯cssjs的一个效果,我把它和asp.net验证控件结合起来,用这位高手写的效果做为asp.net难控件的提示效果。…

在Linux内核使用Kasan

昨天的文章发出来后,有同学在群里说内核也可以使用这个工具,所以再转发一篇wowo网站的文章,希望对大家有帮助。Linux 应用调试神器- ASan1. 前言KASAN是一个动态检测内存错误的工具。KASAN可以检测全局变量、栈、堆分配的内存发生越界访问等问…

跟韦老师聊了一个深夜

自从尚明从韦老师那边离职后,我已经很难得到韦老师的消息了,有时候我也想过去看下他,但是也很难抽的开时间。而且,我们两都挺技术的,如果见面后不知道聊什么,会不会有点尴尬。😄上面那个回复是我…

大厂不是铁饭碗

最近的事情有点多前段时间一个以前的朋友,买房找我咨询,问我恒大的房子能不能买,我当时没有给出明确的回复,但是也说了自己的看法。近些年房子越来越贵,我是从15年开始接触房子,不过我从没有想过靠房子来赚…

使用valgrind检测内存问题

valgrind是一款用于内存调试、内存泄漏检测以及性能分析的软件开发工具。1valgrind安装可以到官网下载最新的源码包:valgrind官网下载,也可以直接使用 c_utils/debug/valgrind 目录提供的 valgrind-3.13.0.tar.bz2 源码包。首先解压源码包tar xjf valgri…

项目中cxf和weblogic整合时报错的问题

GJYW项目使用的weblogic版本是10.3.6,cxf使用的版本是3.1.4 在将项目部署到weblogic服务器上时就会报错,通过下面的方式可以解决weblogic和cxf框架在一起报错的问题(解决了本项目报错的问题,未必全部适用):…

下周开幕!给深圳的嵌入式和电子工程师准备的嘉年华来了

我和电子圈老江认识了很久,应该是2012年,小龙第一次参加电子圈年会,那年他年会中奖的奖品送给我。后来,我也加入了电子圈的QQ群,早些年的时候,大家都喜欢在QQ群聊天,后来才慢慢转到微信群。老江…

AS3.0中的显示编程(末篇)-- 滤镜(下)

剩下的三种滤镜,因为我自己也不是很懂矩阵啊这些的,只能做些简单的范例和说明了,抱歉!颜色矩阵滤镜、卷积滤镜、置换图滤镜这三种滤镜只能通过AS代码实现。如果说上面的六种滤镜,只是在原图的基础上做些简单的修改&…

这几个朋友,我记得

‍‍昨天的中秋节是在公司加班度过的,末了,在群里看到有人说要是今天还有人加班的话,那他一定是真正的卷王,好了,我是那个中秋节加班的卷王。早上打车去公司,快到公司楼下的时候,司机师傅跟我说…

HOWTO:如何修改InstallShield的运行环境

版权声明: 可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息。在InstallShield中,存在一些运行环境的变量,如果我们做了某种选择,之后可能将不再提示,说不定什么时候又想改回来呢,找不到地…

深入理解Java线程池:ThreadPoolExecutor

线程池介绍 在web开发中,服务器需要接受并处理请求,所以会为一个请求来分配一个线程来进行处理。如果每次请求都新创建一个线程的话实现起来非常简便,但是存在一个问题: 如果并发的请求数量非常多,但每个线程执行的时间…

看嵌入式大神直播,送开发板!

这是一场嵌入式学习者不可错过的直播……以往拿到一个开发板,还要花费时间找资料,向有经验的朋友请教测试过程现在,在捷客直播间,嵌入式大神现场教学,手把手教你如何使用开发板开发一款智能设备9月26日晚,看…

java实现itchat_GitHub - Xiazki/itchat4j: wechatbot 的java实现,简单搭建了基本框架和实现了扫码登陆,具体网页微信api请参考...

itchat4j 微信自动回复机器人-------------- --------------- ---------------| | | | | || Get UUID | | Get Contact | | Status Notify || | | | | |------------- -------^------- -------^-------| | || ------- --------| | |-------v------ ------------- -------------…

华为宣布:免费培养8000名开发者! 学习免费!实验免费!考证免费!

很多朋友都想储备一些不同领域的新技术以便未来有更好的发展但目前市面上各种教程质量良莠不齐而且想要掌握高阶的开发技术需要耗费大量的时间和精力So,华为云特别推出 互联网技能加油站包含物联网、Python、AI等五大领域,核心技术赋能构建全面技能体系现…