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

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

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

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

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

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

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

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

硬件構(gòu)成

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

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

CPU

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

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

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

磁盤

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

控制器

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

總線

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

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

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

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

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

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

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

IO 端口尋址和訪問

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

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

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

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

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

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

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

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

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

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

中斷處理方式(Interrupt IO):由于上述的方式會(huì)讓 CPU 處于不必要的繁忙之中,所以出現(xiàn)了中斷驅(qū)動(dòng)的方法,通過中斷功能和特殊命令來(lái)通知接口,只要 I/O 設(shè)備有了需要的數(shù)據(jù),便會(huì)發(fā)出中斷請(qǐng)求信號(hào)給 CPU,CPU 才會(huì)給當(dāng)前任務(wù)進(jìn)行快照后執(zhí)行 IO 操作,CPU 通過通過使用中斷向量表來(lái)尋址中斷服務(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 進(jìn)行傳輸,當(dāng)然需要專用的 DMA 控制器來(lái)完成,這中間無(wú)需 CPU 干預(yù)。使用 DMA 方式效率比較高,在 Linux 操作系統(tǒng)中,軟盤驅(qū)動(dòng)程序使用中斷和 DMA 的方式來(lái)配合實(shí)現(xiàn)數(shù)據(jù)的傳輸工作。

存儲(chǔ)器和 BIOS

主存

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

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

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

給大家舉個(gè)例子,假如計(jì)算機(jī)有 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),它是計(jì)算機(jī)加電是首先要執(zhí)行的自檢系統(tǒng)。

BIOS 啟動(dòng)時(shí)會(huì)進(jìn)行下面這些檢查:

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

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

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

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

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

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

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

計(jì)算機(jī)啟動(dòng)過程

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

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

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

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

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

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

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

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

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

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

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

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

總結(jié)

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

推薦器件

更多器件
器件型號(hào) 數(shù)量 器件廠商 器件描述 數(shù)據(jù)手冊(cè) ECAD模型 風(fēng)險(xiǎn)等級(jí) 參考價(jià)格 更多信息
TLP187(TPL,E(T 1 Toshiba America Electronic Components 1 CHANNEL DARLINGTON OUTPUT OPTOCOUPLER
$1.25 查看
CSTCC8M00G53A-R0 1 Murata Manufacturing Co Ltd Ceramic Resonator, 8MHz Nom, CERAMIC PACKAGE-3
$0.89 查看
552AD000270DG 1 Silicon Laboratories Inc LVPECL Output Clock Oscillator, 10MHz Min, 945MHz Max, 148.5MHz Nom, ROHS COMPLIANT PACKAGE-6
暫無(wú)數(shù)據(jù) 查看

相關(guān)推薦

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

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