Linux/MAC OSX 开机程序

MAC OSX 开机程序:

[参考link]
[参考link]
[参考link]
[参考link]

MAC OS X系统初始化的4个主要阶段依次为:

1、固件(Firmware):在这个阶段初始化Mac硬件,查找和启动引导程序(Booter)。这一阶段成功完成后,发出一声鸣叫(启动声),电源灯明亮闪烁,「所有显示器」显示淡灰色背景。
2、引导程序(Booter):引导程序的主要工作是将系统内核和基本硬件驱动程序,内核扩展(KEXT),装入主存,然后让内核接管系统。引导程序阶段的标志是在「主显示器」上显示深灰色的苹果图标。
3、内核(Kernel):内核提供系统的基础,装载附加的驱动程序和核心BSD UNIX系统。它的标志是在主显示器的苹果图标下面有一个深灰色的旋转齿轮。
4、系统launchd:当核心操作系统装载后,它启动第一个进程,即系统launchd,该进程负责装载系统的其余部分。这个阶段的标志是在所有显示器上显示淡蓝色背景。这个阶段成功完成后,出现登陆窗口,如果用户设置为自动登录,则出现Finder。

MAC OS X用户环境的3个主要阶段是:

1、loginwindow:该进程负责显示登陆屏幕,并最终使用户登录到系统。成功完成这一阶段导致用户环境初始化,因此允许用户的应用程序运行。
2、用户launchd:该进程和loginwindow进程一起工作,初始化用户环境,并启动任何用户进程或应用程序。
3、用户环境:这是用户登陆到系统后,他的进程和应用程序存在的“空间”。很明显,用户环境由loginwindow和用户launchd进程维持。

Mac OS X使用EFI 进行引导,其他大部分的PC 机使用BIOS 进行引导

什么是引导?
为什么要引导?
使用EFI 进行引导or使用BIOS 进行引导的目的都是一样的:加载一些自举程序代码给CPU执行,自举程序负责POST(上电自检)阶段,CPU探测各种硬件总线,查明安装了哪些设备,
BIOS或BootROM固件定位这些引导设备,执行引导加载程序,将所有必要的命令行参数传递给操作系统内核。

看efi文件命令:

$ od -A x -t x4 /System/Library/CoreServices/boot.efi

# od命令用于输出文件内容
# -a  此参数的效果和同时指定[-ta]参数相同
# -A[字码基数]  :选择要以何种基数打印文件中字码地址,第一列为地址
#     od -A d 表示以十进制为基数打印字码地址
#     od -A o 表示以八进制为基数打印字码地址(系统默认值) 
#     od -A x 表示以十六进制为基数打印字码地址
# - t :指定数据的显示格式/输出格式
#     od -t c ASCII字符或反斜杠序列 
#     d[SIZE] 有符号十进制数,每个整数SIZE字节。 
#     od -t f[SIZE] 浮点数,每个整数SIZE字节。 
#     od -t o[SIZE] 八进制(系统默认值为02),每个整数SIZE字节。 
#     od -t u[SIZE] 无符号十进制数,每个整数SIZE字节。 
#     od -t x[SIZE] 十六进制数,每个整数SIZE字节。
# 
# -b 此参数的效果和同时指定[-toC]参数相同
# -c  此参数的效果和同时指定[-tC]参数相同。 
# 
 


Mac OS X 系统启动过程分为两大阶段:系统初始化+用户会话。
系统初始化启动操作系统所需要的过程,用户会话是为了初始化用户环境。

step_0 电源开启
step_1 BootROM固件进行POST上电自检:

有这样一个说法[link]: 计算机的启动是一个很矛盾的过程:必须先运行程序,然后计算机才能启动,但是计算机不启动就无法运行程序!因此,工程师们把一小段程序装入内存,然后计算机才能正常运行。OS X系统也是这样,Mac计算机的固件被称为BootROM,是一个位于计算机主板上的flash memory芯片。在真正启动操作系统之前,BootROM固件就像一个迷你操作系统先运行起来,而它要做的第一件事就是POST(Power-On Self Test, 上电自检)。POST检测内建的硬件组件状态是否正常,包括:处理器、系统内存、外设端口etc。(POST阶段顺利完成的标志:听到一声启动音,然后在「所有屏幕」上显示淡灰色背景。POST阶段失败的情况:最常见的是内存松动的情况,自检阶段会报错,系统就无法启动起来)

step_2 收集硬件信息,驱动程序初始化硬件:
step_00 boot.efi

针对系统磁盘采用了FileVault 2加密而言,在此情况下,OS X的引导程序无法被访问,因此系统将从OS X恢复分区启动,该分区中有一个特殊的EFI引导文件,显示一个类似登录窗口的屏幕。解密后,EFI固件被允许访问引导文件。

step_1 固件加载系统引导文件,启动引导器BootX,OS X就开始启动:

默认情况下,固件会加载系统引导文件,找到了引导文件后,EFI将会启动引导程序,OS X就开始启动了。(该阶段,主屏幕会显示一个暗灰色的苹果标志。)
引导程序通过Mac的固件启动,它负责加载OS X内核,以及最基本的内核扩展(KEXT)。为加快进程,引导程序会尽可能的加载缓存下来的文件,这显然要比重新加载整个系统快得多。(该阶段顺利完成的标志是一个小的、灰色的旋转齿轮图标。)

step_2 内核接管启动进程,启动BSD UNIX系统的核心:

当引导程序成功加载了内核与基本的KEXT后,内核就会接管启动进程。因为已有足够的KEXT,内核能够读取整个文件系统,以便加载更多的KEXT,然后开始启动BSD UNIX系统的核心。[此处还未深究]

step_3 在加载了kernelcache或内核本身之后,boot.efi退出引导服务,将控制权转交给内核。

内核被传入的一个参数(包含BootStruct的页面),这个数据结构在boot.efi的最后阶段完成填写,内核可以通过这个数据结构提取出所需要的所有数据。内核对EFI的回调:EFI的职责是加载内核,但是加载完成以后,内核仍然可以和EFI接口,从而使用EFI提供的运行时服务,运行时服务很少被用到,在osfmk/i386/AT386/model_dep.c文件中定义了3个函数,I/O Kit中,大量使用EFI(设备树)。

step_3 内核启动第一个非内核进程--系统launchd:

系统初始化的最后一步,内核会启动第一个非内核进程—系统launchd,它是所有其他进程的父进程,它的第一个任务就是通过启动所有其他系统进程来完成系统初始化。

step_4 用户会话过程:

接下来就到了用户会话过程。Loginwindow负责显示登录界面;用户launchd用于进行用户环境的初始化并启动任何用户级别的进程或应用程序;最后,用户登录到系统之后,就到了会话环境中,而前两个进程会始终运行着。

Linux开机程序:

step_1 ,POST(Power-On Self Test ,上电自检)
检测硬件状态是否正常
例如,最常见的是内存松动的情况,BIOS自检阶段会报错,系统就无法启动起来

step_2 ,枚举本地设备,启动系统的驱动程序,并各设备进行初始化
这一步主要是根据我们在BIOS中设置的系统启动顺序来搜索用于启动系统的驱动器,如硬盘、光盘、U盘、软盘和网络等。
以硬盘启动为例,BIOS此时去读取硬盘驱动器的第一个扇区(MBR,512字节),然后执行里面的代码。实际上这里BIOS并不关心启动设备第一个扇区中是什么内容,它只是负责读取该扇区内容、并执行。

step_3 ,控制权移交到MBR(Main Boot Record ,主引导记录区)
MBR位于整个硬盘的0磁道0柱面1扇区,在512字节的MBR中:
446 个字节:主引导程序(boot loader(如grub或lilo))
64 个字节:DPT(Disk Partition Table硬盘分区表)
2 个字节:“55,AA”是分区的结束标志。
这个整体构成了硬盘的主引导扇区。

MBR 的 boot loader grub 程序:
初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核做好一切准备。

将硬盘0头0道2扇区读入内存。

/etc/init.d/*
init.d加载到内存里,执行init.d中的各个init脚本,如httpd

/sbin/init
运行/sbin/init程序,执行系统的1号进程。
此后将系统的控制权全部交给/sbin/init进程。

$ cd /sbin
$ man init
-> {
init(8)                    init(8)

NAME
       init - Upstart process management daemon

SYNOPSIS
       init [OPTION]...

DESCRIPTION
       init  is  the  parent of all processes on the system, it is 
       executed by the kernel and is responsible for starting all 
       other processes; it is the parent of all processes whose natural 
       parents  have  died and it is responsible for reaping those when 
       they die.

       Processes managed by init are known as jobs and are defined 
       by files in the /etc/init directory.  See init(5) for more details 
       on configuring Upstart.

   Events
       init(8) is an event-based init daemon.  This means  that  jobs  
       will  be  automatically  started  andstopped  by  changes that 
       occur to the system state, including as a result of jobs starting 
       and stopping.

       This is different to dependency-based init daemons which start 
       a specified  set  of  goal  jobs,  and resolve  the  order in which 
       they should be started and other jobs required by iterating their 
       dependencies.

       For more information on starting and stopping jobs, as well as 
       emitting events  that  will  automatically start and stop jobs, see 
       the manual page for the initctl(8) tool.
       
       The  primary event is the startup(7) event, emitted when the daemon 
       has finished loading its configuration.  Other useful events are 
       the starting(7), started(7), stopping(7) and stopped(7) events 
       emitted as jobs change state.

   System V compatibility
       The  Upstart  init(8)  daemon  does  not keep track of runlevels 
       itself, instead they are implemented entirely by its userspace 
       tools.  The event emitted to signify a  change  of  runlevel  is  
       the  runlevel(7) event.  For more information see its manual page.

OPTIONS
       Options are passed to init(8) by placing them on the kernel 
       command-line.

       --verbose
          Outputs  verbose messages about job state changes and event 
          emissions to the system console or log, useful for debugging 
          boot.

NOTES
       init is not normally executed by a user process, and expects 
       to have a process id of 1.  If  this  is not  the  case,  it will 
       actually execute telinit(8) and pass all arguments to that.  
       See that manual page for further details.

FILES
       /etc/init.conf

       /etc/init/*.conf

AUTHOR
       Written by Scott James Remnant <scott@netsplit.com>

REPORTING BUGS
       Report bugs at <https://launchpad.net/upstart/+bugs>

COPYRIGHT
       Copyright © 2010 Canonical Ltd.
       This is free software; see the source for copying conditions.  
       There is NO  warranty;  not  even  for MERCHANTABILITY or 
       FITNESS FOR A PARTICULAR PURPOSE.

SEE ALSO
       init(5) initctl(8) telinit(8) runlevel(7) startup(7) starting(7) 
       started(7) stopping(7) stopped(7)

Upstart                       2010-02-04                       init(8)

-> q }

# man是manual(手册)的缩写,查看系统中自带的各种参考手册
# /sbin/init 程序用来开启进程管理后台程序
# init  is  the  parent of all processes on the system ,init程序是系统所有程序的父级调用程序
# 它由Linux核调用执行
# 负责开启其他的所有进程
# 负责所有进程结束后的回收
# 由init程序管理的processes/jobs都定义在/etc/init/下的文件中
# daemon :守护进程;后台程序

/etc/inittab程序:
执行相应的脚本进行系统初始化,如设置键盘、字体,装载模块,设置网络等。

$ vim /etc/inittab

->{
# inittab is only used by upstart for the default runlevel.
#
# ADDING OTHER CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
#
# System initialization is started by /etc/init/rcS.conf
#
# Individual runlevels are started by /etc/init/rc.conf
#
# Ctrl-Alt-Delete is handled by /etc/init/control-alt-delete.conf
#
# Terminal gettys are handled by /etc/init/tty.conf and /etc/init/serial.conf,
# with configuration in /etc/sysconfig/init.
#
# For information on how to write upstart event handlers, or how
# upstart works, see init(5), init(8), and initctl(8).
#
# Default runlevel. The runlevels used are:
#   0 - halt (Do NOT set initdefault to this)
#   1 - Single user mode
#   2 - Multiuser, without NFS (The same as 3, if you do not have networking)
#   3 - Full multiuser mode
#   4 - unused
#   5 - X11
#   6 - reboot (Do NOT set initdefault to this)
#
id:3:initdefault:
~

-> esc : q }

/etc/rc.d/rc.sysinit 程序:

$ vim /etc/rc.d/rc.sysinit

-> {
#!/bin/bash
#
# /etc/rc.d/rc.sysinit - run once at boot time
#
# Taken in part from Miquel van Smoorenburg's bcheckrc.
#

HOSTNAME=$(/bin/hostname)

set -m

if [ -f /etc/sysconfig/network ]; then
    . /etc/sysconfig/network
fi
if [ -z "$HOSTNAME" -o "$HOSTNAME" = "(none)" ]; then
    HOSTNAME=localhost
fi

if [ ! -e /proc/mounts ]; then
        mount -n -t proc /proc /proc
        mount -n -t sysfs /sys /sys >/dev/null 2>&1
fi
if [ ! -d /proc/bus/usb ]; then
        modprobe usbcore >/dev/null 2>&1 && mount -n -t usbfs /proc/bus/usb /proc/bus/usb
else
        mount -n -t usbfs /proc/bus/usb /proc/bus/usb
fi

#remount /dev/shm to set attributes from fstab #669700
···
-> esc : q }

当/etc/rc.d/rc.sysinit执行完后,系统就可以顺利工作了,只是还需要启动系统所需要的各种服务,这样主机才可以提供相关的网络和主机功能,因此便会执行/etc/rc.d/rc脚本。执行用户自定义引导程序/etc/rc.d/rc.local。

linux会启动终端或X-Window来等待用户登录。tty1,tty2,tty3…这表示在运行等级1,2,3,4的时候,都会执行”/usr/sbin/getty”,而且执行了6个,所以linux会有6个纯文本终端。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容