学习linux很长时间了,一直没有时间把经验和挖掘的一些技巧整理出来,这个暑假在家没事,整理了一些与大家分享。由于都是自己的理解和实验产物,所以肯定有些不当之处,期待交流指正! 这个系列文章将以Ubuntu探秘命名,内容涉及到整个开机流程及GNOME桌面的hack . 今天发表第一篇心得:BIOS到底干啥用?
BIOS(basic input/output system,基本输入输出系统)是一组被固化到电脑中,为电脑提供最低级、最直接的硬件控制的程序,它是连接软件程序和硬件设备的枢纽。
包括:检测硬件、初始化硬件、分配资源(如IO地址、IRQ号、DMA通道等)以及协助加载操作系统。 首先了解两个概念:北桥(north bridge)、南桥(south bridge). 北桥和南桥组成了主板上的芯片组。北桥主要控制CPU和内存,是系统总线和一级PCI总线的桥接设备,也称host bridge ;南桥负责PCI,PCI-E,USB,VGA等外围总线设备,这些外围设备挂在PCI总线上,通过各自的控制器与PCI总线接口,不同类型的总线通过bridge接口。
在内存的低端640KB地址空间被称为基本内存,一般用于固定用途,如A0000H~BFFFFH保留给显卡的显存使用,C0000H~C7FFFH为显卡的BIOS,C0000H~FFFFFH保留给系统中各设备的BIOS,IDE,SATA等BIOS也都在这一段空间中,其中" 系统BIOS"一般占用最后的64KB或更多。(这些信息可以用 cat /proc/iomem | head 查看到) 通常,计算机的启动过程是在主板的BIOS控制下进行的,这个BIOS也称为“系统BIOS”,它的内容在南桥芯片的一块特殊区域CMOS中,主板上的电池就是为CMOS保存资料而提供电源的。除了这个“系统BIOS”以外,各PCI设备也都提供各自的BIOS,它们的功能是直接访问所在设备的PCI配置寄存器,以获得PCI设备的信息、配置PCI设备的参数、完成PCI设备的初始化等。
系统BIOS在激活时会校验CMOS中的资料是否正确,若正确则会将这些资料和已找到的硬件信息整合成一张表格,写到内存中,也就是所谓的SMBIOS(System Management BIOS),若错误则用默认的值取代CMOS提供的资料。SMBIOS扮演的主要角色是将主板或X86架构的系统通过BIOS呈现在用户面前。通过dmidecode命令可以查看该表格,其中有许多Type,每个Type代表一类信息,可以在dmidecode的man page中找到相关定义。
当计算机电源开关被按下时,电源就开始向主板和其它设备供电,此时电压还不稳定,主板控制芯片组(北桥芯片)会向CPU发出一个Reset信号,让CPU复位初始化。当电源开始稳定供电后,芯片组便撤去Reset信号,CPU马上开始从地址FFFF0H处执行指令,这个地址在“系统BIOS”的地址范围内,放在这里的一般是一个跳转指令,跳到系统BIOS的真正开始代码处。
从主机上电到加载bootloader这个过程中,系统BIOS主要经历了三个阶段:Pown On ,POST ,加载bootloader .
Pown On 阶段 这一阶段从上电开始到屏幕出现信息结束,也就是所谓的激活电源阶段。这一阶段的主要任务是校验CMOS中的内容是否正确、检查主机上某些硬件的状态以确定下一步的自检,因此,用户无法在屏幕上看到BIOS信息(要等硬件确认后才激活VGA) ,若这个阶段出现错误一般都是致命的(通常为黑屏),只能通过喇叭声来判断错误类型。这个阶段只是检查系统上都有哪些设备,并不初始化。
POST(power on self test)阶段 检查一些关键设备如内存、显卡能否正常工作,并提供简易的内存测试,只要测试没问题,就在屏幕上显示该硬件的基本信息。这个阶段的基本过程如下:系统BIOS查找显卡的BIOS,存放显卡BIOS的ROM芯片的起始地址通常在C0000H处,然后调用其初始化代码,由显卡的BIOS完成显卡的初始化,然后屏幕就可以显示信息了,大多数的显卡会在这时显示显卡的一些信息,但是通常只是一闪而过。依次类推,系统BIOS调用在前一个阶段找到的设备的BIOS代码,以完成相应设备的初始化。查完其它所有设备后,BIOS将显示自己的启动画面,接着检查CPU的类型和工作频率、主机的内存容量,然后系统BIOS开始测试和配置系统中安装的一些标准硬件设备如硬盘、光驱、COM口、并口等,然后BIOS开始检查并配置系统中的即插即用设备。开机时和开机后所有需要用到的设备都是在这个阶段被激活的。
加载bootloader阶段 当所有的硬件都检测完毕并没有问题后,BIOS退居幕后的办法是将加载OS的主控权交给硬盘的主引导扇区MBR即硬盘的物理扇区0柱0面1扇区上的内容,让藏匿于此的开机管理程序(bootloader)将指针带到系统核心的地方。linux常见的开机管理程序为Grub.(以后会分享grub的配置及除错方法^_^)
综上,系统激活流程为:打开电源开关—CPU初始化—BIOS激活—读取并校验CMOS资料、检测硬件状态(此时BIOS代码在flash memo中运行)—生成SMBIOS表格—检测、配置并初始化各硬件—加载bootloader 。
另外查看系统BIOS信息的命令主要有两个:dmidecode 和 biosdecode .它们可以显示cpu 、内存、主板型号、OEM信息、主板插槽等信息,这些信息对于查看系统硬件配置非常有用。