Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Android启动流程——1序言、bootloader引导与Linux启动

Android启动流程——1序言、bootloader引导与Linux启动

作者头像
隔壁老李头
发布于 2018-08-30 08:34:34
发布于 2018-08-30 08:34:34
5.4K00
代码可运行
举报
文章被收录于专栏:Android 研究Android 研究
运行总次数:0
代码可运行

前面讲解的很多内容都很抽象,所以本次系列决定"接点地气",准备开始讲解大家熟悉的Activity了,为了让我以及大家更好的理解Activity,我决定本系列的课程主要分为4大流程和2大模块。

4大流程如下:

  • 1、bootloaderLinux启动
  • 2、init进程
  • 3、zygote进程
  • 4、systemServer启动

在某个流程内部我又会分为

  • 1、理论知识:比如这个类的作用,他的父类是什么,设立理论部分的主要目的是让我们更好地理解它的设计思想
  • 2、方法跟踪:从方法这个级别一级一级的跟踪,追踪溯源,看到谷歌团队到底是如何设计的。

Android系统的启动,主要是指Android手机关机后,长按电源键后,Android手机开机的过程。从系统角度看,Android的启动程序可分为:

  • 1、bootloader引导
  • 2、装载与启动Linux内核
  • 3、启动Android系统
    • 3.1、启动Init进程
    • 3.1、启动Zygote
    • 3.1、启动SystemService
    • 3.1、启动Launcher

整体流程大致如下:

启动.png

本片文章的内容如下:

  • 1、Bootloader启动
  • 2、Linux系统启动

一、Bootloader启动

(一) 概述

开机,开机就是给系统开始供电,此时硬件电路会产生一个确定的复位时序,保证CPU是最后一个被复位的器件,为什么CPU要最后被复位呢?因为,如果CPU第一个被复位,则当CPU复位后开始运行时,其他硬件内部的寄存器状态可能还没有准备好,比如磁盘或者内存,那么久可能出现外围硬件初始化错误。当正确完成复位后,CPU开始执行第一条指令,该指令所在的内存你地址是固定的,这由CPU的制造者指定。不同的CPU可能会从不同的地址获取指令,但这个地址必须是固定的,这个固定地址所保存的程序往往被称为"引导程序(BootLoader)",因为其作用是装载真正的用户程序。

至于如何装载,则是一个策略问题,不同的CPU会提供不同的装载方式,比如有的是通过普通的并口存储器,有的则通过SD卡,还有的还是通过RS232接口。无论硬件上使用何种接口装载,装载过程必须提供以下信息,具体包括:

  • 1 从哪里读取用户程序
  • 2 用户程序的长度是什么
  • 3 装载完用户程序后,应该跳转到哪里,即用户程序的执行入口在哪里?

不同硬件系统会采用不同的策略,但只要以上三个信息是确定的,用户程序就会被装载到确定的地址,并执行相同的操作。

(二)、Bootloader的定义和种类

简单地说,BootLoader是在操作系统运行之前运行的一段程序,它可以将系统的软硬件环境带到一个合适的状态,为运行操作系统做好准备,这样描述是比较抽象的,但是它的任务确实不多,终极目标就是把操作系统拉起来运行。

嵌入式系统世界里存在各种各样的BootLoader,种类划分也有多种方式。除了按照处理器体系结构不同划分以外,还有功能复杂程度的不同。 先来区分一下Bootloader和Monitor:

  • Bootloader只是引导操作系统运行起来的代码
  • Monitor另外还提供很多命令接口,可以进行调试、读写内存、配置环境变量等。 在开始过程中Monitor提供了很好的调试功能,不过在开始结束之后,可以将其设置成一个Bootloader。所以习惯上将其叫做Bootloader。

Bootloader

Monitor?

描述

X86

ARM

PowerPC

U-boot

通用引导程序

ReBoot

是基于eCos的引导程序

BLOB

(StrongARM架构) LART(主板)等硬件平台的引导程序

LILO

Linux磁盘引导程序

GRUB

GNU的LILO替代程序

Loadlin

从DOS引导Linux

Vivi

韩国mizi公司开发的bootloader

更过的bootloader还有:ROLO、Etherboot、ARMboot、LinuxBIOS等。对于每种体系结构,都有一些列开放源码Bootloader可以选用:

  • x86:x86的工作站和服务器上一般使用LILO和GRUB
  • ARM:最早由为ARM720处理器开发板所做的固件,又有armboot,StrongARM平台的blob,还有S3C2410处理器开发板上的vivi等。现在armboot已并入U-Boot,所以U-Boot也支持ARM/XSALE平台。U-Boot已经成为ARM平台事实上的标准Bootloader
  • PowerPC:最早使用于ppcboot,不过现在大多数直接使用U-boot。
  • MIPS:最早都是MIPS开发商自己写的bootloader,不过现在U-boot也支持MIPS架构。
  • M68K:Redboot能够支持m68k系列的系统。

(三)、ARM

因为目前Android系统多运行在ARM处理器上,因此,下面主要分析运行于ARM处理器上的启动过程。在介绍之前,我先抛砖引玉,大家想一下,怎么分区:ARM、处理器、CPU?

OK,我们一起来看下

  • ARM本身是一个公司的名称,从技术的角度来看,它又是一种微处理器内核的架构。
  • 处理器一种统称,可以指具体的CPU芯片,比如intel i7处理器,苹果的A11处理器等。处理器内部一般包含CPU、片上内存、片上外设接口等不同的硬件逻辑。 CPU是处理器内部的中央处理单元的缩写,CPU可以按照类型分为短指令集架构和长指令集架构两大类,ARM属于短指令集架构的一种

(四)、ARM特定平台的BootLoader

对于ARM处理器,当复位完毕后,处理器首先执行其片上ROM中的一小块程序。这块ROM的大小一般只有几KB,该段程序就是Bootloader程序,这段程序执行时会根据处理器上一些特定的引脚的高低电平状态,选择从何种物理接口上装载用户程序,比如UBS接口、串口、SD卡、并口Flash等。

多数基于ARM的实际硬件系统,会从并口NAND Flash 芯片中的 0x00000000地址处装载程序。对于一些小型嵌入式系统而言,该地址中的程序就是最终要执行的用户程序;对于Android而言,该地址中的程序还不是Android程序,而是一个叫做uboot或者fastboot的程序,其作用就是初始化硬件设备,比如网口、SDRAM、RS232等,并提供一些调试功能,比如像NAND Flash写入新的数据,这可用于开发过程中的内核烧写、等级等。

PS:

当uboot(fastboot)被装载后便开始运行,它一般会先检测用户是否按下某些特别按键,这些特别按键是uboot在编译时预先被约定好的,用于进入调试模式。如果用户没有按这些特别的按键,则uboot会从NAND Flash中装载Linux内核,装载的地址是在编译uboot时预先约定好的。

我们看下上电之后到U-boot的流程

上电流程.png

(三)、U-boot启动流程分析

最常用的bootloader还是U-boot,可以引导多种操作系统,支持多种架构的CPU。它支持的操作系统有:Linux、NetBSD、LynxOS等,支持的CPU架构有:ARM、PowerPC、MISP、X86、NIOS等。

手机系统不像其他的嵌入式系统,它还需要在启动的过程中关心CP的启动,这个时候就涉及到CP的image和唤醒时刻,而一般的嵌入式系统的uboot只负责引导OS内核。所以这里我们也暂不关心CP的启动,而主要关心AP。

而U-boot的启动过程大致上可以分为两个阶段:

  • 第一阶段:汇编代码 U-boot的第一条指令从cpu/armXXX/start.S文件开始
  • 第二阶段:C代码 从文件/lib_arm/board.c的start_armboot()函数开始。

关于这块详细资料,我也不是很熟悉,就不误人子弟了,大家可以自行查询

相关资料如下:

bootloader

二、Linux系统启动

Linux系统的启动过程由很多阶段组成,但是无论你是启动标准的x86桌面,还是启动嵌入式PowerPC目标,许多流程都是惊人的相似。从初始化引导到第一个用户空间来研究Linux启动进程。关于Linux系统启动主要分为三个阶段,第一个阶段是自解压过程,第二个是设置ARM处理器的工作模式、设置一级页表等,第三个阶段主要是C代码,包括Android的初始化的全部工作。

(一) 自解压过程

内核压缩和解压缩代码都在目录kernel/arch/boot/compressed,编译完成后将产生head.o、misc.o、piggy.gzip.o、vmlinux、decompress.o这几个文件。

  • head.o:是内核的头部文件,负责初始设置
  • misc.o:将主要负责内核的解压工作,它在head.o之后
  • piggy.gzip.o:是一个中间文件,其实是一个压缩的内核(kernel/vmlinux),只不过没有和初始化文件及解压缩文件链接而已;
  • vmlinux:是没有(zImage是压缩过的内核)压缩过的内核,就是由piggy.gzip.o、head.o、misc.o组成的
  • decompress.o是未支持更多的压缩格式而新引入的。

BootLoader完成系统的引导以后并将Linux内核调入内核之后,调用do_bootm_linux(),这个函数将跳转到kernel的其实位置。如果kernel没有被压缩,就可以启动了。如果kernel被压缩过,就要进行压缩了,在压缩过的kernel头部有解压缩程序。压缩过的kernel入口第一个文件源位置正在arch/arm/boot/compressed/head.S。它将调用函数decompress_kernel()函数,这个函数在文件的arch/arm/boot/compressed/misc.c中,decompress_kernel()又调用proc_decomp_setup(),arch_decomp_setup()进行设置,然后打印gunzip()将内核放于指定的位置。

下面简单介绍一下解压缩的过程,也就是函数decompress_kernel的实现功能:解压缩的代码位置与kernel/lib/inflate.c,inflate.c是从gzip源程序中分离出来的,包含一些对全局数据的直接引用,在使用时需要直接嵌入到代码中。gzip压缩文件时总是在前32K字节的解压缩缓冲区,它定义为windowWSIZE。inflate.c使用get_byte()读取输入文件,它被定义成 宏 来提高效率。输入缓冲区指针必须定位inptr,inflate.c中对之有减量操作。inflate.c调用flush_window()来输出window缓冲区的解压出的字节串,每次输出长度用outcnt变量表示。在flushwindow()中,还必须对输出字节串计算CRC并且刷新crc变量。在调用gunzip()开始解压之前,调用makecrc()初始化CRC计算表。最后gunzip()返回0表示解压成功。

(二) Linux初始化

Linux初始化又分为三个阶段

第一阶段

本阶段就是上面说的到的内核解压缩完成后的阶段。

该部分的代码实现在arch/arm/kernel的 head.S中,该文件的汇编代码通过查找处理内和类型的机器码类型调用相应的初始化函数,再建立页表,最后跳转到start_kernel()函数开始内核的初始化工作。检查处理器是汇编子函数__lookup_processor_type中完成的,通过以下代码可实现对它的调用:bl__lookup_processor_type(在文件head-commom.S实现)。__lookup_processor_type调用结束返回原程序时,会将返回结果保存到寄存器中。其中r5寄存器返回一个描述处理器的结构体地址,并对r5进行判断,如果r5的值为0说明不支持这种处理器,将进入_error_p。r8保存了页表的标志位,r9保存了处理器的ID号,r10保存了与处理相关的struct proc_info_list。Head.S核心代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ENTRY(stext)
setmode PSR_F_BIT | PSR_I_BIT | SVC_MODE, r9 @设置SVC模式关中断
      mrc p15, 0, r9, c0, c0        @ 获得处理器ID,存入r9寄存器
      bl    __lookup_processor_type        @ 返回值r5=procinfo r9=cpuid
      movs      r10, r5                       
 THUMB( it eq )        @ force fixup-able long branch encoding
      beq __error_p                   @如果返回值r5=0,则不支持当前处理器'
      bl    __lookup_machine_type         @ 调用函数,返回值r5=machinfo
      movs      r8, r5            @ 如果返回值r5=0,则不支持当前机器(开发板)
THUMB( it   eq )             @ force fixup-able long branch encoding
      beq __error_a                   @ 机器码不匹配,转__error_a并打印错误信息
      bl    __vet_atags
#ifdef CONFIG_SMP_ON_UP    @ 如果是多核处理器进行相应设置
      bl    __fixup_smp
#endif
      bl    __create_page_tables  @最后开始创建页表

检查机器码类型是汇编函数__lookup_machine_type中完成,与__lookup_processor_type类似,通过代码“__lookup_machine_type”来实现对它的调用。该函数返回时,会将返回结构保存在r5、r6和r7三个寄存器中,其中r5寄存器返回一个用来描述机器的机构体地址,并对r5进行判断,如果r5为0,则说明不支持这种机器,将进入__error_a。r6保存了I/O的页表偏移地址。当检测处理器类型和机器码类型结束后,将调用__create_page_tables子函数来建立页表,它所要做的工作就是将RAM地址开始的1M空间物理地址映射到0xC0000000开始的虚拟地址处。对本项目的开发板DM3730而言,RAM挂接到物理地址0x80000000处,当调用__create_page_tables结束后0x80000000 ~ 0x80100000物理地址将映射到0xC0000000~0xC0100000虚拟地址处。当所有的初始化结束之后,使用如下代码来跳到C程序的入口函数start_kernel()处,开始之后的内核初始化共工作

第二阶段

从start_kernel函数开始

Linux内核启动的第一个阶段是从start_kernel函数开始的。start_kernel是所有Linux平台进入系统内核初始化后的入口函数,它主要完成剩余与硬件平台的相关初始化工作,在进行一些系列的与内核相关的初始后,调用第一个用户进程——init进程并等待用户进程的执行,这样整个Linux内核便启动完毕。该函数位于init/main.c文件中。

如下图

main.c.png

这个函数内部的具体工作如下:

  • 调用setup_arch()函数进行与体系结构相关的第一个初始化工作;对于不同的体系结构来说该函数有不同的定义。对于ARM平台而言,该函数定义在arch/arm/kernel/setup.c。它首先通过检测出来的处理器类型进行处理其内核的初始化,然后通过bootmem_init()函数根据系统定义的meminfo结构进行内存结构的初始化,最后调用 paging_init()开启MMU,创建内核页表,映射所有的物理内存和IO空间。
  • 创建异常向量表和初始化中断处理函数
  • 初始化系统核心进程调度器和时钟中断处理机制
  • 初始化串口控制台
  • 创建初始化系统cache,为各种内存调用机制提供缓存,包括动态内存分配,虚拟文件系统(VirtuaFile System)及页缓存。
  • 初始化内存管理,检测内存大小及被内核占用的内存情况。
  • 初始化系统的进程间通信机制(IPC);当以上所有的初始化工作结束后,start_kernel()函数会调用rest_init()函数来进行最后的初始化,包括创建系统的第一个进程——init进程来结束内核的启动

Linux内核启动的最后一个阶段就是挂载根文件系统,因为启动第一个init进程,必须以根文件系统为载体。

第三阶段

根文件系统至少包括以下目录:

  • /etc/:存储重要的配置文件
  • /bin/:存储常用且开机时必须用到的执行文件。
  • /sbin/:存储着开机过程中所需的系统执行文件。
  • /lib/:存储/bin/及/sbin/的执行文件所需要的链接库,以及Linux的内核模块
  • /dev/:存储设备文件

上面五大目录必须存储在跟文件系统上,缺一不可。

1、为什么以只读的方式

以只读的方式挂载根文件系统,之所以采用只读的方式挂载根文件系统是因为:此时Linux内核仍在启动阶段,还不是很稳定,如果采用可读可写的方式挂载跟文件系统,万一Linux不小心宕机了,一来可能破坏根文件系统上的数据,再者Linux下次开机时得花上很长时间来检查并修复根文件系统。

2、挂载根文件系统的目的:

有两个:

  • 安装适当的内核模块,以便驱动某些硬件设备或启动某些功能
  • 启动存储于文件系统中的init服务,以便让init服务接手后续的启动工作。
3、执行init服务的顺序:

Linxu内核启动的最后一个动作,就是从根文件系统上找出并执行init服务。Linux内核会依照下列的顺序寻找init服务:

  • 第一步检查 /sbin/是否有init服务
  • 第二步检查/etc/是否有init服务
  • 第三步检查/bin/是否有init服务
  • 如果都找不到你最后执行/bin/sh

找到init服务后,Linux会让init服务负责后续初始化系统使用环境的工作,init启动后,就代表系统已经顺利地启动了Linux内核。启动init服务时,init服务会读取/etc/inittab文件,根据/etc/inittab中的设置数据进行初始化系统环境工作。

4、/etc/inittab:

/ect/inittabl定义init服务在Linux启动过程中必须执行以下几个脚本:

  • /etc/rc.d/rc.sysinit 主要功能是设置系统的基本环境,当init服务执行rc.sysinit时,要依次完成下面一系列工作:
    • 启动udev
    • 设置内核参数:执行sysctl -p,以便从/etc/sysctl.conf设置内核参数
    • 设置系统时间:将硬件时间设置为系统时间
    • 启动交换内存空间:执行swpaon -a -e,以便根据、etc/fstab的设置启动所有的交互内存空间。
    • 检查并挂载所有文件系统:检查所有需要挂载的文件系统,以确保这些文件系统的完整性。检查完毕后可读可写的方式挂载文件系统。
    • 初始化硬件设备:Linux除了在启动内核时以静态驱动部分的硬件外,在执行rc.sysinit时,也会试着驱动剩余的硬件设备。
    • 初始化串行端口设备:Init服务会管理所有的串行端口设备,比如调制解调器、不断电系统、串行端口控制台等。Init服务则通过rc.sysinit来初始化Linux串行端口设备。当rc.sysinit发现Linux才能在这/etc/rc.serial时,才会执行/etc/rc.serial,借以初始化所有的串行端口设备。因此,你可以在/etc/rc.serial中定义如何初始化Linux所有的串行端口设备。
    • 清除过程的锁定文件与IPC文件
    • 建立用户接口
    • 建立虚拟控制台
  • /etc/rc.d/rc
  • /etc/rc.d/rc.local

这里简单说一下建立虚拟控制台

init会在若干个虚拟控制台中执行/bin/login,以便用户可以从虚拟控制台登录Linux。Linux默认在前6个虚拟控制台,也就tty1~tty6,执行/bin/login登录程序。当所有的初始化工作结束后,cpu-idle()函数会被调用来使用系统处于闲置(idle)状态并等待用户程序的执行。至此,整个Linux内核启动完毕

最后赠送一个整体的启动流程图

image.png

下一篇文章Android系统启动——2 init进程

官人飞吻,你都把臣妾从头看到尾了,喜欢就点个赞呗(眉眼)!!!!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018.03.04 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
超详细分析Bootloader(Uboot)到内核的启动流程(万字长文!)
  Bootloader的启动过程可以分为单阶段、多阶段两种。通常多阶段的 Bootloader能提供更为复杂的功能以及更好的可移植性。从固态存储设备上启动的 Bootloader大多都是两阶段的启动过程。第一阶段使用汇编来实现,它完成一些依赖于CPU体系结构的初始化,并调用第二阶段的代码;第二阶段则通常使用C语言来实现,这样可以实现更复杂的功能,而且代码会有更好的可读性和可移植性。   一般而言,这两个阶段完成的功能可以如下分类:
嵌入式与Linux那些事
2021/05/20
13.5K0
超详细分析Bootloader(Uboot)到内核的启动流程(万字长文!)
Linux启动流程
启动第一步--加载BIOS  当你打开计算机电源,计算机会首先加载BIOS信息,BIOS信息是如此的重要,以至于计算机必须在最开始就找到它。这是因为BIOS中包含了CPU的相关信息、设备启动顺序信息、硬盘信息、内存信息、时钟信息、PnP特性等等。在此之后,计算机心里就有谱了,知道应该去读取哪个硬件设备了。 启动第二步--读取MBR 众所周知,硬盘上第0磁道第一个扇区被称为MBR,也就是Master Boot Record,即主引导记录,它的大小是512字节,别看地方不大,可里面却存放了预启动信息、分区表信息
233333
2018/03/07
8.9K0
嵌入式Linux系统移植的四大步骤(详细长文,慎入!)
最近在学习系统移植的相关知识,在学习和调试过程中,发现了很多问题,也解决了很多问题,但总是对于我们的开发结果有一种莫名其妙的感觉,纠其原因,主要对于我们的开发环境没有一个深刻的认识,有时候几个简单的命令就可以完成非常复杂的功能,可是我们有没有想过,为什么会有这样的效果?如果没有去追问,只是机械地完成,并且看到实验效果,这样做其实并没有真正的掌握系统移植的本质。
刘盼
2021/02/12
7.7K0
嵌入式Linux系统移植的四大步骤(详细长文,慎入!)
赶紧收藏!u-boot代码分析与移植
BootLoader的目标是正确调用内核的执行,由于大部分的BootLoader都依赖于CPU的体系结构。因此大部分的BootLoader都分为两个步骤启动。依赖于CPU体系结构(如设备初始化等)的代码都放在stage1。而stage2一般使用C语言实现,能够实现更加复杂的功能,代码的可移植性也提高。
混说Linux
2022/07/14
7940
赶紧收藏!u-boot代码分析与移植
一.linux开发之uboot移植(一)——初识uboot
参考博文: http://blog.51cto.com/9291927/1791237
全栈程序员站长
2022/09/14
2K0
一.linux开发之uboot移植(一)——初识uboot
系统启动流程-armV7
芯片复位后,将在异常向量表中复位向量的位置开始执行。复位操作的代码必须做以下事情:
哆哆jarvis
2022/08/23
1.1K0
系统启动流程-armV7
06.内核启动流程分析之内核启动
内核最终目的:运行根文件系统的应用程序 内核做的事情: 处理uboot传入的参数 arch\arm\kernel /*启动内核:bi_arch_number机器ID。参数存放的地址 bd->bi_boot_params*/ theKernel (0, bd->bi_arch_number, bd->bi_boot_params); 判断是否支持单板(根据启动内核时传入的机器ID) /**/ ENTRY(stext) msr cpsr_c, #PSR_F_BIT | PSR_I_BIT | SVC_MOD
嵌入式与Linux那些事
2021/05/20
9080
Linux 启动时间优化实战,2.41 秒启动应用!
劳动节,更个文吧,祝大家都劳有所获。 今天看了一个关于启动优化的讲座,简单总结一下。 本文的目标是尝试一些比较简单有效的方法,并不会覆盖所有的优化技巧。感兴趣的伙伴可以关注我视频号,后面准备用直播的方式和大家交流。 目标系统 硬件: Beagle Bone Black (Cortex A8) USB 摄像头 + LCD 软件: Linux 5.1 + Buildroot rootfs FFmpeg,用于采集视频并解码到 LCD。 点击查看大图 当前启动时间: 从上电到 LCD 显示第一帧图像:9.4
刘盼
2022/05/05
3.6K0
Linux 启动时间优化实战,2.41 秒启动应用!
嵌入式Linux OS启动流程,了解一下!
作用: 确定用于启动的设备; 从启动的设备的位置搬移一小段代码(4k/8k/16k)到RAM中运行,即SPL;
刘盼
2020/03/18
2.1K0
嵌入式Linux OS启动流程,了解一下!
【深度解析】Linux系统启动流程
Linux系统启动流程大概总结下来是这么一个过程: POST-->BootLoader(MBR)-->Kernel(硬件探测、加载驱动、挂载根文件系统、/sbin/init)-->init(/etc/inittab:设定默认级别、系统初始化脚本、启动及关闭对应级别的服务、启动终端) 详细分析上面的流程 第1步: 1.POST 打开电源按钮,CPU会把位于CMOS中的BIOS程序加载到内存里面执行,BIOS会探测并识别主板上的所有硬件,然后按照BIOS程序里面设定的启动顺序(1.光驱 2.硬盘 3.软驱 等)
小小科
2018/05/03
2.3K0
解析 Linux 操作系统启动流程(CentOS 6)
加电自检(power-on-self-test)用来检查各硬件是否正常工作,如 cpu、内存、显卡、硬盘、键盘等。加电自检的过程是通过主板上的 ROM 芯片(CMOS)所定义的程序来实现的,CMOS 可以做一些设定,是通过基本输入输出系统(BIOS)实现的,如选择计算机由哪块设备进行引导。
懒人的小脑
2019/01/22
1.5K0
解析 Linux 操作系统启动流程(CentOS 6)
linux系统移植的一般过程_内核移植的基本步骤
在众多嵌入式操作系统中,Linux目前发展最快、应用最为广泛。性能优良、源码开放的Linux具有体积小、内核可裁减、网络功能完善、可移植性强等诸多优点,非常适合作为嵌入式操作系统。一个最基本的Linux操作系统应该包括:引导程序、内核与根文件系统三部分。
全栈程序员站长
2022/11/08
8K0
linux系统移植的一般过程_内核移植的基本步骤
新人怎样学习嵌入式Linux?
作为一个新人,怎样学习嵌入式Linux?被问过太多次,特写这篇文章来回答一下。 在学习嵌入式Linux之前,肯定要有C语言基础。汇编基础有没有无所谓(就那么几条汇编指令,用到了一看就会)。C语言要学到什么程度呢?越熟当然越好,不熟的话也要具备基本技能。比如写一个数组排序、输入数字求和什么的。学C语言唯一的方法是多写程序多练习,编译出错没关系,自己去解决;执行出错没关系,自己去分析。以前我是用VC来练习C语言的,经常去尝试着写一些C语言竞赛的题目。它们是纯C、纯数学、纯逻辑的题目,不涉及界面这些东西,很适合煅炼你的编程能力。 回到主题,首先我们要明白你的目的是什么,大概来说所谓嵌入式Linux可以分为两部分:底层系统、应用开发。如果你是想做应用开发,那么你去把C语言、数据结构、JAVA什么的学好吧。嵌入式应用开发和PC上的应用开发并没有什么特别要注意的。也许你说在嵌入式上要做些优化,是的,要优化,但是未经优化的程序和PC上的程序开发没什么差别。另外,当你有能力去优化时,你已经不用来问这个问题了。具体到某个例子,比如说开发界面,在PC上我们用VC;在嵌入式Linux里也许我们用QT也许用Android,这个时候你应该去学学QT、Android的编程。但是基础还是C或JAVA,在此基础上去熟悉它们的接口。你学过VC的话,也是要花时间去了解那些类、控件的。
韦东山
2020/09/30
5.4K0
【嵌入式开发】 Bootloader 详解 ( 代码环境 | ARM 启动流程 | uboot 工作流程 | 架构设计)
博客地址 : http://blog.csdn.net/shulianghan/article/details/42462795
韩曙亮
2023/03/27
4.6K0
【嵌入式开发】 Bootloader 详解 ( 代码环境 | ARM 启动流程 | uboot 工作流程 | 架构设计)
手把手教你分析 Linux 启动流程
最新 Linux 内核是 5.15 版本。现在常用 Linux 内核源码为4.14、4.19、4.9 等版本,其中 4.14 版本源码压缩包大概 90+M,解压后 700+M,合计 61350 个文件。如此众多的文件,用 source insight 或者 VSCode 查看都会比较卡,所以可以采用在线查看的方式。
Jasonangel
2021/10/12
1K0
第3阶段——内核启动分析之创建si工程和分析stext启动内核函数(4)
目标: (1)创建Source Insight 工程,方便后面分析如何启动内核的 (2)分析uboot传递参数,链接脚本如何进入stext的  (3) 分析stext函数如何启动内核:  (3.1
诺谦
2018/01/03
1K0
第3阶段——内核启动分析之创建si工程和分析stext启动内核函数(4)
Linux 的启动流程
本篇的重点是讲解设备和驱动的启动流程,设备和驱动的流程是整个内核启动的核心,也是工作中最常面对的问题。出于知识点的系统性考虑,在进入主题之前我们先看下整个 Linux 在 ARM 中的启动流程如何。
刘盼
2018/07/26
2.8K0
Linux 的启动流程
Linux启动流程 梳理| 思维导图 | 流程图 | 值得收藏
嵌入式与Linux那些事
2024/06/11
3540
Linux启动流程 梳理| 思维导图 | 流程图  | 值得收藏
Linux启动流程与模块管理
系统的启动其实是一项非常复杂的过程,因为内核得要检测硬件并加载适当的驱动程序,接下来则必须要调用程序来准备好系统运行的环境,以让用户能够顺利的操作整台主机系统,如果你能够理解系统启动的原理,那么将有助于你在系统出问题时能够很快速的修复系统,而且还能够顺利的配置多重操作系统的多重启动问题,为了多重启动的问题,你就不能不学 grub 这个 Linux 下优秀的启动管理程序(boot loader),而在系统运行期间,你也得要学会管理内核模块,下面进入正题开始学习吧.
王瑞MVP
2022/12/28
1.4K0
Linux学习笔记之Linux启动引导过程
早期时,启动一台计算机意味着要给计算机喂一条包含引导程序的纸带,或者手工使用前端面板地址/数据/控制开关来加载引导程序。尽管目前的计算机已经装备了很多工具来简化引导过程,但是这一切并没有对整个过程进行必要的简化。
Jetpropelledsnake21
2019/02/15
10.7K1
相关推荐
超详细分析Bootloader(Uboot)到内核的启动流程(万字长文!)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验