操作系統的啟動過程


  • 疑問一:操作系統是放在磁盤上的,而電腦的指令只能在cpu中執行,cpu在掉電的時候所有的內容豆芽清空。那到底是什么讓操作系統加載到我們的cpu上面,供我們使用的呢?電腦執行的第一條指令是從哪里來的呢?

答:電腦CPU分為兩部分,一部分為RAM隨機訪問存儲,還有一個ROM只讀存儲。

電腦商店之后,cpu的ROM只讀存儲里面還會有一些我們原來寫入的一些內容。我們的系統初始化代碼就是從哪里開始執行。大小約1M左右,只就是我們熟知的BIOS固件。

 

ROM計時上圖從下到上1M的內容,里面就含有BIOS。電腦一上電,cpu就開始執行它。

  • 疑問二:電腦一上電怎么技能找到BIOS的起始位置呢?

我們要求,在系統CPU完成初始化之后,它處於實模式下。在實模式下,它的地址計算把段寄存器左移四位,然后加上他的當前指令指針,這兩個加在一起作為我們當前訪問第一條指定位置。即

PC就是第一條指令的起始位置。

還有一條限制是說,在加電的時候,它處於實模式,這個時候地址總線,並不是像我們現在用到通常系統是32位,它只有20位的地址可用,那在這20位地址里頭,我們用到區域就是2的二十次方,這個時候就只有1M。這就解釋了為什么放的區域就只能放在最底下1M里頭的一小塊。

這塊代碼他為了從磁盤上讀數據,這個時候必須提供相應的服務,如果沒有這些服務,是沒有辦法訪問到磁盤設備的。為了做到這件事,在BIOS里面,他需要提供這樣一些功能,分別是:

  1. 基本的輸入輸出
  2. 系統的配置信息
  3. 開機自檢程序
  4. 系統的啟動程序
  • 基本輸入輸出

在屏幕上顯示基本的信息,從磁盤上讀寫扇區,知道我的內存有多大,從鍵盤上讀用戶的輸入。當然在這里BIOS只能提供最簡單,最基本的輸入輸出功能。並且它的使用也受到很大的限制,比如說在英特爾的CPU上,它受到一條限制,就是你只能是在實模式下工作。那如果說我們的操作系統是工作在保護模式下,那這些都不能用了。

  • 系統的配置

我們都知道系統在剛開始的時候,你需要有配置,到底是從硬盤啟動,從網絡啟動,還是說從光盤啟動。這些啟動是在你加電的時候,由你的BIOS的設置來完成。依據這些設置,系統執行它的啟動程序。就是把硬盤里的加載程序和操作系統內容先后加載到CPU當中來。

 具體的過程可以這樣來看:

在BIOS初始化完成后,BIOS它就會從磁盤上把引導散區的程序(這個引導散區長度只有512字節)讀取到CPU的指定位置0x7c00。然后CPU就跳轉到改固定位置,把控制權轉到從磁盤讀取進來的這個程序,我們稱它為“加載程序”。加載程序里面我們又可以做進一步的事情。它能將操作系統的代碼讀到內存中來,並且能把控制權交給操作系統,來繼續執行操作系統功能。

 

如上圖所示,把加載程序放在了CPU地址為0X7C00上,操作系統放在BIOS的上面。

這個時候有個問題 ,你既然能從磁盤上讀數據,那為啥我不直接從BIOS里頭直接把操作系統的內核映像讀進來呢??? 
實際上,首先我們磁盤上是有文件系統的,文件系統是多種多樣的。我們在機器出廠的時候,不可以說我直接限制死你,你只能用某一種文件系統。為了增加這種靈活性,但是我在BIOS又不可能加上認識所有文件系統代碼。 
那怎么辦? 我就在里有一個基本約定 
我不需要認識格式,我也能從里頭讀到你的第一塊。我只讀第一塊。 
讀了這塊之后 ,這塊的加載程序里頭,我們會用加載程序來識別你磁盤上文件系統。這時候,我就能夠認識磁盤上文件系統,我就可以讀到我內核的鏡像,並且把它加載到內存當中來。這就是我們這里看到,用加載程序讀到操作系統來。有了這個過程之后,我們再把相應的控制權轉到讀進來的操作系統內核代碼上,我們操作系統就可以開始運行的。

略詳細版

其實在cpu初始化完成后,BIOS並不是直接去讀磁盤扇區的加載程序的。 
比如說我們在最早的時候,電腦磁盤里只有一個分區,cpu和BIOS都初始化完成之后就直接到分區里找文件系統了。但是對於我們現在來說,所有的計算機,或者大多數的計算機里頭都不止一個分區,可能會有幾個分區。每個分區上會裝不同的系統。那這個時候就在前邊加上一個主引導記錄。 
這個主引導記錄是說,我要從哪個文件系統里去讀我的這個加載程序。在主引導記錄執行完,然后我就進到當前某一個分區里頭,分區里頭又有該分區的引導扇區,通過這個活動分區的引導扇區,再來加載我們剛才說到的加載程序。可以參考下面這張圖。第一個框是在cpu上面執行的,其他三個是在磁盤上面執行的

 

 

 

那我們具體說起來,有這樣幾個過程!!!

    1. cpu初始化,找到自己的第一條指令!!! 
      首先我們在前面已經說過,CPU加電完成它的初始化,到一個確定的狀態去讀第一條指令。我們需要知道CPU初始化之后,它的代碼段段寄存器和當前指令指針寄存器這兩個的內容,算出來它的第一條指令在內存當中的什么地方。 
      因為它是實模式,所以是CS和IP都是16位的,CS左移四位和IP加在一起算出我的位置。這個時候 我放到內存當中的BIOS的位置,只能是在最底下的一兆,原因在於這時候它是20位的地址。有了這個之后我們就直接進到BIOS里執行。

    2. 進入BIOS,進行BIOS的初始化!!! 
      首先第一個是硬件自檢 
      也就是說我們有可能加電起來之后,你的內存出錯, 那整個后邊就沒法做。 
      我們說在計算機系統里頭它的加電自檢,它上來之后是看最關鍵的這幾個部分是不是在工作。這就相當於在自檢的時候關鍵的內存 顯卡這幾部分是否存在,如果存在的話 ,它的工作狀態是什么樣子。 
      然后完成設備每一個這些關鍵性的接口卡里頭它自己的初始化程序。這些初始化程序完成之后,那我就認為關鍵的設備是可以的了。

      然后是使用系統配置表,找到指定外部設備的系統(比如,U盤,磁盤等) 
      我們說我們現在的系統,很多都是可以即插即用的。如果說我想從一個USB接口的光驅里啟動,那你怎么啟得來??? 
      這時候, 在這個BIOS里的自檢,現在是能夠做到系統的自檢!!! 我們說在BIOS里有一個系統配置表,這個配置表就是我們這里所說的 ESCD ,就是擴展系統配置數據。那用這個數據 我就能知道,我當前系統里都有些什么樣的設備。每次加電之后有可能你會插上新的卡或者說拔掉已有的卡,這個數據會因為這些操作而發生改變。每次加電的時候這個數據都必須審閱,可能會修改一次。做完之后,我就把控制權轉到我們從磁盤讀到cpu的數據里頭。讀進去的數據就是我們說的主引導記錄。

    3. 主引導記錄MBR格式 

 

 

 

由於有的電腦不止一個分區,所以上面我們說的,讀入到cpu的數據,就是我們需要的主引導記錄。我們說主引導記錄有512字節,但是在這 ,你只能說我可以用到的是446字節。 
那其他部分是什么??原因是當我的電腦后邊有多個分區的時候,要把這些分區的狀態也要存到這512字節里頭。由上圖可以看到,每個分區的信息占用16個字節,所以硬盤分區表里最多只能有4個分區。 
所以這樣的話,你就只有446個字節的內容來執行你的啟動代碼。而這個啟動代碼是用來檢查我分區表是否正確,然后還要加載並跳轉到你的活動分區的引導記錄上去。 
前面的是啟動代碼446字節,中間的你的硬盤分區表16*4=64字節。最后是一個結束標志,這個結束標是55AA,有了這個之后 ,它才認為這是一個合法的主引導記錄。

4.分區引導扇區格式 

 

 

 那有了以上主引導的操作之后,它就會跳到你活動分區的引導扇區上去。 
從上圖可以看出, 
先是跳轉指令,跳轉指令平台相關了, 你的CPU不同,這個地方這條指令肯定也是不一樣的。 
然后是文件卷的信息。 
再之后是我的啟動代碼,這個地方的啟動代碼就需要認識你的格式說,我這個加載程序不是存在在512字節里頭的,存在別處的。它在哪?那就靠你這里的代碼來約定說我放在哪。而這里的代碼實際上是我們存在硬盤上的或者說你的軟盤上的,因此我是可以改動的,那改動完了之后,我就可以把我的加載程序放在任意的地方,只要我在這標識出來我上哪去認識它就可以。 
最后是結束標志,這個結束標志跟剛才那個主引導記錄是一樣的,也是55AA。有了這個之后 ,它才認為這是一個合法的分區引導。

5. 加載程序(bootloader) ,開始加載我的操作系統到我的cpu里面的 
這里寫圖片描述
從上面分區的啟動代碼,就找到了我的加載程序。 
接下來我們說加載程序的細化 
我們說加載程序它首先不是直接去加載你的內核,而是去文件系統當中讀一個啟動配置文件。依據配置文件的配置(參數)去加載內核,依據這個,就選擇你啟動的模式,比如說我是在正常啟動,還是說我是在安全模式啟動,還是說我是在一個調試狀態下啟動我的系統。 
那這些區別都會讀出來之后,它導致我在加載內核的時候的一些內核會不一樣,或者說我加載的時候的參數會不一樣。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM