當(dāng)我們按了開(kāi)機(jī)鍵,發(fā)生了什么克蚂?

作為一名軟件開(kāi)發(fā)工程師闺鲸,似乎很少去關(guān)注這樣偏硬件問(wèn)題。相比于在瀏覽器中輸入網(wǎng)址之后發(fā)生了什么埃叭?而言摸恍,當(dāng)我們按了開(kāi)機(jī)鍵發(fā)生了什么更加偏向于硬件。昨天和一個(gè)清華畢業(yè)的CTO(膜拜)交流的時(shí)候赤屋,他向我問(wèn)了這個(gè)問(wèn)題立镶,當(dāng)時(shí)答得不是很完整,顧在這里做個(gè)總結(jié)类早。

在瀏覽器中輸入網(wǎng)址之后發(fā)生了什么媚媒?

從輸入 URL 到頁(yè)面加載完成的過(guò)程中都發(fā)生了什么事情?

在瀏覽器地址欄輸入一個(gè)URL后回車涩僻,背后會(huì)進(jìn)行哪些技術(shù)步驟欣范?

當(dāng)我們按了開(kāi)機(jī)鍵变泄,發(fā)生了什么?

下面分幾個(gè)部分介紹:

  • 1.PC
  • 2.Andriod
  • 3.iPhone(暫時(shí)還未找到相關(guān)資料恼琼》劣迹可以和PC,Andriod類比)

PC

簡(jiǎn)單來(lái)說(shuō)分為下面幾個(gè)步驟:

  • 1.按下開(kāi)機(jī)鍵,告訴PC打開(kāi)電源
  • 2.當(dāng)電源打開(kāi)后晴竞,PC做的第一件事情就是CPU從內(nèi)置的芯片中加載一個(gè)最簡(jiǎn)單程序蛙卤,這個(gè)程序叫做BIOS(基本輸入輸出系統(tǒng))。
  • 3.BIOS程序啟動(dòng)后就會(huì)檢測(cè)硬件設(shè)備噩死,比如顯卡颤难,內(nèi)存,
  • 4.CPU從硬盤上加載操作系統(tǒng)(Windows/MacOS/Linux已维。
  • 5.完成啟動(dòng)過(guò)程

如果想更為深入的了解行嗤。那需要了解計(jì)算機(jī)的組成

  • PSU(power supply unit):電源提供單元,提供PC所有部分的電源垛耳,通常像一個(gè)金屬盒子安裝在主機(jī)的前后和電線連接下一起栅屏。PC所有的電源都由這里供給。
  • Motherboard:主機(jī)板Motherboard或是Mainboard是計(jì)算機(jī)最主要的電路板堂鲜,上面裝著計(jì)算機(jī)系統(tǒng)的主要電子組件如CPU栈雳、芯片組、內(nèi)存插槽缔莲,及鍵盤哥纫、I/O、磁盤驅(qū)動(dòng)器等的控制器痴奏。并從PSU獲得電源
  • CPU:中央處理器蛀骇,處理邏輯運(yùn)算的地方,通過(guò)插槽嵌在主板中读拆。
  • RAM: 隨機(jī)存儲(chǔ)器擅憔,其實(shí)就是內(nèi)存。
  • Hard Drives:硬盤
  • Northbridge:北橋:一般位于主板上離CPU插槽較進(jìn)的地方建椰。一般來(lái)說(shuō)雕欺,芯片組的名稱就是以北橋芯片的名稱來(lái)命名的,北橋芯片負(fù)責(zé)與CPU的聯(lián)系并控制內(nèi)存棉姐、PCI-E數(shù)據(jù)在北橋內(nèi)部傳輸屠列,提供對(duì)CPU的類型和主頻、系統(tǒng)的前端總線頻率伞矩、內(nèi)存的類型(SDRAM笛洛,DDR、DDR2乃坤、DDR3苛让、以及RDRAM等等)和最大容量沟蔑、AGP/PCI-E插槽、ECC糾錯(cuò)等支持狱杰,整合型芯片組的北橋芯片還集成了顯示核心瘦材。
  • Southbridge:南橋:一般位于主板上離CPU插槽較遠(yuǎn)的下方,PCI插槽的附近仿畸,這種布局是考慮到它所連接的I/O總線較多食棕,離處理器遠(yuǎn)一點(diǎn)有利于布線。相對(duì)于北橋芯片來(lái)說(shuō)错沽,其數(shù)據(jù)處理量并不算大簿晓,所以南橋芯片一般都沒(méi)有覆蓋散熱片。南橋芯片不與處理器直接相連千埃,而是通過(guò)一定的方式(不同廠商各種芯片組有所不同憔儿,例如英特爾的英特爾Hub Architecture以及SIS的Multi-Threaded“妙渠”)與北橋芯片相連。南橋芯片主要是負(fù)責(zé)I/O接口等一些外設(shè)接口的控制放可、IDE設(shè)備的控制及附加功能等等谒臼。
  • BIOS:基本輸入輸出系統(tǒng):包含了最為基本的啟動(dòng)代碼,集成在主板上的一個(gè)內(nèi)存芯片吴侦,和南橋相連屋休。這就解釋為為什么所有的程序軟件包括操作系統(tǒng)都是運(yùn)行在內(nèi)存中的坞古,然而我們的操作系統(tǒng)一般是存放在硬盤上的备韧,當(dāng)我們按下開(kāi)機(jī)鍵的時(shí)候,此時(shí)內(nèi)存中什么程序也沒(méi)有痪枫,后來(lái)居然操作系統(tǒng)能夠被加載的原因织堂。完成將操作系統(tǒng)加載到內(nèi)存中,這就是BIOS的任務(wù)奶陈。

所有真真發(fā)生了什么呢易阳?這個(gè)問(wèn)題真的有點(diǎn)復(fù)雜。詳細(xì)內(nèi)容可以看看What are the steps in the process of a PC start-up after pressing the power on?

  1. You push the power button. This power button is a simply a contact switch connected to the motherboard.
  2. That contact switch is connected to a circuit on the motherboard that activates the PSU's "power on" input. Physically, that's the thin green wire in the big bundle of wires between the motherboard and the PSU. Pushing the button activates a circuit in the motherboard that shorts that wire to ground (all the black wires) and latches it, so that the power remains on even when you remove your finger from the button. The circuit on the motherboard also does one other thing - when the power is already on, pushing the button again doesn't kill the power, instead a signal is sent to the Southbridge as an IRQ to signal to the OS to shut down safely. Only when the OS is finished shutting down does it automatically cut the power. However, holding the button for three seconds causes the circuit to override this behaviour, and kill the power directly.
  3. When the PSU detects a power-on signal, it turns on and starts supplying power to all the components. All the fans spin up, and the hard drives turn on, this is why you hear all the whirring when you push the power button.
  4. The first thing that happens at power on, is the CPU starts executing the program stored in the BIOS chip's memory (if you want details of how this works, refer to how CPUs work in general, but the gist is: the CPU sends out the memory address that corresponds to the BIOS to the Northbridge, which routes it to the Southbridge, which then signals the BIOS chipt to deliver the data contained in that memory, and that data works its way back up to the CPU, were it is executed). This program contains the routines for the CPU to be able to detect and access the drives (including boot from USB, boot from CD, etc.), how to load up the OS, basic keyboard inputs, other self-testing routines like POST, and also other similar memory like the network boot ROM.
  5. When the BIOS program is done with all the self-testing and is ready to boot, it scans all the drives that it knows how to access for a valid bootloader. On most Windows computers you don't see the bootloader unless you hit the F8 key when booting (you'll be presented with various booting options). On Linux machines, you'll see GRUB or LILO, or one of the other common bootloaders. These are small piece of software that allows the CPU to begin loading the OS program, and gives any special start-up conditions/configurations to the OS to use when booting up (e.g. Windows has stuff like "safe mode", Linux has a plethora of options).
  6. The CPU is now set up to begin loading the OS from the boot drive (again, what this means is that the CPU sends out the address of the data that it wants, the Northbridge and Southbridge routes that address to the device in question, and the device produces the data, which is then routed back into the CPU where it is executed (or loaded into the RAM where it's stored for later execution)).

BIOS程序怎么啟動(dòng)

  • CS:代碼段寄存器吃粒,存在于CPU中潦俺,指向CPU當(dāng)前執(zhí)行代碼在內(nèi)存中所在的區(qū)域。
  • IP:指令寄存器徐勃,存在于CPU中事示,記錄將要執(zhí)行的指令在代碼段內(nèi)的偏移地址,與CS組合即為將要執(zhí)行的指令的內(nèi)存地址僻肖。

BIOS的啟動(dòng)肖爵,是由硬件完成的,Intel 80x86
系列的cpu的硬件都設(shè)計(jì)為加電(即開(kāi)機(jī)瞬間)就進(jìn)入16位實(shí)模式狀態(tài)運(yùn)行臀脏,此時(shí)將cpu的硬件邏輯設(shè)計(jì)為強(qiáng)行將CS的值設(shè)置為0xFFFF,IP的值設(shè)置為0x0000劝堪,這樣CS:IP就指向了0xFFFF0這個(gè)位置冀自,而這個(gè)位置就是BIOS程序的入口地址。因此這是一個(gè)硬件廠商之間的約定秒啦,所有的BIOS程序入口地址均為0xFFFF0熬粗,這樣在開(kāi)機(jī)的時(shí)候,就找到這個(gè)地址余境,如果該地址并沒(méi)有代碼段荐糜,那么計(jì)算機(jī)將會(huì)死機(jī),如果這個(gè)地址處有代碼段葛超,將會(huì)執(zhí)行這個(gè)代碼段暴氏,并由此執(zhí)行下去,即BIOS程序開(kāi)始啟動(dòng)绣张。

操作系統(tǒng)如何從硬盤加載

當(dāng)BIOS程序啟動(dòng)時(shí)答渔,就會(huì)檢測(cè)硬件設(shè)備,比如我們的顯卡侥涵、內(nèi)存等信息沼撕。BIOS會(huì)在內(nèi)存中建立中斷向量表和中斷服務(wù)程序。中斷向量表中有256個(gè)中斷向量芜飘,每個(gè)中斷向量占4個(gè)字節(jié)务豺,每個(gè)中斷向量指向一個(gè)中斷服務(wù)程序,這些中斷服務(wù)程序完成了將操作系統(tǒng)由硬盤加載到內(nèi)存中的任務(wù)嗦明。

具體來(lái)講就是計(jì)算機(jī)硬件體系會(huì)與BIOS聯(lián)合操作笼沥,讓cpu接收到一個(gè)int 0x19中斷,cpu接收到這個(gè)中斷后娶牌,會(huì)立即在中斷向量表中找到int 0x19中斷向量奔浅,此時(shí)會(huì)找到對(duì)應(yīng)的中斷服務(wù)程序,并由該中斷服務(wù)程序?qū)⒂脖P中第一個(gè)扇區(qū)的引導(dǎo)程序加在到內(nèi)存中的指定位置诗良。隨后汹桦,在引導(dǎo)程序的作用下,陸續(xù)將操作系統(tǒng)的其他程序載入內(nèi)存鉴裹,完成實(shí)模式到保護(hù)模式的轉(zhuǎn)變舞骆,為執(zhí)行操作系統(tǒng)的入口函數(shù)main做準(zhǔn)備,后面就是操作系統(tǒng)的初始化工作了径荔,最后完成計(jì)算機(jī)的啟動(dòng)督禽。

Android

由于Android是開(kāi)源的,所以比較容易分析猖凛。網(wǎng)上也有比較全面的文章介紹赂蠢。直接給出幾個(gè)鏈接,有興趣的可以看看辨泳。

http://blog.chinaunix.net/uid-26569496-id-3891554.html

http://www.reibang.com/p/b4aab68c12c0

http://gityuan.com/2016/01/30/android-boot/

要點(diǎn):

PC中的BIOS程序虱岂。取而代之的是Bootloader——系統(tǒng)啟動(dòng)加載器玖院。它類似于BIOS,在系統(tǒng)加載前第岖,用以初始化硬件設(shè)備难菌,建立內(nèi)存空間的映像圖,為最終調(diào)用系統(tǒng)內(nèi)核準(zhǔn)備好環(huán)境蔑滓。

PC中硬盤郊酒,取而代之的是ROM,它類似于硬盤存放操作系統(tǒng)键袱,用戶程序等燎窘。ROM跟硬盤一樣也會(huì)劃分為不同的區(qū)域,用于放置不同的程序蹄咖,在Android中主要?jiǎng)澐譃橐幌聨讉€(gè)分區(qū):

/boot:存放引導(dǎo)程序褐健,包括內(nèi)核和內(nèi)存操作程序
/system:相當(dāng)于電腦c盤,存放Android系統(tǒng)及系統(tǒng)應(yīng)用
/recovery:恢復(fù)分區(qū)澜汤,可以進(jìn)入該分區(qū)進(jìn)行系統(tǒng)恢復(fù)
/data:用戶數(shù)據(jù)區(qū)蚜迅,包含了用戶的數(shù)據(jù):聯(lián)系人、短信俊抵、設(shè)置谁不、用戶安裝的程序
/cache:安卓系統(tǒng)緩存區(qū),保存系統(tǒng)最常訪問(wèn)的數(shù)據(jù)和應(yīng)用程序
/misc:包含一些雜項(xiàng)內(nèi)容徽诲,如系統(tǒng)設(shè)置和系統(tǒng)功能啟用禁用設(shè)置
/sdcard:用戶自己的存儲(chǔ)區(qū)刹帕,可以存放照片,音樂(lè)馏段,視頻等文件

加載Bootloader程序(類比加載BIOS)

cpu會(huì)從cpu制造廠商預(yù)設(shè)的地址上取指令轩拨,這個(gè)地址是各廠商約定俗稱的践瓷,類似于上面80x86架構(gòu)里的0xFFFF0地址院喜,因此Android手機(jī)會(huì)將固態(tài)存儲(chǔ)設(shè)備ROM預(yù)先映射到該地址上,當(dāng)開(kāi)機(jī)加電的時(shí)候晕翠,cpu就會(huì)從該地址執(zhí)行/boot分區(qū)下的Bootloader程序喷舀,載入linux內(nèi)核到RAM中。

Zygote fork

當(dāng)linux內(nèi)核啟動(dòng)后會(huì)初始化各種軟硬件環(huán)境淋肾,加載驅(qū)動(dòng)程序硫麻,掛載根文件系統(tǒng),并開(kāi)始執(zhí)行根文件系統(tǒng)的init程序樊卓,init程序是Android啟動(dòng)過(guò)程中最重要的核心程序拿愧。init進(jìn)程會(huì)啟動(dòng)各種系統(tǒng)本地服務(wù),如:Media Server碌尔、Service Manager浇辜、bootanim(開(kāi)機(jī)動(dòng)畫(huà))等券敌。init進(jìn)程會(huì)在解析init.rc文件后fork出Zygote,而Zygote是所有Java進(jìn)程的父進(jìn)程柳洋,我們的App都是由Zygote fork出來(lái)的待诅。

Zygote進(jìn)程主要包含:

加載ZygoteInit類,注冊(cè)Zygote Socket服務(wù)端套接字熊镣;
加載虛擬機(jī)卑雁;
預(yù)加載Android核心類
預(yù)加載系統(tǒng)資源
隨后Zygote進(jìn)程會(huì)fork出System Server進(jìn)程,System Server進(jìn)程負(fù)責(zé)啟動(dòng)和管理整個(gè)framework绪囱,包括Activity Manager测蹲,PowerManager等服務(wù)。

當(dāng)System Server將系統(tǒng)服務(wù)啟動(dòng)就緒后鬼吵,就會(huì)通知ActivityManager啟動(dòng)首個(gè)Android程序Home即我們看到的桌面程序弛房。

iPhone

暫時(shí)沒(méi)有找到介紹這方面的資料。蘋果封閉的生態(tài)而柑,我們只要靠猜文捶。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市媒咳,隨后出現(xiàn)的幾起案子粹排,更是在濱河造成了極大的恐慌,老刑警劉巖涩澡,帶你破解...
    沈念sama閱讀 217,907評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件顽耳,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡妙同,警方通過(guò)查閱死者的電腦和手機(jī)射富,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)粥帚,“玉大人胰耗,你說(shuō)我怎么就攤上這事∶⑽校” “怎么了柴灯?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,298評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)费尽。 經(jīng)常有香客問(wèn)我赠群,道長(zhǎng),這世上最難降的妖魔是什么旱幼? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,586評(píng)論 1 293
  • 正文 為了忘掉前任查描,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘冬三。我一直安慰自己鸯两,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布长豁。 她就那樣靜靜地躺著钧唐,像睡著了一般。 火紅的嫁衣襯著肌膚如雪匠襟。 梳的紋絲不亂的頭發(fā)上钝侠,一...
    開(kāi)封第一講書(shū)人閱讀 51,488評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音酸舍,去河邊找鬼帅韧。 笑死,一個(gè)胖子當(dāng)著我的面吹牛啃勉,可吹牛的內(nèi)容都是我干的忽舟。 我是一名探鬼主播,決...
    沈念sama閱讀 40,275評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼淮阐,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼叮阅!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起泣特,我...
    開(kāi)封第一講書(shū)人閱讀 39,176評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤浩姥,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后状您,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體勒叠,經(jīng)...
    沈念sama閱讀 45,619評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評(píng)論 3 336
  • 正文 我和宋清朗相戀三年膏孟,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了眯分。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,932評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡柒桑,死狀恐怖弊决,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情幕垦,我是刑警寧澤丢氢,帶...
    沈念sama閱讀 35,655評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站先改,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏蒸走。R本人自食惡果不足惜仇奶,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧该溯,春花似錦岛抄、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,871評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至氯庆,卻和暖如春蹭秋,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背堤撵。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,994評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工仁讨, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人实昨。 一個(gè)月前我還...
    沈念sama閱讀 48,095評(píng)論 3 370
  • 正文 我出身青樓洞豁,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親荒给。 傳聞我的和親對(duì)象是個(gè)殘疾皇子丈挟,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 我轉(zhuǎn)身問(wèn)后面的綠衣小兄弟:“你們誰(shuí)帶弓了?” “楊大哥志电,我們都是習(xí)武之人礁哄,平時(shí)不用弓箭這種兵器∠保” 他們還真把我當(dāng)...
    鵬程九萬(wàn)里閱讀 301評(píng)論 0 0
  • morning 十二月的晨 今天將要搭火車去見(jiàn)一位多年未見(jiàn)的老友 略微有些緊張 更多的是期待 想象著 會(huì)有怎樣的畫(huà)...
    黑夢(mèng)Fay閱讀 231評(píng)論 0 1
  • 向生活學(xué)習(xí)烁竭,人總是要長(zhǎng)大的,給你什么角色吉挣,就演好什么戲份
    只是形式閱讀 134評(píng)論 0 0