• 正文
    • IO 端口尋址和訪問
    • IO 數據傳輸的三種方式
    • 存儲器和 BIOS
    • 計算機啟動過程
    • 總結
  • 推薦器件
  • 相關推薦
申請入駐 產業(yè)圖譜

Linux 硬件環(huán)境和 BIOS

2023/08/15
2409
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

我們大家知道,計算機其實就是硬件軟件的集合體,硬件和軟件相互依存缺一不可。硬件是計算機實實在在看得見摸得著的實體部分,而軟件是存在于硬件之上,是控制硬件的一系列指令流。

操作系統(tǒng)是一種軟件,雖然是軟件,但是操作系統(tǒng)卻是和硬件關系非常密切的一類。其他軟件都可以理解是運行在操作系統(tǒng)之上的一類軟件。如果想要徹底理解操作系統(tǒng)運行的全過程,就需要了解它的硬件結構和硬件基礎。

這篇文章會和大家聊聊以 Linux 0.11 為背景下的硬件基礎,我們主要說明基于 Intel 80x86 的 IBM PC 微型計算機極其兼容機的計算機系統(tǒng)。

一般我們說的 PC/AT 指的就是 80386 或以上 CPU 的 IBM PC 極其兼容機,而 PC 用來泛指所有微機,包括IBM PC/XT 極其兼容微機。

硬件構成

一個傳統(tǒng)的計算機硬件組成結構如下圖所示:

從概念上來看,一臺簡單的個人電腦可以被抽象為上面這種相似的模型,CPU、內存、I/O 設備都和總線串聯(lián)起來并通過總線與其他設備進行通信。圖中上部控制器存儲器接口都被集成在計算機主板上,這些控制器分別是以一塊大規(guī)模集成電路芯片為主組成的電路。當然現代操作系統(tǒng)有著更為復雜的結構,會設計很多條總線,我們稍后會看到。暫時來講,這個模型能夠滿足我們的討論。

CPU

CPU 是計算機的大腦,它也是整個計算機的核心,CPU 的內部包含有寄存器,而寄存器是用于存儲指令和數據的,匯編語言的本質也就是 CPU 內部操作數所執(zhí)行的一系列計算。

存儲器(內存)

沒有存儲器,計算機就像是一個沒有記憶的人類,只會永無休止的重復性勞動。CPU 所需的指令和數據都由存儲器 - 內存來提供,CPU 指令經由內存提供,經過一系列計算后再輸出到內存。

磁盤

磁盤也是一種存儲設備,它和內存的最大區(qū)別在于永久存儲,程序需要在內存裝載后才能運行,而提供給內存的程序都是由磁盤存儲的。

控制器

控制器就是一些控制設備的統(tǒng)稱,比如中斷控制器、DMA 控制器、鍵盤鼠標控制器等。

總線

一般來說,內存內部會劃分多個存儲單元,存儲單元用來存儲指令和數據,就像是房子一樣,存儲單元就是房子的門牌號。而 CPU 與存儲器、控制器之間的交互是通過地址總線來進行的,總線從邏輯上分為三種:地址線、數據線和控制線。

總線會插在總線插槽中,而這些總線插槽(也叫總線接口)有各種各樣的標準:通常有工業(yè)接口標準結構 ISA(Industry Standard Architecture)總線、擴展工業(yè)標準結構總線 EISA(Extend ISA)、外圍組件互連 PCI(Peripheral Component interconnect)總線、加速圖形端口 AGP(Accelerated Graphics Port)、視頻總線 等。這些總線接口的主要區(qū)別在于數據傳輸速率控制靈活性方面。

不過隨著計算機的發(fā)展,傳輸速率更高,控制更靈活的總線接口在不斷推出,比如使用串行接口總線的 PCIE(PCI Express)總線。

這其實是三代計算機總線的發(fā)展歷史,一代是 ISA EISA,二代總線是 PCI ,三代是 PCIE。

另外,在最早的計算機中,是有控制卡這個硬件的,比如顯示器控制卡、打印機控制卡、軟驅控制卡,不過隨著計算機的發(fā)展,這些單獨的控制卡都被集成在了計算機主板上的幾個超大規(guī)模集成電路芯片中。為了讓系統(tǒng)的不同部分都能達到最高的傳輸效率,總線結構也發(fā)生了很大改變。現代 PC 機的組成結構大致如下。

現代 PC 機的主板主要使用兩個超大規(guī)模芯片構成的芯片組和芯片集,分為北橋(Northbridge)和南橋(Southbridge)芯片。北橋芯片主要用于 AGP 接口、與 CPU 交互和內存接口。除此之外還用于控制內存,因此 Intel 將其標注為 MCH(Memory Controller Hub),北橋芯片因此傳輸速率比較高。

相對的,南橋芯片傳輸速率比較低,南橋芯片用于管理中低速的組件,比如 PCI 總線、硬盤接口、USB 端口等。Intel 將其稱為 ICH(IO Controller Hub)。

IO 端口尋址和訪問

大伙可以想象一個場景,把你自身縮小化無數倍然后置身于機箱內,你會看到無數個總線互聯(lián),無數個時鐘周期內 CPU 和各種存儲器外設的交互,那么 CPU 是如何和這些組件進行交互的呢?

我們要出門前通常會思考兩件事情:去哪里以及如何去。CPU 為了實現和組件進行通信也是這樣,CPU 通過總線把這些組件連接起來,所以傳輸媒介就是總線,CPU 還需要知道去哪里,這就需要知道這些組件的地址。地址分為兩類,一種是存儲器的地址,比如內存地址。一種是外設的地址,稱為 IO 端口地址或者簡稱端口。

IO 端口地址的編制方法一般有兩種方式:統(tǒng)一編址和獨立編址

端口統(tǒng)一編址的方式就是將 IO 控制器中的端口地址歸納入存儲器尋址地址空間范圍內,這種方式也稱為存儲器映像編址,說白了就是把端口的地址歸為內存的一部分,CPU 通過對內存進行讀寫來達到對端口讀寫的目的。比如說外設 0x1000 ~ 0x1fff 這段內存空間是輸入外設映射過來的,那么你對這段內存空間寫入數據,經過總線傳輸后給外設,實現對外設的讀寫。這段地址空間就稱作是 IO 地址空間。業(yè)界也叫這種映射方式為內存映射。

IBM PC 機及其兼容微機主要使用的是獨立編址的方式,采用了一個獨立的 IO 地址空間對設備中的寄存器進行尋址和訪問。使用 ISA 總線結構的傳統(tǒng) PC 機其 IO 地址空間范圍是 0x000 ~ 0x3FF,一般有 1024 個端口地址可以使用。關于這些端口和外設的映射表如下:

端口地址范圍 說明
0x000 --- 0x01F 8237A DMA 控制器 1
0x020 --- 0x03F 8259A 可編程中斷控制器 1
0x040 --- 0x05F 8253/8254A 定時計數器
0x060 --- 0x06F 8042 鍵盤控制器
0x070 --- 0x07F 訪問 CMOS RAM 實時時鐘 RTC 端口
0x080 -- 0x09F DMA 頁面寄存器訪問端口
0x0A0 -- 0x0BF 8259A 可編程中斷控制器 2
0x0C0 -- 0x0DF 8237A DMA 控制器 2
0x0F0 -- 0x0FF 協(xié)處理器訪問端口
0x170 -- 0x177 IDE 硬盤控制器 1
0x1F0 -- 0x1F7 IDE 硬盤控制器 0
0x278 -- 0x27F 并行打印機端口 2
0x2F8 -- 0x2FF 串行控制器 2
0x378 -- 0x37F 并行打印機端口 1
0x3B0 -- 0x3BF 單色 MDA 顯示控制器
0x3C0 -- 0x3CF 彩色 VGA 顯示控制器
0x3D0 -- 0x3DF 彩色 EGA/VGA 顯示控制器
0x3F0 -- 0x3F7 軟盤控制器
0x3F8 -- 0x3FF 串行控制器 1

CPU通過設立專門的 I/O 指令,比如 x86 中的 in 就是寫入,out 就是讀出,這種方式來訪問這一空間中的地址單元(也即 I/O端口)。這種方式有個缺點,就是需要專門的匯編語言才能處理。

IO 數據傳輸的三種方式

一般 IO 對數據進行傳輸有三種方式:循環(huán)查詢方式、中斷處理方式和 DMA 傳輸方式

循環(huán)查詢方式(Programmed IO)?:是指 CPU 通過在程序中循環(huán)查詢指定設備控制器的狀態(tài)來判斷是否能夠與其進行數據交換。這種方式不需要通過硬件的支持,使用和編程比較簡單,缺點是比較耗費 CPU 資源。因此除非在多任務操作系統(tǒng)中需要等待極短的時間,否則不應該使用此方式。很像 Java 關鍵字 synchronized 的自旋鎖。

中斷處理方式(Interrupt IO):由于上述的方式會讓 CPU 處于不必要的繁忙之中,所以出現了中斷驅動的方法,通過中斷功能和特殊命令來通知接口,只要 I/O 設備有了需要的數據,便會發(fā)出中斷請求信號給 CPU,CPU 才會給當前任務進行快照后執(zhí)行 IO 操作,CPU 通過通過使用中斷向量表來尋址中斷服務程序的入口地址。因此采用中斷處理方式的話,首先要設置好中斷向量表 IDT 表,并編寫好相應的中斷處理程序。Linux 操作系統(tǒng)中大多數設備 IO 采用的都是這種方式。

DMA 傳輸方式(Direct Memory Access):前面兩種方式都需要 CPU 的直接參與,而 DMA 不需要 CPU 的參與,DMA 顧名思義就是直接內存?zhèn)鬏?,也就是內存能夠直接?IO 進行傳輸,當然需要專用的 DMA 控制器來完成,這中間無需 CPU 干預。使用 DMA 方式效率比較高,在 Linux 操作系統(tǒng)中,軟盤驅動程序使用中斷和 DMA 的方式來配合實現數據的傳輸工作。

存儲器和 BIOS

主存

在很早的時候,也就是 DOS 操作系統(tǒng)流行的那個年代,640K 或者 1MB 的內存容量基本上就能夠滿足普通應用程序的運行。隨著計算機的不斷發(fā)展,內存容量也在急劇擴大,現在 16G 內存空間都有些無法滿足。不過在 Linux 的那個時候,PC/AT 計算機通常使用 512 M 的內存和 Intel 32 位 CPU,CPU 的尋址能力達到了 4GB。為了保證能夠向下兼容,系統(tǒng) 1MB 以下物理內存使用分配上仍然與原來的 PC 保持一致。

當計算機開機上電時,物理內存被設置為從 0 開始連續(xù)的區(qū)域。除了地址從 0xA0000 到 0xFFFFF(640K 到 1M 共 384 K)和 0xFFFFE000 到 0xFFFFFFFF(4G 處最后一 64K)范圍以外的所有內存都可用做系統(tǒng)內存。

這兩個特定的部分用于 IO 設備和 BIOS 程序。

給大家舉個例子,假如計算機有 2G 的內存,下面是內存空間分配情況:

0 - 640K 用于存放內核代碼和數據,從 0xA0000 開始的 128 K 用于顯示內存緩沖區(qū),隨后的其他部分用于控制卡的 ROM BIOS 或其映射區(qū)域,而 0xF0000 -> 1M(0xFFFFF) 的范圍用于高端系統(tǒng)的 ROM BIOS 映射區(qū),從 1M 到 2G 用作可分配的主存區(qū)。

BIOS

BIOS 的全稱是 Basic Input/Output System,基本的輸入輸出系統(tǒng),它是計算機加電是首先要執(zhí)行的自檢系統(tǒng)。

BIOS 啟動時會進行下面這些檢查:

自檢(POST):BIOS 會進行自檢以確保主板、內存、顯卡、硬盤等硬件是否能夠正常工作。

啟動設備檢測:BIOS 會檢測可用的啟動設備,例如硬盤、光驅、USB 設備等,并按照預設的啟動順序來尋找可啟動的操作系統(tǒng)。

CMOS 檢查:BIOS 會讀取 CMOS 芯片中保存的配置信息,包括系統(tǒng)時間、硬件設置等,并根據這些信息進行相應的配置。

引導加載程序檢查:BIOS 會加載引導加載程序(Bootloader),該程序負責引導操作系統(tǒng)的加載和啟動。

硬件設備初始化:BIOS 會初始化各個硬件設備,包括設置硬盤參數、檢測和初始化外部設備等。

什么是 CMOS 存儲器:在 PC/AT 機中,除了需要使用內存等存儲器保存計算機常用信息之外,往往還需要一塊很小的容量(往往是 64 或 128 字節(jié))來存儲計算機的實時時鐘信息和系統(tǒng)硬件配置信息,這塊很小的容量就是 CMOS(Complementary Metal Oxide Semiconductor,互補金屬氧化物半導體)。這部分內存通常和實時時鐘芯片集成在一塊。它也是一塊集成電路。

準備工作做完后,BIOS 的工作基本上就完結了,Linux 操作系統(tǒng)運行時并不會使用 BIOS 中的功能,總的來說,BIOS 主要負責硬件設備的檢測和初始化,以及啟動操作系統(tǒng)的準備工作。

計算機啟動過程

當我們按下電源鍵的開關時,電源會馬上給主板上的硬件設備開始供電,此時電壓還不算穩(wěn),所以主板上的控制芯片組會給 CPU 發(fā)出一個 RESET(重置)信號,讓 CPU 內部自動恢復到初始狀態(tài)下,當控制芯片組檢測到電源處于平穩(wěn)狀態(tài)下后(從不穩(wěn)定到穩(wěn)定狀態(tài)只需一個瞬間),芯片組開始撤回 RESET 信號。

CPU 首先會把代碼段寄存器 CS 設置為 0xF000,其段基地址被設置為 0xFFFF0000,段長度設置為 64KB。故 IP 被設置為 0xFFF0(注意這里還不能使用 CS:IP 來尋址,因為此時還沒有完全進入實模式),此時 CPU 指針指向 0xFFFFFFF0 處,這是 4G 空間的最后一個 16KB 處,也就是 ROM BIOS 所存放的位置。

BIOS 啟動后,首先會進行 Power-On-Self-Test ,也就是開機自檢(見上面 BIOS 流程檢查操作)。ROM BIOS 這里會有一條 JMP 指令,所以當 CPU 執(zhí)行到這里的時候,會執(zhí)行 JMP 指令進行跳轉,這里是 JMP 到 BIOS 代碼 64 KB 范圍內某一條指令開始執(zhí)行。

由于目前 PC/AT 微機中 BIOS 容量為 1MB - 2MB ,并存儲在閃存(Flash Memory)ROM 中,因此為了能夠執(zhí)行或者訪問 BIOS 中超過 64 KB 范圍并且又遠遠不在 0 - 1MB 地址空間中其他 BIOS 代碼和數據,BIOS 會使用一種 32 位大模式,這樣就能夠在 0 - 4 GB 內訪問數據。

在 BIOS 執(zhí)行完一系列的自檢之后,就會把與原來 PC 機兼容的 64 KB BIOS 代碼和數據復制到內存低端 1M 末端的 64 KB 處,然后跳轉到這里并讓 CPU 真正進入實模式開始工作。

硬件自檢結束后,BIOS 會將控制轉移權交給下一階段的啟動程序,這個時候 BIOS 需要知道下一階段啟動程序在哪,這也就是我們常說的 BIOS 啟動順序,排在第一位就是優(yōu)先需要移交的程序,啟動順序可以修改。

BIOS 按照設定好的啟動順序將控制權交給第一位的存儲設備,然后從該設備中讀出 MBR ,并將程序放在 0x7c00 處的內存地址中。

0x7c00 這個地址是 IBM 機器的歷史遺留問題,它是指 32 KB內存的最后 1024 字節(jié)處。

MBR :Master Boot Record,主引導記錄,位于存儲設備中的 0 磁道 1 扇區(qū),磁盤最前面的 512 字節(jié)。

如果這 512 個字節(jié)的最后兩個字節(jié)是 0x55 和 0xAA,表明這個設備可以用于啟動;如果不是,表明設備不能用于啟動,BIOS 會繼續(xù)去找下一個設備,并將控制權轉交給啟動順序中的下一個設備。

MBR 很小,只有512字節(jié),它的主要作用是:告訴計算機在哪一個位置去找操作系統(tǒng)。

MBR 記錄中會有分區(qū)表的記錄,分區(qū)會有三種管理方式,這里就不再多說了,大家知道這會告訴計算機從哪個分區(qū)來啟動操作系統(tǒng)就可以了。然后就會把控制權交給操作系統(tǒng),進行操作系統(tǒng)的 boot ,關于操作系統(tǒng)的 boot 后面會細說。

總結

這篇文章主要介紹了 Linux 0.11 的硬件和 BIOS 相關內容。硬件是操作系統(tǒng)運行的基礎平臺,而 BIOS 則為了操作系統(tǒng)運行提供了環(huán)境支持和自檢,這兩者都是 Linux 操作系統(tǒng)運行非常重要的組成部分。

推薦器件

更多器件
器件型號 數量 器件廠商 器件描述 數據手冊 ECAD模型 風險等級 參考價格 更多信息
S25FL512SAGMFIR13 1 Spansion Flash, 512MX1, PDSO16, 0.300 INCH, LEAD FREE, PLASTIC, MO-013EAA, SOIC-16
$59.65 查看
HFBR-1414MZ 1 Foxconn Transmitter, 792nm Min, 865nm Max, 160Mbps, ST Connector, DIP, Panel Mount, Through Hole Mount, ROHS COMPLIANT PACKAGE
$26.38 查看
KSZ8999 1 Microchip Technology Inc DATACOM, LAN SWITCHING CIRCUIT, PQFP208
$23.65 查看

相關推薦

登錄即可解鎖
  • 海量技術文章
  • 設計資源下載
  • 產業(yè)鏈客戶資源
  • 寫文章/發(fā)需求
立即登錄

cxuan 寫的文章還不錯。會分享計算機底層、計算機網絡、操作系統(tǒng),Java基礎、框架、源碼等文章。