《操作系統》OS學習(二):啟動、中斷、異常

Bootloader:加載OS。操作系統一開始是放在DISK(硬盤)中,并不是放在內存中。

BIOS:基本I/O處理系統。存放在ROMRead-Only Memory)只讀存儲中

?

BIOS(Basic Input/Output System)基本輸入輸出系統。

首先我們需要知道,計算機加電之后,是從什么地方讀取的第一條指令,從磁盤的什么地方讀取的我的操作系統的內容,也就是計算機啟動的過程是怎樣的。

計算機加電后,首先是CPU的初始化過程,將各寄存器初始化,此時系統處于實模式下。我們要知道計算機內存分為兩種,RAM(Random Access Memory)隨機訪問存儲和ROM(Read-Only Memory)只讀存儲。其中RAM掉電內容會丟失(也就是我平時所理解的內存條內的內容比如),ROM掉電不會丟失內容。因此系統初始化代碼就存儲在ROM中。由于CPU初始化完成后處于實模式,尋址空間為20位也就是1M,因此系統初始化代碼也就是BIOS啟動固件是存儲在1M之下,如下圖。還需要知道的是,CPU初始化完后CS代碼段寄存器與IP指令指針寄存器決定了第一條要執行的代碼在ROM中的位置,而BIOS能提供的功能也列在下圖之中:

  1. 基本輸入輸出的程序(從磁盤讀數據、從鍵盤讀輸入、顯示器上顯示輸出等);
  2. 系統設置信息(從硬盤啟動還是從網絡啟動還是從U盤啟動等);
  3. 開機后自檢程序(檢查內存顯卡是否正常);
  4. 系統自啟動程序(啟動操作系統)等。

BIOS會根據設置執行啟動程序,從磁盤把加載程序和操作系統內容加載到系統。首先BIOS將磁盤讀引導扇區加載進指定位置0x7c00,引導扇區大小限制為512byte。此時跳轉到CS:IP = 0000:7c00執行引導扇區的程序段,通過引導扇區的程序段跳轉到讀取操作系統的加載程序。加載程序主要有兩個功能:

  1. 將操作系統的代碼和數據從硬盤加載到內容中;
  2. 將控制權轉移給操作系統,也就是CS:IP跳轉到操作系統代碼段,執行操作系統的功能。

那么問題來了,既然能讀磁盤內容,為什么不直接將操作系統內核映像讀取到內存空間而要先讀取引導扇區的加載程序呢?這是因為不同的操作系統有不同的文件系統,也就需要不同的啟動方式。而加載程序限制為512字節,無法覆蓋所有類型的系統,因此首先將磁盤引導扇區內的程序加載進來,引導扇區內的程序可以識別并加載不同類型的系統內核到內存中(亦或是不同的系統有著不同的引導扇區,加載進來之后就知道是什么類型的系統了,至少學到現在還不知道,后續可能會有詳細介紹吧)。此時控制權轉移給操作系統內核。

除此之外BIOS還可以使用一些簡單地系統調用,比如說:1. INT 10h:字符顯示;2. INT 13h:磁盤扇區讀寫;3. INT 15h:檢測內存大小;4. INT 16h:鍵盤輸入。這些系統調用都只是最簡單的系統調用,并且只能在實模式下訪問。當進入操作系統并且操作系統是保護模式,那么這些功能就不能用了。

系統啟動流程

上一節講解系統調用的過程中粗略的講了一下系統啟動的流程,然而實際上系統地啟動流程遠沒有那么簡單,本節就稍微詳細地講解一下。但是實際上即使是這一節也無法十分詳細講解,只是讓我們對系統啟動的過程有一個整體的認識而已。

首先是BIOS讀取加載程序的過程:系統加電后,CPU初始化,然后BIOS初始化硬件,然后查詢主引導記錄讀取主引導扇區代碼,這是由于現代計算機內通常不止有一個分區,不同分區內可能有不同的操作系統,而我們需要知道我們要啟動的操作系統在哪個分區內(稱為活動分區),這就是通過讀取主引導記錄實現的。知道活動分區之后將活動分區引導扇區內的代碼讀取到內存并執行,引導扇區內的代碼讀取文件系統的加載程序。這才是較為完整的讀取加載程序的過程。

那么再詳細一點講,計算機上電后,首先是CPU初始化:CPU上電后,通過CS、IP兩個寄存器知道從0XFFFF0地址讀取第一條指令,這條指令是跳轉指令,跳轉到BIOS程序段。為什么是0XFFFF0呢,這是因為CPU上電后會初始化CS:IP = 0xf000:fff0。并且CPU初始化后處于實模式,也就是16位系統,20位尋址空間,是通過將CS左移4位與IP相加得到最終的地址因此指令指針PC = 16*CS+IP。20位尋址空間自然意味著最大尋址空間為2^20byte,即1M。

接下來是BIOS初始化:硬件自檢(ROM等);檢測內存(RAM)、顯卡等關鍵部件是否存在,存在的話工作狀態是否正常;查找并執行顯卡等接口卡的BIOS(顯卡等擁有自己的BIOS固件),對設備進行初始化;之后執行系統BIOS進行系統檢測,主要是為了檢測計算機有哪些即插即用設備,比如硬盤、光驅或者U盤;檢查完之后更新CMOS中的擴展系統配置數據(ESCD)告知有哪些即插即用設備;之后就可以按照指定的啟動順序從軟盤、硬盤或者光驅啟動操作系統。

BIOS初始化完了,自然是要讀取主引導記錄。主引導記錄(MBR)的格式如下圖:啟動代碼限制為446字節以內,用于檢查分區表的正確性、尋找活動分區并將活動分區引導程序加載到內存;還有64字節用于存儲硬盤分區表,描述分區狀態和位置,最多表示4個分區,每個分區16字節;還有一個MBR結束標志字(0x55AA),占2字節,只有有這個結束字才認為這條MBR是合法的MBR并執行啟動代碼。

當主引導記錄讀完并正確執行啟動代碼后,活動分區引導扇區的內容就被讀入內存,分區引導扇區格式如下圖:首先是跳轉指令,這條跳轉指令是與平臺相關的,CPU不同則跳轉指令不同,跳轉至啟動代碼處;文件卷頭結構則記錄文件系統描述信息;結束標志也是0X55AA;啟動代碼則負責跳轉到加載程序,加載程序不存儲在引導扇區,而是存儲在磁盤中,只要在啟動代碼中記錄加載程序的位置即可。

活動分區引導扇區將加載程序讀入內存之后,加載程序的執行狀態如下圖:加載程序并不是直接讀取操作系統內核,而是從文件系統中讀取啟動配置信息;依據配置信息(不同的內核有不同的配置信息),確定啟動的內核或啟動參數(比如是安全模式啟動還是正常模式啟動);最后根據配置加載指定內核并轉到內核執行,此時將控制權轉移給了操作系統內核。

值的一提的是,以上所說為較早版本的系統啟動流程,隨著技術的發展,出現了UEFI(Unified Extensible Firmware Interface)統一可擴展固件接口,這是BIOS的接任者。里面有一些新的標準,比如MBR只能存儲4個分區的方式逐漸被淘汰,現在出現了GPT(Globally Unique Identifier Partition Table)進行替代;UEFI可以選擇啟用哪些固件等。

中斷、異常與系統調用

這一節講解中斷、異常與系統調用,這三者也可以總稱為中斷處理機制。首先我們需要知道這三個機制的背景:1. 計算機運行過程中,內核是被完全信任的第三方;2. 只有內核可以執行特權指令;3. 內核需要方便地為應用程序提供服務。

那么我們為什么需要這三個機制呢?也就是說這三個機制實現了什么功能呢?

中斷是為了處理外設IO的,比如當我有一個新的鍵盤和鼠標接入了計算機,或者我們在鍵盤上敲了鍵盤,此時即使計算機正在進行其他任務也需要對此作出快速響應,這就是中斷要做的事情;

當我程序運行中出現了異常,比如某個在分母上的變量運行過程中變為了0,也就是出現了除以0這種操作,這是不合法的,又比如說程序訪問一塊內存區,而這個內存區是不允許這個程序訪問的,在運行到這一行程序之前我們無法預測這一異常,因此我們需要對這種異常有一種處理機制;

系統調用則是為上層的應用程序提供了各種接口,方便應用程序使用系統提供的服務,而又規避安全風險問題,即應用程序只使用提供給他的服務,而不會胡亂修改內核。

中斷、異常與系統調用的結構圖如下圖:當有外部設備接入或者有輸入,則告知內核(插入中斷向量表),內核通過設備驅動與外部設備交互;當應用程序執行過程中出現異常,也插入中斷向量表,內核要么將異常解決掉,要么終止程序,并將程序占用的資源返還;應用程序可以直接或者通過函數庫間接地使用系統調用接口,插入中斷向量表,中斷向量表通過查詢系統調用表提供系統調用實現,并將結果返還。因此可以說內核與外界打交道的接口主要就是中斷、異常與系統調用。

從上圖也可以看到中斷、異常與系統調用的區別如下圖:系統調用是應用程序主動向操作系統發出的服務請求;異常是非法指令或其他原因導致當前指令執行失敗(如內存出錯)后的處理請求;中斷則是來自硬件設備的處理請求。

下圖是三者比較:

這三者也即中斷處理機制具體實現過程是怎樣的呢?實現過程可以分為硬件和軟件兩部分。首先是硬件部分:在CPU初始化過程中會設置中斷使能標志,即在CPU做好準備工作之后才會開始接受中斷請求,在此之前是不會有反應的;此外需要根據內部或外部事件設置中斷標志,記錄出現了一次中斷;依據中斷向量表中的內容知道中斷源是什么,并調用相應中斷服務例程。以上為硬件部分工作內容,接下來的內容是軟件部分:1. 現場保存(編譯器);2. 中斷服務處理(服務例程);3. 清除中斷標記(服務例程);4. 現場恢復(編譯器)。

那么如果一個中斷出現的時候又出現新的中斷會怎樣呢(此處中斷指中斷處理機制即包含中斷、異常、系統調用三者)?其中,硬件終端服務例程可以被打斷,比如不同硬件中斷源同時出現,此時可以按照優先級依次處理,而出現了非常重要的中斷比如電源出現問題時,則可以臨時禁止接收中斷請求,而被接收了的中斷請求會保持到CPU對中斷做出響應。異常服務例程也是可以被打斷的,比如異常執行中可能出現硬件中斷,例如處理異常時進行磁盤IO,此時磁盤出現了硬件中斷,則會打盹異常服務例程去進行硬件中斷處理。異常服務例程也是可以嵌套的,比如處理異常時又出現了缺頁異常,此時則會產生嵌套。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/454179.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/454179.shtml
英文地址,請注明出處:http://en.pswp.cn/news/454179.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

[GCC for C]編譯選項---IDE掩蓋下的天空

編譯選項 ---------IDE掩蓋下的天空 /*************************************** * gcc for c language ***************************************/ Single Source to Executable $ gcc helloworld.c [-o howdy] 默認生成的名字a.exe ______________________________________ …

2016級算法第二次上機-F.ModricWang's Number Theory II

891 ModricWangs Number Theory II 思路 使得序列的最大公約數不為1,就是大于等于2,就是找到一個大于等于2的數,它能夠整除序列中的所有數。 考慮使得一個數d整除數組中所有數的代價: 如果一個數不能被b整除,那么可以花…

常用css屬性集(持續更新…)

禁止換行,超出部分顯示…:a. 代碼:.hide_word{ max-width: 100px; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; } b. 效果: 本文轉自 bilinyee博客,原文鏈接: http://blog.51cto.co…

parallels網絡初始化失敗_33 個神經網絡「煉丹」技巧

自然語言處理Andrej Karpathy 是深度學習計算機視覺領域、與領域的研究員。博士期間師從李飛飛。在讀博期間,兩次在谷歌實習,研究在 Youtube 視頻上的大規模特征學習,2015 年在 DeepMind 實習,研究深度強化學習。畢業后&#xff0…

《操作系統》OS學習(三):系統調用

例子 首先看一個標準C庫的例子:當我們程序中使用了C庫中的printf()函數,實際在底層是在內核態中調用了write()函數。圖中右側則是將程序代碼與C庫都算到應用程序中,內核提供了一個系統調用接口。 從這個例子我們可以得到以下幾點&#xff1a…

cygwin/gcc與MinGW

cygwin/gcc和MinGW都是gcc在windows下的編譯環境,但是它們有什么區別?在實際工作中如何選擇這兩種編譯器呢?cygwin/gcc完全可以和在linux下的gcc劃等號,這個從boost庫的劃分中就可以看出來端倪,cygwin下的gcc和linux下的gcc使用的是相同的T…

JavaScript服務器端開發技術(對象屬性的枚舉與查詢)

既然對象是屬性的集合,那么檢測與枚舉集合中的屬性就是一項重要任務。對此,我們來分別看一下ES3和ES5提供的解決方案。 1) ES3枚舉方案 示例代碼: var contacts{ ID:[0,1,2,3,4,5], names:["Zero","One","Two&q…

treelistview 所有節點失去焦點_垃圾詢盤過濾,焦點科技的 Milvus 實踐

文章作者:黎陽,焦點科技軟件開發工程師李成龍,Zilliz 數據工程師Milvus (https://milvus.io/) 向量搜索引擎開源半年以來,全球已經有數百家企業或組織用戶。焦點科技是一家以 B2B 外貿交易為主營業務的科技公司,也是 M…

《操作系統》OS學習(四):計算機體系結構、內存層次和地址生成

計算機除了計算能力之外還有存儲能力,存儲能力即計算機擁有一系列的存儲介質,我們可以在存儲介質上存儲我們的代碼和數據。計算機體系結構中約定了哪些地方可以用來存儲數據:CPU內的寄存器、內存和外存。不同的存儲介質,容量、速度…

GCC中SIMD指令的應用方法

X86架構上的多媒體應用開發,如果能夠使用SIMD指令進行優化, 性能將大大提高。目前,IA-32的SIMD指令包括MMX,SSE,SSE2等幾級。 在GCC的開發環境中,有幾種使用SIMD指令的方式,本文逐一介紹。X86的…

使用angular4和asp.net core 2 web api做個練習項目(二), 這部分都是angular

上一篇: http://www.cnblogs.com/cgzl/p/7755801.html 完成client.service.ts: import { Injectable } from angular/core; import { Http, Headers } from angular/http; import { Observable } from rxjs/Observable; import { ErrorHandler } from angular/core; import rxj…

leelen可視對講怎么接線_樓宇對講系統怎么布線 樓宇對講系統布線方式【介紹】...

隨著智能小區規模不斷增加,樓宇可視對講系統應用越來越廣泛,因而視頻信號的傳輸方式與布線設計顯得越來越重要。視頻信號與數據和音頻信號不同,可行的一種傳輸方式為視頻信號基帶傳輸,下面小編就簡要介紹一下這種傳輸方式和布線方…

路由匯總實例

5.2.2.2 路由匯總策略 之前提到過,在網絡管理員計劃好子網選擇并進行預期地路由匯總時,手動路由匯總工作能取得最佳效果。例如,之前的例子設定好了一個考慮周全的計劃,管理員只使用遠離Yosemite路由器并以10.2開頭的子網。這個規定…

《操作系統》OS學習(五):連續內存分配 內存碎片、動態分配、碎片整理、伙伴系統

內存碎片 在沒有其他方式輔助的情況下,我們分配給一個進程的內存是連續的。在分配時候我們需要有動態分配與碎片處理。如何理解呢?就是每個進程需要一塊內存,我們要選取合適的位置的內存分配給它。當有的進程先結束了內存還給操作系統&#…

GCC 中文手冊 - 摘自純C論壇

GCC Section: GNU Tools (1) Updated: 2003/12/05 Index Return to Main Contents NAME gcc,g-GNU工程的C和C編譯器(egcs-1.1.2) 總覽(SYNOPSIS) gcc[option|filename ]... g[option|filename ]... 警告(WARNING) 本手冊頁內容摘自GNU C編譯器的完整文檔,僅限于解釋選項的含義…

python如何實現支持中文

#codingutf-8print("我要python支持中文") 默認情況下,python是不支持中文的。 如果要實現python支持中文(我是從python3.6開始學習的),只要在python文檔的開頭加入:“#codingutf-8"就可以了。轉載于:h…

世界之窗瀏覽器刪除文本框信息_文本框——Excel里的便利貼

工作表里面的單元格應該是足夠我們來記錄數據和信息了。但是文本框這個功能在工作表中還是存在,可以理解為便利貼功能。插入文本框1.點擊“插入”選項卡。2.然后點擊“文本框”。3.在下拉菜單里面,有兩種可供選擇:橫排文本框和垂直文本框。在…

RHEL 5服務篇—常用網絡配置命令

常用網絡配置命令 在“Linux系統管理”的文章中,大家已經學習了Linux系統的基本管理命令和技巧,為了進一步學習Linux網絡服務打下了良好的基礎。所以我作者以后將陸續推出Linux網絡服務的相關文章。希望大家能給與我大大的支持。 今天我們就來學習一下…

清華大學《操作系統》(六):非連續內存分配 段式、頁式、段頁式存儲管理

背景 連續內存分配給內存分配帶來了很多不便,可能所有空閑片區大小都無法滿足需求大小,這個分配就會失敗。基于這種現狀,就有了非連續內存分配的需求。非連續分配成功的幾率更高,但也面對更多的問題,比如分配時是不是…

python監控文件內容變化_Python監控文件內容變化

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"阿里云文件存儲NAS是一個可共享訪問&#xf…