加入星計劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴散
  • 作品版權(quán)保護
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長期合作伙伴
立即加入
  • 正文
    • IO 端口尋址和訪問
    • IO 數(shù)據(jù)傳輸?shù)娜N方式
    • 存儲器和 BIOS
    • 計算機啟動過程
    • 總結(jié)
  • 推薦器件
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請入駐 產(chǎn)業(yè)圖譜

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

2023/08/15
3082
閱讀需 20 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

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

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

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

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

硬件構(gòu)成

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

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

CPU

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

存儲器(內(nèi)存)

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

磁盤

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

控制器

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

總線

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

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

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

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

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

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

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

IO 端口尋址和訪問

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

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

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

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

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

端口地址范圍 說明
0x000 --- 0x01F 8237A DMA 控制器 1
0x020 --- 0x03F 8259A 可編程中斷控制器 1
0x040 --- 0x05F 8253/8254A 定時計數(shù)器
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通過設(shè)立專門的 I/O 指令,比如 x86 中的 in 就是寫入,out 就是讀出,這種方式來訪問這一空間中的地址單元(也即 I/O端口)。這種方式有個缺點,就是需要專門的匯編語言才能處理。

IO 數(shù)據(jù)傳輸?shù)娜N方式

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

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

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

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

存儲器和 BIOS

主存

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

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

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

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

0 - 640K 用于存放內(nèi)核代碼和數(shù)據(jù),從 0xA0000 開始的 128 K 用于顯示內(nèi)存緩沖區(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 會進行自檢以確保主板、內(nèi)存、顯卡、硬盤等硬件是否能夠正常工作。

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

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

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

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

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

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

計算機啟動過程

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

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

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

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

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

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

BIOS 按照設(shè)定好的啟動順序?qū)⒖刂茩?quán)交給第一位的存儲設(shè)備,然后從該設(shè)備中讀出 MBR ,并將程序放在 0x7c00 處的內(nèi)存地址中。

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

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

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

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

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

總結(jié)

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

推薦器件

更多器件
器件型號 數(shù)量 器件廠商 器件描述 數(shù)據(jù)手冊 ECAD模型 風(fēng)險等級 參考價格 更多信息
AFBR-5972EZ 1 Foxconn Transceiver,
$193.55 查看
S25FL512SAGMFIR13 1 Spansion Flash, 512MX1, PDSO16, 0.300 INCH, LEAD FREE, PLASTIC, MO-013EAA, SOIC-16
$59.65 查看
ASDMB-24.576MHZ-LC-T 1 Abracon Corporation MEMS OSC XO 24.5760MHZ LVCMOS

ECAD模型

下載ECAD模型
$2.15 查看

相關(guān)推薦

電子產(chǎn)業(yè)圖譜

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