arm linux 启动流程

发布者:Qilin520最新更新时间:2016-06-16 来源: eefocus关键字:arm  linux  启动流程 手机看文章 扫描二维码
随时随地手机看文章

本文探讨Linux操作系统接管硬件以后发生的事情,也就是操作系统的启动流程。

arm linux 启动流程

这个部分比较有意思。因为在BIOS阶段(相当与嵌入式ARM Linux的 bootloader),计算机的行为基本上被写死了,程序员可以做的事情并不多;但是,一旦进入操作系统,程序员几乎可以定制所有方面。所以,这个部分与程序员的关系更密切。

我主要关心的是Linux操作系统,它是目前服务器端的主流操作系统。下面的内容针对的是Debian发行版,因为我对其他发行版不够熟悉。

 

第一步、加载内核

操作系统接管硬件以后,首先读入 /boot 目录下的内核文件。

arm linux 启动流程

以我的电脑为例,/boot 目录下面大概是这样一些文件,ARM Linux一般则比较精简,该目录下为空:

$ ls /boot
config-3.2.0-3-amd64
config-3.2.0-4-amd64
grub
initrd.img-3.2.0-3-amd64
initrd.img-3.2.0-4-amd64
System.map-3.2.0-3-amd64
System.map-3.2.0-4-amd64
vmlinuz-3.2.0-3-amd64
vmlinuz-3.2.0-4-amd64

 

第二步、启动初始化进程

内核文件加载以后,就开始运行第一个程序 /sbin/init,它的作用是初始化系统环境。

arm linux 启动流程

由于init是第一个运行的程序,它的进程编号(pid)就是1。其他所有进程都从它衍生,都是它的子进程。

 

第三步、确定运行级别

许多程序需要开机启动。它们在Windows叫做”服务”(service),在Linux就叫做”守护进程“(daemon)。

init进程的一大任务,就是去运行这些开机启动的程序。但是,不同的场合需要启动不同的程序,比如用作服务器时,需要启动Apache,用作桌面就不需要。Linux允许为不同的场合,分配不同的开机启动程序,这就叫做”运行级别“(runlevel)。也就是说,启动时根据”运行级别”,确定要运行哪些程序。

arm linux 启动流程

Linux预置七种运行级别(0-6)。一般来说,0是关机,1是单用户模式(也就是维护模式),6是重启。运行级别2-5,各个发行版不太一样,对于Debian来说,都是同样的多用户模式(也就是正常模式)。

init进程首先读取文件 /etc/inittab,它是运行级别的设置文件。如果你打开它,可以看到第一行是这样的:

id:2:initdefault:

initdefault的值是2,表明系统启动时的运行级别为2。如果需要指定其他级别,可以手动修改这个值。

那么,运行级别2有些什么程序呢,系统怎么知道每个级别应该加载哪些程序呢?……回答是每个运行级别在/etc目录下面,都有一个对应的子目录,指定要加载的程序。

/etc/rc0.d
/etc/rc1.d
/etc/rc2.d
/etc/rc3.d
/etc/rc4.d
/etc/rc5.d
/etc/rc6.d

上面目录名中的”rc“,表示run command(运行程序),最后的d表示directory(目录)。下面让我们看看 /etc/rc2.d 目录中到底指定了哪些程序。

$ ls  /etc/rc2.d
 
README
S01motd
S13rpcbind
S14nfs-common
S16binfmt-support
S16rsyslog
S16sudo
S17apache2
S18acpid
...

可以看到,除了第一个文件README以外,其他文件名都是”字母S+两位数字+程序名”的形式。字母S表示Start,也就是启动的意思(启动脚本的运行参数为start),如果这个位置是字母K,就代表Kill(关闭),即如果从其他运行级别切换过来,需要关闭的程序(启动脚本的运行参数为stop)。后面的两位数字表示处理顺序,数字越小越早处理,所以第一个启动的程序是motd,然后是rpcbing、nfs……数字相同时,则按照程序名的字母顺序启动,所以rsyslog会先于sudo启动。

这个目录里的所有文件(除了README),就是启动时要加载的程序。如果想增加或删除某些程序,不建议手动修改 /etc/rcN.d 目录,最好是用一些专门命令进行管理。

 

第四步、加载开机启动程序

前面提到,七种预设的”运行级别”各自有一个目录,存放需要开机启动的程序。不难想到,如果多个”运行级别”需要启动同一个程序,那么这个程序的启动脚本,就会在每一个目录里都有一个拷贝。这样会造成管理上的困扰:如果要修改启动脚本,岂不是每个目录都要改一遍?

Linux的解决办法,就是七个 /etc/rcN.d 目录里列出的程序,都设为链接文件,指向另外一个目录 /etc/init.d ,真正的启动脚本都统一放在这个目录中。init进程逐一加载开机启动程序,其实就是运行这个目录里的启动脚本。

arm linux 启动流程

下面就是链接文件真正的指向。

$ ls -l /etc/rc2.d

README
S01motd -> ../init.d/motd
S13rpcbind -> ../init.d/rpcbind
S14nfs-common -> ../init.d/nfs-common
S16binfmt-support -> ../init.d/binfmt-support
S16rsyslog -> ../init.d/rsyslog
S16sudo -> ../init.d/sudo
S17apache2 -> ../init.d/apache2
S18acpid -> ../init.d/acpid
... 

这样做的另一个好处,就是如果你要手动关闭或重启某个进程,直接到目录 /etc/init.d 中寻找启动脚本即可。比如,我要重启Apache服务器,就运行下面的命令:

$ sudo /etc/init.d/apache2 restart

/etc/init.d 这个目录名最后一个字母d,是directory的意思,表示这是一个目录,用来与程序 /etc/init 区分。

 

第五步、用户登录

开机启动程序加载完毕以后,就要让用户登录了。

 

一般来说,用户的登录方式有三种:

  1. 命令行登录
  2. ssh登录
  3. 图形界面登录

这三种情况,都有自己的方式对用户进行认证。

  1. 命令行登录:init进程调用getty程序(意为get teletype),让用户输入用户名和密码。输入完成后,再调用login程序,核对密码(Debian还会再多运行一个身份核对程序/etc/pam.d/login)。如果密码正确,就从文件 /etc/passwd 读取该用户指定的shell,然后启动这个shell。
  2. ssh登录:这时系统调用sshd程序(Debian还会再运行/etc/pam.d/ssh ),取代getty和login,然后启动shell。
  3. 图形界面登录:init进程调用显示管理器,Gnome图形界面对应的显示管理器为gdm(GNOME Display Manager),然后用户输入用户名和密码。如果密码正确,就读取/etc/gdm3/Xsession,启动用户的会话。

 

第六步、进入 login shell

所谓shell,简单说就是命令行界面,让用户可以直接与操作系统对话。用户登录时打开的shell,就叫做login shell。

 

Debian默认的shell是Bash,它会读入一系列的配置文件。上一步的三种情况,在这一步的处理,也存在差异。

(1)命令行登录:首先读入 /etc/profile,这是对所有用户都有效的配置;然后依次寻找下面三个文件,这是针对当前用户的配置。

  ~/.bash_profile
  ~/.bash_login
  ~/.profile
  

需要注意的是,这三个文件只要有一个存在,就不再读入后面的文件了。比如,要是 ~/.bash_profile 存在,就不会再读入后面两个文件了。

(2)ssh登录:与第一种情况完全相同。

(3)图形界面登录:只加载 /etc/profile 和 ~/.profile。也就是说,~/.bash_profile 不管有没有,都不会运行。

 

第七步,打开 non-login shell

老实说,上一步完成以后,Linux的启动过程就算结束了,用户已经可以看到命令行提示符或者图形界面了。但是,为了内容的完整,必须再介绍一下这一步。

用户进入操作系统以后,常常会再手动开启一个shell。这个shell就叫做 non-login shell,意思是它不同于登录时出现的那个shell,不读取/etc/profile和.profile等配置文件。

 

non-login shell的重要性,不仅在于它是用户最常接触的那个shell,还在于它会读入用户自己的bash配置文件 ~/.bashrc。大多数时候,我们对于bash的定制,都是写在这个文件里面的。

你也许会问,要是不进入 non-login shell,岂不是.bashrc就不会运行了,因此bash 也就不能完成定制了?事实上,Debian已经考虑到这个问题了,请打开文件 ~/.profile,可以看到下面的代码:

  if [ -n "$BASH_VERSION" ]; then
    if [ -f "$HOME/.bashrc" ]; then
      . "$HOME/.bashrc"
    fi
  fi
  

上面代码先判断变量 $BASH_VERSION 是否有值,然后判断主目录下是否存在 .bashrc 文件,如果存在就运行该文件。第三行开头的那个点,是source命令的简写形式,表示运行某个文件,写成”source ~/.bashrc”也是可以的。

因此,只要运行~/.profile文件,~/.bashrc文件就会连带运行。但是上一节的第一种情况提到过,如果存在~/.bash_profile文件,那么有可能不会运行~/.profile文件。解决这个问题很简单,把下面代码写入.bash_profile就行了。

  if [ -f ~/.profile ]; then
    . ~/.profile
  fi
  

这样一来,不管是哪种情况,.bashrc都会执行,用户的设置可以放心地都写入这个文件了。

Bash的设置之所以如此繁琐,是由于历史原因造成的。早期的时候,计算机运行速度很慢,载入配置文件需要很长时间,Bash的作者只好把配置文件分成了几个部分,阶段性载入。系统的通用设置放在 /etc/profile,用户个人的、需要被所有子进程继承的设置放在.profile,不需要被继承的设置放在.bashrc。

顺便提一下,除了Linux以外, Mac OS X 使用的shell也是Bash。但是,它只加载.bash_profile,然后在.bash_profile里面调用.bashrc。而且,不管是ssh登录,还是在图形界面里启动shell窗口,都是如此。

关键字:arm  linux  启动流程 引用地址:arm linux 启动流程

上一篇:浅析Arm Linux操作系统调用流程详细解析
下一篇:arm linux 启动流程之 进入内核

推荐阅读最新更新时间:2024-03-16 14:57

微软确定与ARM合作,欲控制硬件领域
   据12月6日消息,有关人士透露,微软近期确定了ARM平台Windows开发(WOA)的下游合作伙伴,被邀请的台湾制造商在该项目中只扮演了小角色。 据称,微软将让三大ARM处理器制造商Nvidia、高通和 德州仪器 挑选两家笔记本电脑制造商合作,其中一家为主要合作商,另一家为次要合作商,取决于制造商对技术资源的投入多少。 业内人士认为,这意味着微软也开始控制硬件领域。 高通选择了三星和索尼, 德州仪器 选择了东芝和三星,Nvidia选择则了联想和宏碁,以上制造商中,三星、东芝和联想为主要合作伙伴。 同时,2011年Nvidia Tegra系列的最大客户、全球第五大笔记本制造商华硕在此次项目中被冷落。 消息源
[工业控制]
ARM中的STM/LDM指令
STM/LDM是批量传输数据的指令,这里要说明的是[15:0]Register list代表了16个寄存器,传输数据的时候R15始终是最后传输的,按照从R0到R15的顺序,R15始终在高地址。 递增传输倒好理解,关键是递减传输,2440的datasheet令我费解,看看datasheet里的一张图 假设Rn = R0, R0 = 0x1000,STMDB R0!, { R1, R5, R7 }这样一条指令,先存储R1,执行之后R0的值是多少?图上并没有标注,并不能按照R0 -= 4, = R1, R0 -= 4, = R4, R0 -= 4, = R7这种方式来理解,如果按照R7,R5,R1的顺序来存储就好理解了,但
[单片机]
<font color='red'>ARM</font>中的STM/LDM指令
Linux Mint 4.0将于4月18日停止提技术支持
      Linux Mint 团队刚刚宣布代号为 Daryna 的 Linux Mint 4.0 将于今年4月18日停止提技术支持,这是在 Ubuntu 官方宣布将于2009年4月18日停止对 Ubuntu 7.10 提技术支持后 不久做出的决定。   因为 Linux Mint 4.0 是基于 Ubuntu 7.10 的一个发行版。Linux Mint 官方建议 Linux Mint 4.0 的用户把系统升级到 Linux Mint 5.0,因为它是 LTS(长技术支持周期)版本,将提供较长技术周期同时也相对成熟和稳定, Linux Mint 5.0 的技术支持将到 2011年。   Linux Mint 是一个基于
[嵌入式]
技领提供针对ARM处理器的电源管理IC系列
技领半导体公司(Active-Semi International)今天宣布为其正在申请专利的电源管理单元(PMU)系列增添一个新品:ACT8937。该设备经过优化,满足高级应用处理器电源解决方案独特的电源、电压排序和控制要求。新的PMU设备具有三个直流/直流降压稳压器和四个低噪声、低压差线性稳压器,以及一个完整的电池充电解决方案和ActivePathTM系统电源选择功能。ACT8937 PMU是一个面向以电池供电的移动设备的完整的、低本高效的ActivePMUTM电源管理解决方案。   技领半导体公司电源管理副总裁Gary Hurtz说:“新ACT8937突出技领半导体公司在PMU产品中的最新创新。该PMU针对三星的S5
[电源管理]
ARM汇编之寻址方式
ARM7处理器有两个指令集:32位的ARM指令集,16位的Thumb指令集。 1 ARM指令集:效率高,代码密度高 2 Thumb指令集:具有较高的代码密度。 注: 1. 所有的ARM指令集都是有条件执行的,而Thumb指令集仅有一条指令具备条件执行功能。 2. ARM程序和Thumb程序可相互调用,相互之间的状态切换开销几乎为零。 二. ARM处理器寻址方式 寻址方式是指根据指令中给出的地址码字段来实现寻找真实操作数地址的方式。ARM7处理器总共有9中基本的寻址方式。 1. 寄存器寻址 1 操作数的值存放在寄存器中,指令中的地址码字段指出的是寄存器编号,指令执行时直接取出寄存器值来操作。 2 MOV R
[单片机]
<font color='red'>ARM</font>汇编之寻址方式
ARM裸板】未定义指令异常分析及示例
1.未定义指令异常示例 根据5.1可知,执行异常处理函数之前,硬件会处理的事情: 1.lr_und保存有被中断模式中的下一条即将执行的指令的地址 2.SPSR_und保存被中断模式CPSR 3.CPSR的 = ,进入到und模式 4.跳到0x04的模式执行程序,即跳到b do_und这一指令 /*====================================异常向量表===========================================*/ _start: b reset //vector 0: reset(0地址对应reset) ldr pc, =und_addr //绝对跳转,跳转至s
[单片机]
【<font color='red'>ARM</font>裸板】未定义指令异常分析及示例
基于ARM的海洋环境地磁场三分量测量仪的设计
一、项目概述 1.1 项目摘要 提出了一种利用安装在舰船上的三分量磁传感器进行地磁场测量的构想,解决了在任意的舰船姿态下,消除测量中舰船磁场干扰的问题。该测试仪采用地磁模块来测量磁场的三分量值,采用3轴陀螺仪来进行任意的舰船姿态所包含的横摇,纵摇和航向三种状态信息,对采集到的数据进行计算,从而得到地磁场的三分量值。同时 该模块还包含压力传感器和温度传感器,可以实时检测海面上的气压以及温度情况。 1.2 项目背景/选题动机 测地磁消舰磁 是舰载消磁系统所采用的消磁方法,如果能预先测量出舰船航行海域的地磁场值并建立数据库,那么舰船在航行的过程中就可以根据当地的地磁场值来进行消磁系统的电流调整,从而改善舰载消磁系统的控制方法
[单片机]
基于<font color='red'>ARM</font>的海洋环境地磁场三分量测量仪的设计
嵌入式Linux的低功耗策略研究
摘 要:功耗是嵌入式设备的一个十分重要的性能指标。在硬件设计和选型之后,功耗水平在极大程度上取决于软件的设计。鉴于Lioux在嵌入式设备中的应用日益广泛,提出在嵌入式Linux下软件编写的几种策略。通过这些软件编写方式,能有效降低最终产品的功耗水平。 关键词:嵌入式Linux功耗策略 引 言 由于Linux系统具有嵌入式操作系统需要的很多特色,如适应于多种CPU和多种硬件平台、性能稳定、可裁剪性很好、源码开放、开发和使用简单等。目前,基于Linux应用的嵌入式设备日益增多,Linux正在嵌入式领域发挥着越来越重要的作用。 对于嵌入式设备尤其是移动设备来说,功耗是系统的重要指标,系统设计的重要目标之一就是要尽可能地降低功耗
[嵌入式]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved