回覆列表
  • 1 # 半夏時光在路上

    計算機的啟動過程可分成四個階段。

    一、第一階段:BIOS

    上個世紀70年代初,”只讀記憶體”(read-only memory,縮寫為ROM)發明,開機程式被刷入ROM晶片,計算機通電後,第一件事就是讀取它。

    這塊晶片裡的程式叫做”基本輸出輸入系統”(Basic Input/Output System),簡稱為BIOS。

    1.1 硬體自檢

    BIOS中主要存放的程式包括:自診斷程式(透過讀取CMOS RAM中的內容識別硬體配置,並對其進行自檢和初始化)、CMOS設定程式(引導過程中,透過特殊熱鍵啟動,進行設定後,存入CMOS RAM中)、系統自動裝載程式(在系統自檢成功後,將磁碟相對0道0扇區上的載入程式裝入記憶體使其執行)和主要I/O驅動程式和中斷服務(BIOS和硬體直接打交道,需要載入I/O驅動程式)。

    BIOS程式首先檢查,計算機硬體能否滿足執行的基本條件,這叫做”硬體自檢”(Power-On Self-Test),縮寫為POST。

    如果硬體出現問題,主機板會發出不同含義的蜂鳴,啟動中止。如果沒有問題,螢幕就會顯示出CPU、記憶體、硬碟等資訊。

    1.2 啟動順序

    硬體自檢完成後,BIOS把控制權轉交給下一階段的啟動程式。

    這時,BIOS需要知道,”下一階段的啟動程式”具體存放在哪一個裝置。也就是說,BIOS需要有一個外部儲存裝置的排序,排在前面的裝置就是優先轉交控制權的裝置。這種排序叫做”啟動順序”(Boot Sequence)。

    開啟BIOS的操作介面,裡面有一項就是”設定啟動順序”。

    二、第二階段:主引導記錄

    BIOS按照”啟動順序”,把控制權轉交給排在第一位的儲存裝置。即根據使用者指定的引導順序從軟盤、硬碟或是可移動裝置中讀取啟動裝置的MBR,並放入指定的位置(0x7c000)記憶體中。

    這時,計算機讀取該裝置的第一個扇區,也就是讀取最前面的512個位元組。如果這512個位元組的最後兩個位元組是0x55和0xAA,表明這個裝置可以用於啟動;如果不是,表明裝置不能用於啟動,控制權於是被轉交給”啟動順序”中的下一個裝置。

    這最前面的512個位元組,就叫做”主引導記錄”(Master boot record,縮寫為MBR)。

    2.1 主引導記錄的結構

    “主引導記錄”只有512個位元組,放不了太多東西。它的主要作用是,告訴計算機到硬碟的哪一個位置去找作業系統。

    主引導記錄由三個部分組成:

    其中,第二部分”分割槽表”的作用,是將硬碟分成若干個區。

    2.2 分割槽表

    硬碟分割槽有很多好處。考慮到每個區可以安裝不同的作業系統,”主引導記錄”因此必須知道將控制權轉交給哪個區。

    分割槽表的長度只有64個位元組,裡面又分成四項,每項16個位元組。所以,一個硬碟最多隻能分四個一級分割槽,又叫做”主分割槽”。

    每個主分割槽的16個位元組,由6個部分組成:

    最後的四個位元組(”主分割槽的扇區總數”),決定了這個主分割槽的長度。也就是說,一個主分割槽的扇區總數最多不超過2的32次方。

    如果每個扇區為512個位元組,就意味著單個分割槽最大不超過2TB。再考慮到扇區的邏輯地址也是32位,所以單個硬碟可利用的空間最大也不超過2TB。如果想使用更大的硬碟,只有2個方法:一是提高每個扇區的位元組數,二是增加扇區總數。

    三、第三階段:硬碟啟動

    這時,計算機的控制權就要轉交給硬碟的某個分割槽了,這裡又分成三種情況。

    3.1 情況A:卷引導記錄

    上一節提到,四個主分割槽裡面,只有一個是啟用的。計算機會讀取啟用分割槽的第一個扇區,叫做”卷引導記錄”(Volume boot record,縮寫為VBR)。

    “卷引導記錄”的主要作用是,告訴計算機,作業系統在這個分割槽裡的位置。然後,計算機就會載入作業系統了。

    3.2 情況B:擴充套件分割槽和邏輯分割槽

    隨著硬碟越來越大,四個主分割槽已經不夠了,需要更多的分割槽。但是,分割槽表只有四項,因此規定有且僅有一個區可以被定義成”擴充套件分割槽”(Extended partition)。

    所謂”擴充套件分割槽”,就是指這個區裡面又分成多個區。這種分割槽裡面的分割槽,就叫做”邏輯分割槽”(logical partition)。

    計算機先讀取擴充套件分割槽的第一個扇區,叫做”擴充套件引導記錄”(Extended boot record,縮寫為EBR)。它裡面也包含一張64位元組的分割槽表,但是最多隻有兩項(也就是兩個邏輯分割槽)。

    計算機接著讀取第二個邏輯分割槽的第一個扇區,再從裡面的分割槽表中找到第三個邏輯分割槽的位置,以此類推,直到某個邏輯分割槽的分割槽表只包含它自身為止(即只有一個分割槽項)。因此,擴充套件分割槽可以包含無數個邏輯分割槽。

    但是,似乎很少透過這種方式啟動作業系統。如果作業系統確實安裝在擴充套件分割槽,一般採用下一種方式啟動。

    3.3 情況C:啟動管理器

    在這種情況下,計算機讀取”主引導記錄”前面446位元組的機器碼之後,不再把控制權轉交給某一個分割槽,而是執行事先安裝的”啟動管理器”(boot loader),由使用者選擇啟動哪一個作業系統。

    Linux環境中,目前最流行的啟動管理器是Grub。

    對於grub而言,在MBR中的446位元組的載入程式屬於GRUB的開始執行程式,透過這段程式,進一步執行stage1.5或是stage2的執行程式,將在下面詳細介紹執行過程。

    其中stage1.5或是stage2便屬於階段2引導的過程了,stage2過程也是作為GRUB kernel的核心程式碼出現。Stage1.5過程(對於GRUB而言存在stage1.5,GRUB2則不存在)的功能很單一,主要就是為了引導stage2過程服務。由於stage2過程的程式碼存放在檔案系統下的boot分割槽目錄中,因此stage1.5過程就是需要提供一個檔案系統的環境,而該檔案系統環境需要保證系統可以找到stage2過程的檔案,那麼stage1.5階段提供的檔案系統需要是boot檔案系統所對應的,這個在執行grub install過程中就已經確定了。stage2過程中,主要會把系統切換到保護模式,設定好C執行時環境,找到config檔案(事實上就是menulist檔案),如果沒有找到就執行一個shell,等待使用者的執行。然後的工作就變成了輸入命令->解析命令->執行命令的迴圈中。當然該階段引導的最終狀態就是執行boot命令,將核心和initrd映象載入進入記憶體中,進而將控制權轉交給核心。

    四、第四階段:作業系統

    控制權轉交給作業系統後,作業系統的核心首先被載入記憶體。

    以linux系統為例,先載入/boot目錄下面的kernel。核心載入成功後,第一個執行的程式是/sbin/init。它根據配置檔案(Debian系統是/etc/initab)產生init程序。這是Linux啟動後的第一個程序,pid程序編號為1,其他程序都是它的後代。

    然後,init執行緒載入系統的各個模組,比如視窗程式和網路程式,直至執行/bin/login程式,跳出登入介面,等待使用者輸入使用者名稱和密碼。

    至此,全部啟動過程完成。

    以下補充部分細節:

    BIOS啟動細節:

    a) 按下電源開關,電源就開始向主機板和其它裝置供電;當晶片組檢測到電源已經開始穩定供電了(當然從不穩定到穩定的過程只是一瞬間的事情),它便撤去RESET訊號(如果是手工按下計算機面板上的Reset按鈕來重啟機器,那麼鬆開該按鈕時晶片組就會撤去RESET訊號);CPU馬上就從地址FFFF:0000H 處開始執行指令,放在這裡的只是一條跳轉指令,跳到系統BIOS中真正的啟動程式碼處。

    b) 系統BIOS的啟動程式碼首先進行POST(Power-On Self Test,加電後自檢)。POST的主要檢測系統中一些關鍵裝置是否存在和能否正常工作,例如記憶體和顯示卡等裝置;由於POST是最早進行的檢測過程,此時顯示卡還沒有初始化,如果系統BIOS在進行POST的過程中發現了一些致命錯誤,例如沒有找到記憶體或者記憶體有問題(此時只會檢查640K常規記憶體),那麼系統BIOS就會直接控制喇叭發聲來報告錯誤,聲音的長短和次數代表了錯誤的型別;在正常情況下,POST過程進行得非常快,幾乎無法感覺到它的存在。POST結束之後就會呼叫其它程式碼來進行更完整的硬體檢測。

    c) 接下來系統BIOS將查詢顯示卡的BIOS。前面說過,存放顯示卡BIOS的ROM晶片的起始地址通常設在C0000H處,系統BIOS在這個地方找到顯示卡BIOS之後就呼叫它的初始化程式碼,由顯示卡BIOS來初始化顯示卡。此時多數顯示卡都會在螢幕上顯示出一些初始化資訊,介紹生產廠商、圖形晶片型別等內容,不過這個畫面幾乎是一閃而過。系統BIOS接著會查詢其它裝置的BIOS程式,找到之後同樣要呼叫這些BIOS內部的初始化程式碼來初始化相關的裝置。

    d) 查詢完所有其它裝置的BIOS之後,系統BIOS將顯示出它自己的啟動畫面,其中包括有系統BIOS的型別、序列號和版本號等內容。

    e) 接著系統BIOS將檢測和顯示CPU的型別和工作頻率,測試所有的RAM,並同時在螢幕上顯示記憶體測試的進度。可以在CMOS設定中自行決定使用簡單耗時少或者詳細耗時多的測試方式。

    f) 記憶體測試透過之後,系統BIOS將開始檢測系統中安裝的一些標準硬體裝置,包括硬碟、CD-ROM、串列埠、並口和軟碟機等裝置,另外絕大多數較新版本的系統BIOS在這一過程中還要自動檢測和設定記憶體的定時引數、硬碟引數和訪問模式等。

    g) 標準裝置檢測完畢後,系統BIOS內部支援即插即用的程式碼將開始檢測和配置系統中安裝的即插即用裝置。每找到一個裝置之後,系統BIOS都會在螢幕上顯示出裝置的名稱和型號等資訊,同時為該裝置分配中斷、DMA通道和I/O埠等資源。

    h) 到這一步為止,所有硬體都已經檢測配置完畢了,多數系統BIOS會重新清屏並在螢幕上方顯示出一個表格,其中概略地列出了系統中安裝的各種標準硬體裝置,以及它們使用的資源和一些相關工作引數。

    i) 接下來系統BIOS將更新ESCD(Extended System Configuration Data,擴充套件系統配置資料)。ESCD是系統BIOS用來與作業系統交換硬體配置資訊的一種手段,這些資料被存放在CMOS(一小塊特殊的RAM,由主機板上的電池來供電)之中。通常ESCD資料只在系統硬體配置發生改變後才會更新,所以不是每次啟動機器時都能夠看到“Update ESCD… Success”這樣的資訊。不過,某些主機板的系統BIOS在儲存ESCD資料時使用了與Windows 9x不相同的資料格式,於是Windows 9x在它自己的啟動過程中會把ESCD資料修改成自己的格式。但在下一次啟動機器時,即使硬體配置沒有發生改變,系統BIOS也會把ESCD的資料格式改回來。如此迴圈,將會導致在每次啟動機器時,系統BIOS都要更新一遍ESCD,這就是為什麼有些機器在每次啟動時都會顯示出相關資訊的原因。

    j) ESCD更新完畢後,系統BIOS的啟動程式碼將進行它的最後一項工作:即根據使用者指定的啟動順序從軟盤、硬碟或光碟機啟動MBR。在這個過程中會按照啟動順序順序比較其放置MBR的位置的結尾兩位是否為0xAA55,透過這種方式判斷從哪個引導裝置進行引導。在確定之後,將該引導裝置的MBR內容讀入到0x7C00[1]的位置,並再次判斷其最後兩位,當檢測正確之後,進行階段1的引導。

    EFI啟動細節

    與傳統MBR相比,GPT採用了不同的分割槽方式。

    對於傳統MBR,其結構主要如下:

    上圖即對上文中所述的很形象的說明,在圖中看到MBR被分成三個部分,分別是:Bootloader、分別表以及Magic Number。其中Bootloader部分為stage1中被執行的起始部分。

    相反,對於EFI系統中所採用的GPT分割槽方式,則採用了不同於MBR分割槽方式的形式,從下圖中可以發現:

    如上圖所示,GPT分割槽表主要包括:保護MBR、首要GPT頭、首要GPT、備用GPT、備用GPT頭和磁碟資料區。保護MBR與正常的MBR區別不大,主要是分割槽表上的不同,在保護MBR中只要一個表示為0xEE的分割槽,以此來表示這塊硬碟使用GPT分割槽表。首要GPT頭包含了眾多資訊,具體內容如下:

    分割槽表頭定義了硬碟的可用空間以及組成分割槽表的項的大小和數量。分割槽表頭還記錄了這塊硬碟的GUID,記錄了分割槽表頭本身的位置和大小(位置總是在LBA1)以及備份分割槽表頭和分割槽表的位置和大小(在硬碟的最後)。它還儲存著它本身和分割槽表的CRC32校驗。韌體、載入程式和作業系統在啟動時可以根據這個校驗值來判斷分割槽表是否有錯誤,如果出錯了,可以使用軟體從硬碟最後的備份GPT分割槽表恢復整個分割槽表,如果備份GPT也校驗錯誤,那麼磁碟將不可用,系統拒絕啟動。

    接下來主要是128個分割槽表項,GPT分割槽表使用簡單而直接的方式表示分割槽。一個分割槽表項的前16位元組是分割槽型別GUID。例如,EFI系統分割槽的GUID型別是{C12A7328-F81F-11D2-BA4B-00A0C93EC93B} 。接下來的16位元組是該分割槽的唯一的GUID(這個指的是該分割槽本身,而之前的GUID指的是該分割槽的型別)。在接下來是分割槽其實和末尾的64位LBA編號,以及分割槽的名字和屬性。具體結構如下表:

    MBR引導

    接下來開始真正的引導過程了,主要說明GRUP的引導。總體上GRUB更像是一個mini os,只不過這個mini os的作用只是載入其他的作業系統,在GRUB中包括stage1、stage1.5(可選)和stage2,其中stage1和stage1.5屬於boot loader,stage2屬於mini os的核心部分。GRUB中stage1過程主要位於MBR的前446位元組中(對於支援GPT分割槽的磁碟,同樣有最開始的512位元組作為保護MBR,保護MBR與正常的MBR區別不大,主要是分割槽表上的不同,在保護MBR中只要一個表示為0xEE的分割槽,以此來表示這塊硬碟使用GPT分割槽表,不能識別GPT硬碟的作業系統通常會識別出一個未知型別的分割槽,並且拒絕對硬碟進行操作),之後的64位元組為硬碟的分割槽表,最後兩個位元組為MBR結束標誌位(0xAA55)。

    stage1部分佔用了446位元組,其程式碼檔案是原始碼目錄下stage1/stage1.S檔案,彙編後生成一個512位元組的boot.img,被寫在硬碟的0面0道1扇區中,作為硬碟的MBR。stage1的工作很簡單,就是載入0面0道2扇區上的512位元組到0×8000,然後跳轉到0×8000執行。

    在0面0道2扇區上的512位元組內容為檔案彙編後生成。該扇區上的內容的作用是載入stage1.5或是stage2過程,並將控制權轉交。

    Grub引導

    在start過程將控制權轉交後,接下來就是GRUB的核心過程了。該過程之所以區分stage1.5和stage2,主要原因是GRUB和GRUB2的區別。在GRUB2中,將stage1.5過程整合到了stage2的過程中,所以stage1.5過程僅僅是針對GRUB的。下面將會分別介紹兩種GRUB版本的兩種過程。

    4.1 GRUB中stage1.5過程

    Stage1.5過程很無辜,它的作用很單一,但是非常關鍵。它的主要功用就是構造一個boot分割槽系統對應的檔案系統,這樣可以透過檔案系統的路徑(/boot/grub/)尋找stage2過程需要的core.img,進而載入到記憶體中開始執行。

    Stage1.5存在於0面0道3扇區開始的地方,並一直延續十幾k位元組的區域,具體的大小與相應的檔案系統的大小有關(文中涉及到了0面0道1-3+x扇區,這部分扇區為保留扇區,BIOS不會放置任何資料。正因為如此如果轉換到GPT分割槽形式,系統將不能被正確引導,如上文所示,MBR後面的扇區都被其他內容所佔據)。Stage1.5過程被構建成多種不同型別,但是功能類似,下面簡單介紹一下基本的stage1.5過程的檔案系統。e2fs_stage1_5(針對ext2fs,可引導ext2和ext3檔案系統)、fat_stage1_5(針對fat檔案系統,可引導fat32和fat16)、ffs_stage1_5、jfs_stage1_5、minix_stage1_5、reiserfs_stage1_5、vstafs_stage1_5和xfs_stage1_5,這些檔案被稱為stage1.5過程,這些檔案每個至少都在11k以上。除此之外還有兩個比較特殊的檔案,分別為nbgrub和pxegrub,這兩個檔案主要是在網路引導時使用,只是格式不同而已,他們很類似與stage2,只是需要建立網路來獲取配置檔案。

    由於stage1.5過程中會涉及到多個檔案系統對應的檔案,因此本文中主要以ext2fs為例進行說明,其他檔案系統與此類似,可以同樣進行分析理解。

    對於ext2fs檔案系統,用於生成該檔案系統的stage1.5過程檔案(e2fs_stage1_5)的程式碼為檔案。

    在檔案中定義了每個檔案系統對外的介面,用於上層呼叫,作為stage2過程尋找核心程式碼使用,檔案系統一般被定義的介面主要就是三個函式,分別是mount、read和dir函式。對應ext2fs,其定義的函式為:

    12345678

    針對ext2fs有如上的函式名稱,每個函式將具體在檔案中被定義,這裡面沒有包含任何的寫的過程,對於bootloader而言僅僅讀就可以完成任務了,沒必要對其系統進行寫操作。其中ext2fs_mount函式用於檢查檔案系統型別,並將superblock讀入到記憶體中;ext2fs_read函式和ext2fs_dir函式用於對檔案系統具體的操作。在檔案中除了需要對這三個函式的定義之外,還需要檔案系統的屬性的資料結構(superblock、inode和group結構,這些結構最初被定義在檔案中),透過這些資料結構描述一個檔案系統。

    如果讀者有興趣可以試著建立新的檔案系統的支援,可以參照目前存在的一些檔案系統的模板(例項)編寫。

    4.2 GRUB中stage2過程

    GRUB中的核心過程也就是stage2過程了,該過程主要是在檔案系統建立以後選擇合適的作業系統進行載入並轉交控制權,達到最後引導作業系統的目標。由於GRUB屬於multi boot loader,因此在引導的時候要進行選擇,選擇哪種作業系統來執行。在GRUB內部主要包括兩種方式,首先是從menu.list中讀取顯示到螢幕讓使用者選擇,其次是透過grub-shell中定義的命令手動進行啟動。本文將在後面介紹這兩種方式如何執行,接下來先介紹一下stage2的具體的執行過程。

    在上面一節中介紹過,stage1.5過程中將boot分割槽的檔案系統載入了,之後又做了一件事情,就是將控制權轉交給stage2,而stage2入口的地方就是檔案。檔案屬於彙編程式碼,主要作用是初始化C語言的執行環境,為下面執行c語言的函式做好準備,在準備好之後,將執行init_bios_info()函式。init_bios_info函式的作用是執行一些底層的函式,然後跳轉到cmain執行,cmain函式位於檔案中。cmain函式內部進行一個死迴圈,在迴圈內部首先載入配置檔案,顯示給使用者,在這同時迴圈一個內層迴圈,在內層迴圈中,獲取配置檔案中的命令,並解析執行。過程中如果沒有可用的配置檔案,那麼進入命令列模式(enter_cmdline函式),如果找到可用的menu,那麼開始執行menu的對應的內容(run_menu函式)。

    對於enter_cmdline()函式,將呼叫find_command(),進而執行相應命令的函式。

    對於run_menu()函式,將呼叫檔案中的run_script函式,進而呼叫find_command,執行相應命令的函式。

    這兩種方式雖然經過了不同的過程,對使用者輸入的行為進行分析和處理,最終呼叫的函式為find_command,在該函式中順序迴圈比較“輸入”的命令是否與系統內部定義的相同,如果相同轉到執行該函式。在這個比較的過程中包含了一個全域性的資料結構為struct builtin(),由該資料結構組成了一個table型別(),將命令與相對應的builtin結構對應一起並進行串聯。下面描述一下builtin結構的定義:

    1234567891011121314

    有興趣的讀者可以對上面的內容進行擴充套件,形成自己的命令,主要在檔案中按照預定的格式更新,並新增到builtin_table中即可。

    在上面開啟配置檔案的過程中,主要是透過一些檔案操作函式(被定義在中)完成。這些檔案操作函式主要包括:grub_open、grub_read、grub_seek和grub_close等,這些函式屬於grub對外的上層介面,具體的函式內部將呼叫前文中提到的boot分割槽對應的檔案系統的相應的函式完成,這個過程主要是透過回撥函式來完成。該過程整體思路類似於面向物件過程,透過物件操作具體的函式。

  • 2 # _TonyHu

    有一段程式碼存在rom中 和記憶體統一編址 在0xffff0000位置 cpu加電後 ip指標預設為0xffff000 等待值班成撤銷rest訊號 就開始從這個地址執行程式碼 然後跳轉至bios 然後pcie bios 然後mbr 最後作業系統。 新的uefi不太一樣,但是思路基本一樣

  • 3 # 靠良心掙錢

    簡單點說就是先執行rom裡的程式,這是出廠時候固化的,目的就是在電氣層面上驅動電腦使之工作。然後這個程式會驅動磁碟並按照相應的規則從磁碟的特定分割槽讀出系統程式,並將一些核心的必要的部分放入ram,記住ram工作的前提是必須有電,再之後rom將電腦的控制轉給ram裡的系統程式,這一部分也是在rom的程式設定裡,再之後就是系統程式的事了,找到磁盤裡的驅動並執行完了你就可以工作了。這裡有三點很重要:1、所有的程式都可以用硬體實現,這是計算機執行的電氣基礎,也是第一步實現的基礎(雖然rom裡一樣是固化的軟體程式)。2、作業系統不是必須的,即便沒有rom裡的程式也可以執行到相應的位置等待,你如果可以按照rom的執行規則寫程式,一樣可以驅動磁碟和其他硬體利用整個電腦,但是很麻煩。3、rom裡的程式是出廠時就燒錄進主機板晶片的,不需要外部電氣維持,按照半導體儲存原理,每次用完電腦斷電后里邊的內容可以保持10年。

  • 4 # 隨風而去5

    得電,自動執行主機板上的bios載入程式,執行硬碟上的作業系統程式,最後作業系統掌控整個系統,使用者透過鍵盤滑鼠等輸入裝置提交任務給作業系統,作業系統將執行結果透過顯示器等輸出裝置提交給使用者。

  • 5 # 銳哥海南創業

    所謂的程式其實就是一條條可執行的指令。計算機從本質上很簡單,就是從記憶體地址0開始獲取指令進行執行,這是硬體電路決定了的。拿普通pc機來說,上電時,計算機將bios中的指令搬到記憶體中,cpu負責執行就行了。

  • 6 # 嘻嘻1991

    這是個好問題,跟c語言是用b語言開發的,b語言是在彙編下開發的,那彙編又是什麼在什麼上開發的有異曲同工之妙。

    要想明白這個問題,就要從源頭說起了,想一下我問電腦是怎麼開機的。

    按下電源鍵,開機時主機板會滴一下一般,其實就是主機板先通電。通電之後會自己載入boos中的程式,這就是源頭。

    但是怎麼載入,執行的,這個我也不知道,跟硬體有關。

  • 7 # 弦已斷淚已幹128678136

    當電腦啟動時,cpu中的程式計數器會將已經儲存好的第一個地址送入cpu,cpu根據地址找到儲存器中的下一條指令,根據下一條指令再執行下一條指令,如此反覆,程式便啟動了,cpu中的第一條指令的地址就是已經在出廠時寫好了

  • 8 # 特立獨行的z

    cpu加電執行bios,bios根據啟動順序選擇啟動裝置,硬碟,隨身碟等,然後從硬碟引導區執行程式碼,將控制權交給目標作業系統,如果是win系統,則執行核心載入器ntldr,然後是執行hal.dll硬體抽象層,最後執行系統核心程式ntoskrnl.exe或ntkrnlpa.exe,然後核心建立第一個程序system以及空idle程序,system再建立smss.exe會話,然後smss建立子系統程序csrss.exe以及winlogon登入程序,並無限等待其任何一個終止,核心就會讓系統崩潰,也稱藍色畫面。csrss啟動services.exe程序,winlogon則啟動userinit.exe,userinit建立外殼explorer.exe,外殼最後遍歷登錄檔run及啟動項,並啟動它們。

  • 9 # 拜拜27300797

    首先你所謂的啟動是指什麼意思?是進入作業系統才算啟動還是BIOS透過自檢算是啟動。你可以把啟動看成2步。BIOS是硬體商提供的,可以自己設定,從這個角度說你不裝任何其他軟體,電腦仍然是可以完成第一次啟動的,只是你不能做其他有意義的事情。這樣形容吧,bios根據設定的系統引導來源吧,可以是硬碟,光碟,軟盤,隨身碟,幾乎所有的外儲裝置都可以,這些裝置上正常的安裝了系統程式的話就可以完成第二次啟動。

  • 10 # 阿喵就是阿喵

    你這是先有雞還是先有蛋的問題。你說的“先執行程式,才能啟動”,和“不啟動,又無法執行程式”。這兩個“程式”,不是同一種程式。就像“雞下的蛋”“孵出小雞的蛋”在“雞蛋”難題中其實是不一樣的

  • 11 # 195385161

    你說的"計算機必須先執行程式,然後才能啟動",並不十分正確,你指的啟動是指進入作業系統!!其實你按電源鍵的時候電腦就已經啟動了,啟動了之後才去載入的自檢程式!進入作業系統叫啟動成功!否則是啟動失敗。

  • 12 # 風中的棍子

    我也不是計算機專家,從我自己的理解通俗地講下吧。

    計算機加電的時候,主機板有個晶片BIOS先啟動,裡面規定好了執行前的工作,比如檢測本身和硬體狀態,規定各個硬體在什麼條件下執行等。沒有問題後尋找啟動源頭,比如軟碟機,硬碟,光碟機,隨身碟,網路等等,找找看哪個符合條件,符合條件的,比如有沒有引導系統,沒有就返回資訊,告訴你沒辦法啟動,如果有就按引導資訊的指示找到作業系統,作業系統接管啟動工作,按自己的條件逐步測驗和載入各類系統檔案,最後根據不同作業系統的指示進入到最後結果。

  • 13 # PC資訊通

    你問題的前一個"程式"是指底層程式、支援程式,比如固化在主機板CMOS中的基本輸入輸出系統(BIOS)、載入程式等,加電後是在這些程式的引導與配合下開始硬體啟動與喚醒過程,直到系統程式(OS,即我們常說的作業系統)載入完畢。

    問題的第二個"程式"是指應用程式,是指啟動後在作業系統的支援下執行的一些功能性軟體等,比如用來上網的軟體、字處理軟體、播放軟體等。

    所以可簡單表述計算機是這樣啟動的:

    按下電源開關,在BOIS及系統載入程式的指令下硬體喚醒與自檢,自檢無問題後加載作業系統,作業系統載入完畢完成啟動,然後即可執行一些諸如上網、辦公、娛樂等之類的程式。

  • 14 # 墨印2

    按動電源開關,第一級主機板韌體加電,韌體固化程式執行,這個就像一分多的多米諾骨牌。第二步,固化程式次序喚醒其他硬體的固化程式,進行自檢啟動執行。第三步,固化程式載入系統,自檢執行。第四步,載入基礎介面程式和使用者設定的程式。大致如此。計算機啟動完成。

  • 15 # 執著的瘋子8

    誰告訴你不啟動無法執行程式?你玩過微控制器嗎?通電的時候就從rom裡讀取資料開始跑程式,整個程式放在rom裡。電腦同理,也有一個rom儲存空間,只不過加上了管理介面和封裝了一些流程,變成了bios。而bios的作用就是設定一些硬體然後載入作業系統的啟動程式碼,從而啟動作業系統。只能說你理解的程式和系統很片面。

  • 16 # 君He

    學學彙編就知道了 cpu只會執行當前cs:ip所指向的指令 而不管其他 非常的專注 所有的儲存裝置都被一起看作一個邏輯的儲存器 統一劃分了地址 cpu加電會從一個約定地址開始執行第一條指令 暫存器cs和ip會指向那一個地址 一般都是bios裡面的指令 比如自檢 初始化 等等一系列指令 最後跳轉到作業系統的指令裡面 開始引導作業系統 所以 可以看作電腦啟動第一步是人為約定給cpu指明瞭第一件要做的事(給定一個約定的地址)

  • 17 # 拓跋豬

    你是個邏輯推理問題,第一步,肯定要開啟電源。第二步,電源的開啟,導致內部的執行機制被觸發。第三步,你的電腦一個個指令開始運轉!層層剝離,你會發現,其實也沒啥,就是資訊的層層控制和流通!好吧,其實我也是個電腦盲!

  • 18 # 悅5467388

    我來簡單說下吧,bios晶片就是解決你的疑問的東西。

    他是硬體,一按開機按鈕,則cpu的cs跟ip將被強制賦值,該值也正是bios的第一啟動點,在bios上的該值處肯定有指令程式在等待執行,第一步產生0x19中斷,bios載入作業系統啟動扇區的bootsect程式到記憶體中,該程式只有一個扇區,隨後boot程式將之後四個扇區的setup程式調入記憶體,經過非常複雜的一系列操作之後包括中斷產生,重新建立中斷表,重建後的中斷表改名為中斷描述符表也就是IDT,除了這個還有GDT跟GDTR的建立,setup模組載入之後會繼續載入240個扇區的系統模組,然後還涉及16位變32位的操作,比較複雜就不說了,隨後作業系統的main函式執行也就代表啟動os了

  • 19 # JeffWangDY

    前面都給了很詳細的回答,相信題主已經清楚答案了。

    咱來回憶一下早期計算機開機過程。當時畢業實習時是電晶體小型機,開機要用“手撥十三條”,指的是載入程式最初始的13條二進位制機器指令。值機員必須熟記這十三條指令,計算機上電以後在記憶體完全為空時把這指令一條一條輸入進去。

    進機房看主機就像一個櫃子,面板上各種指示燈、開關、儀表印象已經不深了,但這一排閃閃發光的開關一直印在腦海中,工作人員告訴我們這就是用來輸入手撥十三條的。看上去和當時普通的檯燈開關差不多,高度一個人站在主機前抬手正好觸及。水平一排排過去印象中佔了主機面板寬度的80%。每一個開關對應資料匯流排的一位。值員輸入指令時先把每一個開關(一bit)的0 1狀態打到正確的位置,然後按下右邊一個按鈕,一條指令就輸入了。。。

    多麻煩,所以一開機如果沒有什麼特別的安排就一直開著24小時運轉。

  • 20 # 凱凱運維

    cpu在製造的時候,會使它在加點時執行一些程式碼,這個程式碼一般會跳轉到bios裡,然後再執行bios內建的程式, bios尋找可啟動裝置,然後根據mbr引導記錄跳轉到引導分割槽執行pbr,最後將控制權交給作業系統。

  • 中秋節和大豐收的關聯?
  • 2000元可以去哪些國家旅遊?如何玩?