[轉載請註明出處] http://kezeodsnx.pixnet.net/blog
作者: kezeodsnx
引言
快速開機最近炒的很熱,先不論其是否是一個必需品,能了解系統開機流程就是好事一件啦。看了蠻多有關快速開機的東西,一開始是EPC的12秒開機 (x86),再來是Mobli的5秒開機 (不含BIOS),到最近在arm平台上面,快速開機似乎已經是linux在跟windows,或是linux netbook品牌之間的一個比較選項。不過在定義上要先說清楚,所謂的開機時間,是指按下power button至看到desktop (launcher)的時間,常常與系統可用有些區別。再來,快速開機是很講究硬體的,同一個方法不一定另在另一台機器上可以複製同樣的效果。
分段
整個開機流程可依其特性,約略分成四個部分:
BIOS: 這是指在kernel取得控制權之前所有的時間,包括硬體自我測試,尋找loader等。在arm平台上,是所謂的bootloader。
Kernel:包括ramdisk,hardware initialize,load driver等,在切到userspace之前所需的時間。
Early boot:從mount rootfs開始,由/sbin/init切到userspace後,並進行一連串service的initialize
GUI:主要是Xserver以及launcher
BIOS
傳統的bios一定是在storage的MBR上(第0軌)intel在2000年提出EFI架構,試圖取代傳統(legacy)的bios。主要的不同點為EFI有所謂的filesystem,因此不需要MBR,還可做到一些legacy bios做不到的事,這部份可先參考這裡。 從功能來看。有一部份是在對硬體做偵測,對一個暨定的硬體來說,每次都做一樣的事並沒有太大的意義。EPC的bios有一個bootbooster的東西,使用了一個id為ef,system為EFI的partition,這個與intel的EFI應該是兩件事,只是利用了EFI這個名字。有了這個partition,並打開bootbooster,bios就會將POST的資料寫入,將來再開機時,就讀取這個partition,不再執行post。測試結果有開跟沒開bootbooster的時間分別是12與28秒。真正的EFI bios還沒看過,也不知道目前的發展是如何。
而arm的bootloader,也是需要做類似初始化硬體的工作,然後將控制權交給kernel,不知道是否有類似epc bios的方法。
KERNEL
Ramdisk
ramdisk存在的意義,是讓不同的硬體都可以順利的完成開機。既然目標是暨定的硬體,就把ramdisk拿掉吧。(potential 5s)
用了ramdisk,要知道initramfs需要load兩次,一次是bootloader,一次是kernel。
Kernel
kernel在開機階段需要解壓縮,這意味著愈大的kernel需時愈久,但load driver/module也是需要時間呀,也不能都是kernel module吧。因此再次回到一開始說的,快速開機是很講究硬體的。必須了解自己的硬體,把不必要的driver拿掉,讓kernel盡量瘦身,這件事頗具技術性。
在init/initramfs.c的populate_rootfs有一段檢查是否為initramfs的code,如果沒用ramdisk,當然可以拿掉。(potential 0.5 sec)
Driver
driver/module部份,目前比較多人討論的是arjan的asyn function call,之前是屬於intel moblin的一部份。個人的研究結果如下:
導入一個新的initcall level: 6a。initcall用來initialize 各種subsystem,其中level 6a用來initialize devices。此level 的initcall (可能是acpi, raid, usb)在系統空閒時,才做initialize。6a 有自己的work queue,如果是呼叫module_init_async (instead of module_init),就會放到此queue中等待cpu。
level 0~5 6a after 6a
|-----------|----|------------|
phase 0 1 2
arjan的patch對一些比較慢的device做了調整,如usb controller (drivers/usb/host/ehci-hcd.c,drivers/usb/host/ohci-hcd.c,drivers/usb/host/uhci-hcd.c),還有像acpi driver (drivers/acpi/battery.c,drivers/acpi/button.c,drivers/acpi/thermal.c),可視需求將其放到6a (module_init_async)。其他還有一些針對RAID的patch。kernel 2.6.30預計是會將這個東西導入的。
Other
message的產生是一種I/O的行為,也就是慢的意思,就...拿掉吧!
disable console: 拿掉開機時console的message。
kernel config: disable 裡的debug filesystem 和printk。disable CONFIG_CC_OPTIMIZE_FOR_SIZE
compilier: 使用更有效率(新版)的compiler
filesystem:使用較快的filesystem,詳細的比較請看這裡。
Early boot
RC script: RC script裡可能有些不必要的operation,可以個別做調整。不需要的service可以拿掉。
Parallel RC script: 在/etc/init.d/rc設定shell=concurrency可以讓RC script平行執行,不過要控制好dependency的問題。
/sbin/init: 使用客制化的finit,更精確的控制init所需完成的事。
GUI
Xserver: Xserver花了一些時間在偵測/等待input device,如src/mouse.c: InitMouseHW()和src/pnp.c: ps2GetDeviceID()裡都有一些'usleep(30000),詳情請見fred的文章。
desktop: 使用light weight的桌面系統,如xfce,lxde,甚至不要用.................
其他
最近也流行arm平台的netbook,可以做到非常省電。理想上,用suspend/resume來取代boot/shutdown。不是不好,只是這樣的話,做fastboot要幹麻...
留言列表