加入收藏 | 设为首页 | 会员中心 | 我要投稿 拼字网 - 核心网 (https://www.hexinwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 教程 > 正文

嵌入式Linux内核启动主要分为这三个阶段

发布时间:2018-10-05 17:23:32 所属栏目:教程 来源:嵌入式ARM
导读:【资讯】嵌入式linux内核的启动全过程主要分为三个阶段。第一阶段为内核自解压过程,第二阶段主要工作是设置ARM处理器工作模式、使能MMU、设置一级页表等,而第三阶段则主要为C代码,包括内核初始化的全部工作,下面是详细介绍。 一、Linux内核自解压过程

  1) 调用setup_arch()函数进行与体系结构相关的第一个初始化工作;对不同的体系结构来说该函数有不同的定义。对于ARM平台而言,该函数定义在 arch/arm/kernel/setup.c。它首先通过检测出来的处理器类型进行处理器内核的初始化,然后 通过bootmem_init()函数根据系统定义的meminfo结构进行内存结构的初始化,最后调用 paging_init()开启MMU,创建内核页表,映射所有的物理内存和IO空间。

  2) 创建异常向量表和初始化中断处理函数;

  3) 初始化系统核心进程调度器和时钟中断处理机制;

  4) 初始化串口控制台(console_init);

  ARM-Linux 在初始化过程中一般都会初始化一个串口做为内核的控制台,而串口Uart驱动却把串口设备名写死了,如本例中linux2.6.37串口设备名为ttyO0,而不是常用的ttyS0。有了控制台内核在启动过程中就可以通过串口输出信息以便开发者或用户了解系统的启动进程。

  5) 创建和初始化系统cache,为各种内存调用机制提供缓存,包括;动态内存分配,虚拟文件系统(VirtualFile System)及页缓存。

  6) 初始化内存管理,检测内存大小及被内核占用的内存情况;

  7) 初始化系统的进程间通信机制(IPC); 当以上所有的初始化工作结束后,start_kernel()函数会调用rest_init()函数来进行最后的初始化,包括创建系统的第一个进程-init进程来结束内核的启动。

  挂载根文件系统并启动init

  Linux内核启动的下一过程是启动第一个进程init,但必须以根文件系统为载体,所以在启动init之前,还要挂载根文件系统。

  四、挂载根文件系统

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

  /etc/:存储重要的配置文件。

  /bin/:存储常用且开机时必须用到的执行文件。

  /sbin/:存储着开机过程中所需的系统执行文件。

  /lib/:存储/bin/及/sbin/的执行文件所需的链接库,以及Linux的内核模块。

  /dev/:存储设备文件。

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

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

  挂载根文件系统的而目的有两个:一是安装适当的内核模块,以便驱动某些硬件设备或启用某些功能;二是启动存储于文件系统中的init服务,以便让init服务接手后续的启动工作。

  执行init服务

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

  1)/sbin/是否有init服务

  2)/etc/是否有init服务

  3)/bin/是否有init服务

  4)如果都找不到最后执行/bin/sh

  找到init服务后,Linux会让init服务负责后续初始化系统使用环境的工作,init启动后,就代表系统已经顺利地启动了linux内核。启动init服务时,init服务会读取/etc/inittab文件,根据/etc/inittab中的设置数据进行初始化系统环境的工作。/etc/inittab定义init服务在linux启动过程中必须依序执行以下几个Script:

  /etc/rc.d/rc.sysinit /etc/rc.d/rc /etc/rc.d/rc.local

  /etc/rc.d/rc.sysinit主要的功能是设置系统的基本环境,当init服务执行rc.sysinit时 要依次完成下面一系列工作:

  (1)启动udev

  (2)设置内核参数

  执行sysctl –p,以便从/etc/sysctl.conf设置内核参数

  (3)设置系统时间

  将硬件时间设置为系统时间

  (4)启用交换内存空间

  执行swpaon –a –e,以便根据/etc/fstab的设置启用所有的交换内存空间。

  (5)检查并挂载所有文件系统

  检查所有需要挂载的文件系统,以确保这些文件系统的完整性。检查完毕后以可读可写的方式挂载文件系统。

  (6)初始化硬件设备

  Linux除了在启动内核时以静态驱动程序驱动部分的硬件外,在执行rc.sysinit时,也会试着驱动剩余的硬件设备。rc.sysinit驱动的硬件设备包含以下几项:

  a)定义在/etc/modprobe.conf的模块

  b)ISA PnP的硬件设备

  c)USB设备

  (7)初始化串行端口设备

  Init服务会管理所有的串行端口设备,比如调制解调器、不断电系统、串行端口控制台等。Init服务则通过rc.sysinit来初始化linux的串行端口设备。当rc.sysinit发现linux才能在这/etc/rc.serial时,才会执行/etc/rc.serial,借以初始化所有的串行端口设备。因此,你可以在/etc/rc.serial中定义如何初始化linux所有的串行端口设备。

  (8)清除过期的锁定文件与IPC文件

  (9)建立用户接口

  在执行完3个主要的RC Script后,init服务的最后一个工作,就是建立linux的用户界面,好让用户可以使用linux。此时init服务会执行以下两项工作

  (10)建立虚拟控制台

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

  嵌入式Linux内核启动主要分为这三个阶段

  图4:linux内核启动及文件系统加载全过程

(编辑:拼字网 - 核心网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!