Chinaunix首页 | 论坛 | 博客
  • 博客访问: 63562
  • 博文数量: 10
  • 博客积分: 300
  • 博客等级: 二等列兵
  • 技术积分: 160
  • 用 户 组: 普通用户
  • 注册时间: 2012-10-12 21:57
文章分类
文章存档

2012年(10)

我的朋友

分类:

2012-10-21 12:57:56

原文地址:体验开机之旅 作者:yanjerry9133

1.BIOS初始化(BIOS就是在开机计算机主动执行的第一个程序)
 

BIOS 和CMOS大家应该都听过了,但是很多人依然还是很混淆,这里先解释下这两个名词。

 

COMS Complementary Metal Oxide Semiconductor(互补金属氧化物半导体)的缩写。它是指制造大规模集成电路芯片用的一种技术或用这种技术制造出来的芯片。是电脑主板上的一块可读写的RAM芯片。因为可读写的特性,所以在电脑主板上用来保存BIOS设置完电脑硬件参数后的数据,这个芯片仅仅是用来存放数据的 ,共计128个字节。 CMOS是记录各项硬件参数且嵌入在主板上的存储器。主要功能为记录主板上的重要参数,包括系统时间、cpu电压与频率、各项设备的I/O地址与IRQ中断等,由于这些数据的记录要花费电力,因此主板上面才有电池。

 

BIOS:是一个写入到主板上的一个软件程序,既写入到主板上某一块闪存或EEPROM(EEPROM (Electrically Erasable Programmable  Read-Only Memory),电可擦可编程只读存储器,一种掉电后数据不丢失的存储芯片。)的程序,其中保存了微机系统最重要的基本输入输出程序、系统开机自检程序等。它负责开机时,对系统各项硬件进行初始化设置和测试,加载CMOS当中的参数,并尝试调用存储设备中的开机程序,进一步进入系统当中。BIOS程序也可以修改CMOS中的数据。

 
clipboard[16]
BIOS设置
 
    由于 BIOS和CMOS都跟系统设置密初相关,所以在实际使用过程中造成了BIOS设置和CMOS设置的说法,其实指的都是同一回事,但BIOS与CMOS却是两个完全不同的概念,总之,CMOS是系统存放参数的地方,而BIOS中的系统设置程序 是完成参数设置的手段。因此,准确的说法是通过 BIOS设置程序 对CMOS参数 进行设置。事实上,BIOS程序是储存在主板上一块 EEPROM Flash 芯片中的,CMOS存储器是用来存储BIOS设定后的要保存数据的,包括一些系统的硬件配置和用户对某些参数的设定,比如传统BIOS的系统密码和设备启动顺序等等。
 
2.启动加载器 
    BIOS会去分析计算机里有哪些存储设备,以硬盘为例,BIOS会依据用户的设置去取得能够开机的硬盘,并且到该硬盘中读取第一个扇区(磁盘最外道,即0磁道)的MBR的位置。MBR这个仅有512Bytes的硬盘容量里会放置最基本的引导加载程序,此时BIOS就功成圆满,接下来就是MBR内的引导加载程序的工作了。

 

clipboard[17]
 
 
这里又有了一些新的名词,再带大家认识下硬盘MBR引导加载程序(Bootloader):

硬盘:主要由盘片、机械手臂、磁头、与主轴马达所组成。而数据的写入其实是在盘片上面。盘片上面又可细分出扇区(Sector)与柱面(Cylinder)两种单位,其中扇区每个为512bytes那么大。最外侧一圈叫零磁道,每一片盘片从外到内同心圆依次为0磁道,1磁道,2磁道......多个盘片的同名磁道组成了柱面。

clipboard[18]

clipboard[19]

 

 

MBR:(Master Boot Record)主引导记录,安装 引导加载程序 的地方。

一般将MBR分为广义和狭义两种:广义的MBR包含整个扇区(引导程序、分区表及分隔标识),也就是所说主引导记录;而狭义的MBR仅指引导程序。

硬盘的0柱面、0磁道、1扇区称为主引导扇区,就是MBR所在位置

包含:

1. 引导加载程序 (Bootloader):在内核运行操作系统之前运行的一段小程序。446bytes

2.分区表(partition table):记录整块磁盘分区的状态,有64byte

3.另外2bytes,扇区结束标志字(55AA)

 

详细MBR的组成:
一个扇区的硬盘主引导记录MBR由如下表所示的4个部分组成。
主引导程序(偏移地址0000H--0088H),它负责从活动分区中装载,并运行系统引导程序。137bytes
出错信息数据区,偏移地址0089H--00E1H为出错信息,00E2H--01BDH全为0字节。309bytes
分区表(DPT,Disk Partition Table)含4个分区项,偏移地址01BEH--01FDH,64bytes
每个分区表项长16个字节,共64字节为分区项1、分区项2、分区项3、分区项4。
结束标志字
,偏移地址01FE--01FF的2个字节值为结束标志55AA,如果该标志错误系统就不能启动。

clipboard[20]

引导加载程序(Bootloader)

BootLoader就是在操作系统内核运行之前运行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间映射图,从而将系统的软硬件环境带到一个合适状态,以便为最终调用操作系统内核准备好正确的环境。

分区表(partition table)

        传统的分区方案(称为MBR分区方案)是将分区信息保存到磁盘的第一个扇区(MBR扇区)中的64个字节中,每个分区项占用16个字节,这16个字节中存有活动状态标志、文件系统标识、起止柱面号、磁道号、扇区号、隐含扇区数目(4个字节)、分区总扇区数目(4个字节)等内容。由于MBR扇区只有64个字节用于分区表,所以只能记录4个分区的信息。这就是硬盘主分区数目不能超过4个的原因。后来为了支持更多的分区,引入了扩展分区及逻辑分区的概念。但每个分区项仍用16个字节存储。

clipboard[21]

 
 
Bootloader:Grub启动引导
clipboard[22]
另外还有一个名词:GRUB

GNU GRUB(简称“GRUB”)是一个来自GNU项目的多操作系统启动程序。GRUB是多启动规范的实现,它允许用户可以在计算机内同时拥有多个操作系统,如windows,linux。并在计算机启动时选择希望运行的操作系统。GRUB可用于选择操作系统分区上的不同内核,也可用于向这些内核传递启动参数。

 

 

这里引用的嵌入式的bootloader 的stage1和stage2的功能:

Boot Loader 的stage1
通常包括以下步骤(以执行的先后顺序):
–硬件设备初始化。
–为加载Boot Loader 的stage2 准备RAM 空间。
–拷贝Boot Loader 的stage2 到RAM 空间中。
–设置好堆栈
–跳转到stage2 的C 入口点。
 
 
Boot Loader 的stage2
通常包括以下步骤(以执行的先后顺序):
–初始化本阶段要使用到的硬件设备。
–检测系统内存映射(memory map)。
–将kernel 映像和根文件系统映像从flash 上读到RAM 空间中。
–为内核设置启动参数。
–调用内核。
 
 
stage2 的代码通常用C 语言来实现,以便于实现更复杂的功能和取得更好的代码可读性和可移植性。与普通C 语言应用程序不同的是,在编译和链接boot loader 这样的程序时,我们不能使用glibc 库中的任何支持函数。
 
 
grub启动引导系统
如果/boot未独立分区,读取/boot/grub/grub.conf
如果/boot独立分区,读取/grub/grub.conf
 
其实Boot Loader的功能就是载入Kernel
 
 
3.内核初始化
 
clipboard[23]
 
这里有两个重要的文件 vmlinuz-[内核版本]和initrd-[内核版本].img
 
vmlinuz:vmlinuz是可引导的、压缩的内核。“vm”代表 “Virtual Memory”。Linux 支持虚拟内存,不像老的操作系统比如DOS有640KB内存的限制。Linux能够使用硬盘空间作为虚拟内存,因此得名“vm”。vmlinuz是可执行的Linux内核,它位于/boot/vmlinuz,它一般是一个软链接。vmlinux是未压缩的内核,vmlinuz是vmlinux的压缩文件。

initrd:(initial RAM diskLinux 初始 RAM磁盘(initrd)是在实际根文件系统可用之前挂载到系统中的一个初始根文件系统。initrd与内核绑定在一起,并作为内核引导过程的一部分进行加载。内核然后会将这个 initrd文件作为其两阶段引导过程的一部分来加载模块,这样才能稍后使用真正的文件系统,并挂载实际的根文件系统。
 
initrd 中包含了实现这个目标所需要的目录和可执行程序的最小集合,例如将内核模块加载到内核中所使用的 insmod 工具。
 
在桌面或服务器Linux 系统中,initrd 是一个临时的文件系统。其生存周期很短,只会用作到真实文件系统的一个桥梁。在没有存储设备的嵌入式系统中,initrd 是永久的根文件系统。
 
此阶段bootloader可以加载kernel和initrd 然后再内存中将initrd解压为根目录,kernel就能够借此加载适当的驱动程序,最终释放initrd,并挂在实际的根文件系统,就能够开始正常的开机流程。
 
 
4./sbin/init初始化

111[4]
在核心完整的加载,进行完硬件检测与驱动加载后,接下来就开始执行系统的第一支程序pid为1的/sbin/init
 
/sbin/init的主要功能就是:准备软件执行环境,包括系统主机名,网络设定,语系处理,文件系统格式及其他服务的启动等,这些会通过读取他的配置文件/etc/inittab来完成,配置文件中一个比较重要的项目是runlevel,即启动级别:
 
0-halt(系统直接关机)
1-single user mode(单用户维护模式,在系统出问题时使用,类似windows安全模式)
2-Multi-user,without NFS(类似runlevel 3 但无NFS服务)
3-Full multi-user mode (完整含有网络功能的纯文本模式)
4-unused(系统保留功能)
5-X11(与runlevel 3类似,但是加载使用Xwindow图形界面)
6-reboot(重新启动)
clipboard[24]
 
然后执行/etc/rc.sysinit用来读取/etc/fstab文件进行挂载分区,读取/etc/rc.d/rc.local创建用户自定义系统启动的内容。之后,系统会根据系统的启动级别进行/etc/rc.d/rc*.d/目录下开启一些相对于的服务。例如当系统的启动级别为5时,则进行/etc/rc.d/rc5.d目录,在这个目录下的服务文件全部是连接文件,连结到 stand alone 服务启动的目录 /etc/init.d/ 去,其中以S开头,就是当前级别下开机自动启动;K开头,就是不启动。
 
其实/etc/rc.d/rc.sysinit做了很多事:
1. 取得网络环境与主机类型: 读取网络配置文件 /etc/sysconfig/network ,取得主机名与默认网关(gateway) 等网络环境。
2. 测试与挂载内存设备/proc 及 USB 设备 /sys: 除挂载内存设备 /proc 之外,还会主动监测系统上是否有 usb 的设备, 若有则会主动加载 usb 的驱动程序,并且尝试挂载 usb 的文件系统。
3. 决定是否启动 SELinux : SELinux 在此时进行一些检测, 并检测是否需要帮所有的文件重新编写标准的 SELinux 类型 (auto relabel)。
4. 启动系统的随机数生成器 随机数生成器可以帮助系统进行一些密码加密演算的功能,在此需要启动两次随机数生成器。
5. 设定终端(console) 字形:
6. 设定显示于开机过程中的欢迎画面 (text banner);
7. 设定系统时间 (clock) 与时区设定:需读入 /etc/sysconfig/clock 的值
8. 接口设备的监测与 Plug and Play (PnP) 参数的测试: 根据核心在开机时监测的结果 (/proc/sys/kernel/modprobe ) 开始进行ide / scsi / 网络 / 音效 等接口设备的监测,以及利用以加载的核心模块进行 PnP 装置的参数测试。
9. 用户自定义模块的加载 使用者可以在 /etc/sysconfig/modules/*.modules 加入自定义的模块,则此时会被加载到系统当中
10.加载核心的相关设定: 系统会主动去读取 /etc/sysctl.conf 这个文件的值,使核心功能成为我们想要的样子。
11.设定主机名与初始化电源管理模块 (ACPI)
12.初始化软件磁盘阵列:主要是透过 /etc/mdadm.conf 来设定的。
13.初始化 LVM 的文件系统功能
14.以 fsck 检验磁盘文件系统:会进行 filesystem check
15.进行磁盘配额 quota 的转换 (非必要):
16.重新以可擦写模式挂载系统磁盘:
17.启动quota 功能:所以我们不需要自定义 quotaon 的动作
18.启动系统虚拟随机数生成器 (pseudo-random):
19.清除开机过程当中的临时文件:
20.将开机相关信息加载 /var/log/dmesg 中。
 
 
 
登陆shell
/sbin/mingetty程序能打开终端、设置模式。同时它会显示一个文本登录界面,这个界面就是我们经常看到的登录界面,在这个登录界面中会提示用户输入用户名,而用户输入的用户名将作为参数传给/etc/login程序来验证用户的身份。
    Linux的账号验证程序是/etc/login,login会接收mingetty传来的用户名作为用户名参数。然后login会对用户名进行分析:如果用户名不是root,且存在/etc/nologin文件,login将输出nologin文件的内容,然后退出。这通常用来系统维护时防止非root用户登录。只有/etc/securetty中登记了的终端才允许root用户登录,如果不存在这个文件,则root可以在任何终端上登录。/etc/usertty文件用于对用户作出附加访问限制,如果不存在这个文件,则没有其他限制。

在分析完用户名后,login将搜索/etc/passwd以及/etc/shadow来验证密码以及设置账户的其它信息,比如:主目录是什么、使用何种shell。如果没有指定主目录,将默认为根目录;如果没有指定shell,将默认为/bin/bash。

    login程序成功后,会向对应的终端在输出最近一次登录的信息(在/var/log/lastlog中有记录),并检查用户是否有新邮件(在/usr/spool/mail/的对应用户名目录下)。

clipboard[25]
 
个人偏好设定读取顺序,只读取一个
1.~/.bash_profile
2.~/.bash_login
3.~/.profile
nologin shell 只读取~/.bashrc

然后开始设置各种环境变量:对于bash来说,系统首先寻找/etc/profile脚本文件,并执行它;然后如果用户的主目录中存在.bash_profile文件,就执行它,在这些文件中又可能调用了其它配置文件,所有的配置文件执行后后,各种环境变量也设好了,这时会出现大家熟悉的命令行提示符,到此整个启动过程就结束了。

 

我们的开机之旅也就此到达目的地啦~~~祝大家玩得愉快!!!


阅读(1106) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~