Linux内核在arm上的启动过程

简介: 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访存原理

20210424223447968.png

ARM的MMU页表格式


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


  • 节:1MB的存储器块
  • 大页:64KB的存储器块
  • 小页:4KB的存储器块
  • 微页:1KB的存储器块


页表的级别


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


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


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


一级页表的地址


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


20210424223612515.png

第一级描述符


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


20210424223623462.png

节描述符


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 位


节的转换过程



2021042422370656.png

临时内核页表的创建 __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

映射表内容


20210424223805883.png


映射结果


20210424223818218.png


进入C代码


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


  • printk函数
  • 重新初始化页表
  • 初始化中断,trap_init
  • 设置系统定时器、控制台…
  • 创建内核进程init
相关文章
|
1月前
|
安全 Linux 测试技术
Intel Linux 内核测试套件-LKVS介绍 | 龙蜥大讲堂104期
《Intel Linux内核测试套件-LKVS介绍》(龙蜥大讲堂104期)主要介绍了LKVS的定义、使用方法、测试范围、典型案例及其优势。LKVS是轻量级、低耦合且高代码覆盖率的测试工具,涵盖20多个硬件和内核属性,已开源并集成到多个社区CICD系统中。课程详细讲解了如何使用LKVS进行CPU、电源管理和安全特性(如TDX、CET)的测试,并展示了其在实际应用中的价值。
|
1月前
|
Ubuntu Linux 开发者
Ubuntu20.04搭建嵌入式linux网络加载内核、设备树和根文件系统
使用上述U-Boot命令配置并启动嵌入式设备。如果配置正确,设备将通过TFTP加载内核和设备树,并通过NFS挂载根文件系统。
95 15
|
2月前
|
算法 Linux
深入探索Linux内核的内存管理机制
本文旨在为读者提供对Linux操作系统内核中内存管理机制的深入理解。通过探讨Linux内核如何高效地分配、回收和优化内存资源,我们揭示了这一复杂系统背后的原理及其对系统性能的影响。不同于常规的摘要,本文将直接进入主题,不包含背景信息或研究目的等标准部分,而是专注于技术细节和实际操作。
|
2月前
|
搜索推荐 Linux
深入理解Linux操作系统的启动过程
本文旨在揭示Linux操作系统从开机到完全启动的神秘面纱,通过逐步解析BIOS、引导加载程序、内核初始化等关键步骤,帮助读者建立对Linux启动流程的清晰认识。我们将探讨如何自定义和优化这一过程,以实现更高效、更稳定的系统运行。
|
2月前
|
存储 缓存 网络协议
Linux操作系统的内核优化与性能调优####
本文深入探讨了Linux操作系统内核的优化策略与性能调优方法,旨在为系统管理员和高级用户提供一套实用的指南。通过分析内核参数调整、文件系统选择、内存管理及网络配置等关键方面,本文揭示了如何有效提升Linux系统的稳定性和运行效率。不同于常规摘要仅概述内容的做法,本摘要直接指出文章的核心价值——提供具体可行的优化措施,助力读者实现系统性能的飞跃。 ####
|
2月前
|
监控 算法 Linux
Linux内核锁机制深度剖析与实践优化####
本文作为一篇技术性文章,深入探讨了Linux操作系统内核中锁机制的工作原理、类型及其在并发控制中的应用,旨在为开发者提供关于如何有效利用这些工具来提升系统性能和稳定性的见解。不同于常规摘要的概述性质,本文将直接通过具体案例分析,展示在不同场景下选择合适的锁策略对于解决竞争条件、死锁问题的重要性,以及如何根据实际需求调整锁的粒度以达到最佳效果,为读者呈现一份实用性强的实践指南。 ####
|
2月前
|
缓存 监控 网络协议
Linux操作系统的内核优化与实践####
本文旨在探讨Linux操作系统内核的优化策略与实际应用案例,深入分析内核参数调优、编译选项配置及实时性能监控的方法。通过具体实例讲解如何根据不同应用场景调整内核设置,以提升系统性能和稳定性,为系统管理员和技术爱好者提供实用的优化指南。 ####
|
2月前
|
负载均衡 算法 Linux
深入探索Linux内核调度机制:公平与效率的平衡####
本文旨在剖析Linux操作系统内核中的进程调度机制,特别是其如何通过CFS(完全公平调度器)算法实现多任务环境下资源分配的公平性与系统响应速度之间的微妙平衡。不同于传统摘要的概览性质,本文摘要将直接聚焦于CFS的核心原理、设计目标及面临的挑战,为读者揭开Linux高效调度的秘密。 ####
55 3
|
3月前
|
负载均衡 算法 Linux
深入探索Linux内核调度器:公平与效率的平衡####
本文通过剖析Linux内核调度器的工作机制,揭示了其在多任务处理环境中如何实现时间片轮转、优先级调整及完全公平调度算法(CFS),以达到既公平又高效地分配CPU资源的目标。通过对比FIFO和RR等传统调度策略,本文展示了Linux调度器如何在复杂的计算场景下优化性能,为系统设计师和开发者提供了宝贵的设计思路。 ####
59 6
|
2月前
|
消息中间件 安全 Linux
深入探索Linux操作系统的内核机制
本文旨在为读者提供一个关于Linux操作系统内核机制的全面解析。通过探讨Linux内核的设计哲学、核心组件、以及其如何高效地管理硬件资源和系统操作,本文揭示了Linux之所以成为众多开发者和组织首选操作系统的原因。不同于常规摘要,此处我们不涉及具体代码或技术细节,而是从宏观的角度审视Linux内核的架构和功能,为对Linux感兴趣的读者提供一个高层次的理解框架。