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

REPORTING BUGS

Report bugs at

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个纯文本终端。

mac软件linux系统,Linux/MAC OSX 开机程序相关推荐

  1. 透明加密支持linux吗,IP-guard文档透明加密软件|文档防泄密|数据加密|Linux系统加密|Mac苹果系统文档加密...

    IP-guard文档透明加密软件|文档防泄密|数据加密|Linux系统加密|Mac苹果系统文档加密 发布日期:2018-06-02 IP-guard全向文档加密,采用高强度的加密算法,将各种格式的电子 ...

  2. (转)Windows系统、Linux系统 和 Mac OS操作系统 历史由来 与 区别?

    目录 1 UNIX 由来 2 Linux 由来 3 Windows与Linux的主要区别 4 关于Linux的一些疑惑 参考资料 目前常见的三大操作系统:Windows系统.Linux系统 和 Mac ...

  3. Linux系统无线网络抓包程序(分析手机WIFI MAC地址)

    前面讲述了使用tcpdump和wireshark抓WIFI包,但这只是使用工具的层面,再深一层则是自己写代码实现这个功能.本文在前面文章<Linux系统有线网络抓包程序>的基础上添加实现无 ...

  4. IP-guard苹果加密软件苹果系统加密Mac文档加密软件

    IP-guard苹果加密软件|苹果系统加密|Mac文档加密软件 员工出差 也能加密管控 对于需要出差外出的同时,授予有限的离线授权. 允许外出继续使用加密文档,文档仍保持加密状态,只能在被授权的计算机 ...

  5. 去掉linux开关机图片,在Deepin Linux系统下去掉NVIDIA开机Logo的方法

    要实现在deepin Linux或其他Linux系统下去掉NVIDIA开机Logo非常的简单,只需要两步就可以了,可以运用命令操作,也可手动操作.安装NVIDIA请参考在deepin系统中安装英伟达N ...

  6. Linux系统 设置 cockpit 自动开机启动时异常问题处理(设置systemctl enable cockpit 异常【解决办法】)

    Linux系统 设置 cockpit 自动开机启动时异常问题处理 问题系统: Centos7 Fedora29 RedHat7 systemctl enable cockpit 时,会出现如下错误: ...

  7. Linux系统【Ubuntu】开机自启脚本及配置

    Linux系统[Ubuntu]开机自启脚本及配置 1.使用vim命令在`/etc/init.d`目录下新建一个xx.sh,文件名可自定义,以test.sh为例 2.保存成功以后,设置文本权限,否则不生 ...

  8. 如何解决Mac软件(dmg,akp,app)出现程序已损坏的提示

    一般情况下mac软件以dmg,akp和app后缀结尾,dmg只是类似ISO一样的光盘镜像,akp是安装程序,app是类似windows里可直接应用的绿色软件.这些应用一般出现程序真正损坏的情况很少,主 ...

  9. 在Linux系统中运行C语言程序

    正式学习c语言的第一天   2022/1/10 在之前的学习中已经在Windows系统中用Microsoft VC++上实现了C语言程序的运行,现在将在Linux系统上运行C语言程序. 首先明确C语言 ...

最新文章

  1. c 远程编辑linux文件,makefile - 在远程Linux机器上编译C ++ - “检测到时钟偏差”警告...
  2. [转]Struts 2.1发布
  3. ubuntu下编译安装PHP
  4. Mac 系统中maven配置环境变量
  5. 推荐系统之业务架构总览
  6. Windows系统帮助中心程序的0day漏洞
  7. what are the added values for the research?
  8. jquery点击弹出播放视频并显示遮罩层
  9. C++ using的三种使用策略以及具体的用法
  10. 【OpenCV 例程200篇】99. 修正阿尔法均值滤波器
  11. android os5.0 优点,Funtouch OS升级5.0 性能大幅提升
  12. Lync Server 2010 权限相关
  13. Handler 、 Looper 、Message
  14. MATLAB 求导diff
  15. HTML常用标签超详细整理
  16. 从未在一起更让人遗憾_我们从未在一起更遗憾
  17. 高端制造业企业信息化解决方案,工业电商平台设备、数据、体系预测性维护
  18. Unity打包exe生成的文件夹合并成单独的exe
  19. IFIX数据写入html,iFIX常见问题问答.doc
  20. 将favdb转换成html,360浏览器收藏夹使用小记

热门文章

  1. v30pro支持鸿蒙,荣耀V40pro秀肌肉,麒麟9000+双6400万+鸿蒙OS,再见了荣耀V30pro
  2. Android开发之MVVM模式实践:协程与网络请求的结合
  3. 想象自由之翼能量的气功
  4. 迭代器、装饰器、软件开发规范
  5. 鸿蒙系统 华为手表,原生鸿蒙系统,华为WATCH 3上手视频曝光
  6. 51Nod 2072 装箱问题 c/c++题解
  7. 输变电工程三维模型GIM文件如何打开?内含什么信息?在设计软件中是如何交互的?
  8. ybt 神(bian)奇(tai)题目总结合集(下)
  9. 涉密系统集成具体解答
  10. python新年有趣代码_有趣的超短Python代码