1. 程式人生 > 實用技巧 >第三章 作業系統使用者介面總結

第三章 作業系統使用者介面總結

1. 作業系統啟動過程

① BIOS加電自檢, 查詢啟動裝置

③ 主引導記錄MBR

④ 硬碟啟動

⑤ OS取得系統控制權,載入OS核心

1.1 BIOS加電自檢,查詢啟動裝置

BIOS(Basic Input/Output System)是基本輸入輸出系統的簡稱。BIOS 能為電腦提供最低階、最直接的硬體控制與支援,是聯絡最底層的硬體系統和軟體系統的橋樑。為了在關機後使 BIOS 不會丟失,早期的 BIOS 儲存在 ROM 中,並且其大小不會超過 64KB;而目前的 BIOS 大多有 1MB 到 2MB,所以會被儲存在快閃記憶體(Flash Memory)中。

1.1.1 BIOS的主要作用:

(1)CPU 加電後會首先執行 BIOS 程式,其中 POST(Power-On Self-Test)加電自檢程式是執行的第 一個例行程式,主要是對 CPU、記憶體等硬體裝置進行檢測和初始化。

(2)BIOS 中斷呼叫即 BIOS 中斷服務程式,是計算機系統軟、硬體之間的一個可程式設計介面。開機時,BIOS 會通知 CPU 各種硬體裝置的中斷號,並提供中斷服務程式。軟體可以通過呼叫 BIOS 中斷對軟盤驅動器、鍵盤及顯示器等外圍裝置進行管理。

(3)BIOS 會根據在 CMOS 中儲存的配置資訊來判斷使用哪種裝置啟動作業系統,並將 CPU 移交給作業系統使用。

1.1.2 BIOS的執行過程:

(1)在CPU加電之後,會把CPU所有暫存器的值設為預設值,除了CS暫存器的值改為0xFFFF,其他暫存器的值都為0,這樣,根據CS 和 IP的值就可以找到指令的實體地址0xFFFF:0x0000,也就是0xFFFF0。
(2)這時CPU就在這個位置開始執行,這裡存放的一條無條件跳轉指令JMP,跳轉到BIOS的真正啟動程式碼處。
(3)BIOS首先進行POST(Power-On Self Test,加電後自檢),POST的主要檢測系統中一些關鍵裝置是否存在和能否正常工作,例如記憶體和顯示卡等裝置。如果硬體出現問題,主機板會發出不同含義的蜂鳴,啟動中止。如果沒有問題,螢幕就會顯示出CPU、記憶體、硬碟等資訊。
(4)BIOS 程式在執行一些必要的開機自檢和初始化後,會將自己複製到從 0xA0000 開始的實體記憶體中並繼續執行
(5)然後,BIOS 開始搜尋可引導的儲存裝置(即根據使用者指定的引導順序從軟盤、硬碟或是可移動裝置中尋找)。如果找到,則將儲存裝置中的引導扇區讀入實體記憶體 0x7C00 處,並跳轉到 0x7C00 繼續執行,從而將 CPU 交給引導扇區中的 Boot 程式。

1.1.3 BIOS總結:

  • 不屬於硬體與軟體,屬於韌體(以硬體存在的軟體);
  • 位置:F0000——FFFFF;
  • 功能:引導啟動配置→基本的裝置I/O服務→加電自檢和自舉;

1.2 主引導記錄MBR

​ BIOS按照"啟動順序",把控制權轉交給排在第一位的儲存裝置。之後計算機載入該裝置中第一塊扇區到0x7c00,大小為512個位元組,如果這512個位元組的最後兩個位元組是0x55和0xAA,表明這個裝置可以用於啟動;如果不是,表明裝置不能用於啟動,控制權於是被轉交給"啟動順序"中的下一個裝置。這最前面的512個位元組,就叫做"主引導記錄"(Master boot record,縮寫為MBR)

1.2.1 主引導記錄的結構

主引導記錄只有512個位元組,放不了太多東西。它的主要作用是,告訴計算機到硬碟的哪一個位置去找作業系統。

主引導記錄由以下三部分組成:

(1) 第1-446位元組:呼叫作業系統的機器碼。
在CPU上電之後,若由硬碟啟動,則BIOS將硬碟的主引導記錄(位於0柱面、0磁軌、1扇區)讀入7C00處,然後將控制權交給主引導程式碼。主引導程式碼的任務包括:
① 掃描分割槽表,找到一個啟用(可引導)分割槽;

​ ② 找到啟用分割槽的起始扇區;

​ ③ 將啟用分割槽的引導扇區裝載到記憶體0x7C00處;

(2) 第447-510位元組:分割槽表(Partition table),將硬碟分成若干個區。

(3) 第511-512位元組:主引導記錄簽名(0x55和0xAA)。

1.2.2 分割槽表

​ 硬碟分割槽有很多好處,考慮到每個區可以安裝不同的作業系統,"主引導記錄"因此必須知道將控制權轉交給哪個區。分割槽表的長度只有64個位元組,裡面又分成四項,每項16個位元組。所以,一個硬碟最多隻能分四個一級分割槽,又叫做"主分割槽"

每個主分割槽16個位元組,由6個部分組成:

(1) 第1個位元組:如果為0x80,就表示該主分割槽是啟用分割槽,控制權要轉交給這個分割槽。四個主分割槽裡面只能有一個是啟用的。

(2) 第2-4個位元組:主分割槽第一個扇區的物理位置(柱面、磁頭、扇區號等等)。

(3) 第5個位元組:主分割槽型別。

(4) 第6-8個位元組:主分割槽最後一個扇區的物理位置。

(5) 第9-12位元組:該主分割槽第一個扇區的邏輯地址。

(6) 第13-16位元組:主分割槽的扇區總數。

1.3 硬碟啟動

​ 這時,計算機的控制權就要轉交給硬碟的某個分割槽了,這裡又分成三種情況。

1.3.1 情況A:卷引導記錄

​ 前面提到,四個主分割槽裡面,只有一個是啟用的。計算機會讀取啟用分割槽的第一個扇區,叫做"卷引導記錄"(Volume boot record,縮寫為VBR)。"卷引導記錄"的主要作用是,告訴計算機,作業系統在這個分割槽裡的位置。然後,計算機就會載入作業系統了。

1.3.2 情況B:擴充套件分割槽和邏輯分割槽

​ 隨著硬碟越來越大,四個主分割槽已經不夠了,需要更多的分割槽。但是,分割槽表只有四項,因此規定有且僅有一個區可以被定義成"擴充套件分割槽"(Extended partition)。所謂"擴充套件分割槽",就是指這個區裡面又分成多個區。這種分割槽裡面的分割槽,就叫做"邏輯分割槽"(logical partition)。

  • 計算機先讀取擴充套件分割槽的第一個扇區,叫做"擴充套件引導記錄"(Extended boot record,縮寫為EBR)。它裡面也包含一張64位元組的分割槽表,但是最多隻有兩項(也就是兩個邏輯分割槽)。

  • 計算機接著讀取第二個邏輯分割槽的第一個扇區,再從裡面的分割槽表中找到第三個邏輯分割槽的位置,以此類推,直到某個邏輯分割槽的分割槽表只包含它自身為止(即只有一個分割槽項)。因此,擴充套件分割槽可以包含無數個邏輯分割槽。

但是,似乎很少通過這種方式啟動作業系統。如果作業系統確實安裝在擴充套件分割槽,一般採用下一種方式啟動。

1.3.3 情況C:啟動管理器

​ 在這種情況下,計算機讀取"主引導記錄"前面446位元組的機器碼之後,不再把控制權轉交給某一個分割槽,而是執行事先安裝的"啟動管理器"(boot loader),由使用者選擇啟動哪一個作業系統。

Linux環境中,目前最流行的啟動管理器是Grub

1.4 OS取得系統控制權,載入OS核心

控制權轉交給作業系統後,作業系統的核心首先被載入記憶體。以Linux系統為例,先載入/boot目錄下面的kernel。核心載入成功後,第一個執行的程式是/sbin/init。它根據配置檔案(Debian系統是/etc/initab)產生init程序。這是Linux啟動後的第一個程序,pid程序編號為1,其他程序都是它的後代。

​ 然後,init執行緒載入系統的各個模組,比如視窗程式和網路程式,直至執行/bin/login程式,跳出登入介面,等待使用者輸入使用者名稱和密碼。

​ 至此,全部啟動過程完成。

1.5 相關概念

1.5.1 計算機工作模式

所謂工作模式,是指CPU的定址方式、暫存器大小、指令用法和記憶體佈局等;

(1)真實模式:實地址模式,計算機剛剛加電啟動時進入的模式。PC 機加電後,CPU 進入真實模式,分段管理記憶體,最多訪問 1M 地址空間(沒 ; 有開啟 A20 的情況下)。

  • 程式按照8086定址方式訪問0h-FFFFh空間(1MB)

  • 定址方式:實體地址(20位)=段地址:偏移地址

  • CPU單任務執行

(2)真實模式存取的1MB空間:

  • 00000-9FFFF(640k):基本記憶體

  • A0000-BFFFF(128K):顯示卡視訊記憶體(儲存顯示卡將要處理的資料)

  • C0000-FFFFF(256K):BIOS

    ​ C0000-C7FFF:顯示卡BIOS

   C8000-CBFFF:IDE控制器BIOS

   F0000-FFFFF:系統BIOS:完成系統啟動配置;基本的裝置I/O服務;系統的加電自檢和自舉。

(3)保護模式:記憶體保護模式,作業系統啟動以後進入的模式

  • 定址方式:段(32位)和偏移量(32位),定址4GB空間

  • 使用段頁式定址機制

  • 使用了虛擬地址的概念

  • 應用程式和作業系統都被保護起來了

  • CPU此時支援多工

reference

【作業系統原理概述】第三章 作業系統使用者介面https://blog.csdn.net/yzt629/article/details/91894818

真實模式和保護模式https://blog.csdn.net/qq_37653144/article/details/82818191

淺談作業系統-啟動過程https://blog.csdn.net/wchstrife/article/details/78879554

計算機是如何啟動的?http://www.ruanyifeng.com/blog/2013/02/booting.html

電腦到底是怎麼啟動的,可能遠不像你想的那麼簡單https://www.bilibili.com/video/BV1CJ411C72i/?spm_id_from=trigger_reload

作業系統啟動https://blog.csdn.net/weixin_30739595/article/details/95632407

華科作業系統原理第三章


2. 作業系統生成

​ 滿足特定硬體環境和使用者的需要,組裝和構建作業系統的過程

2.1 主要步驟

  • 根據硬體環境/使用者要求配置功能模組和構造引數
  • 構建OS的映像

2.2 生成前提

  • 作業系統由可拆裝模組構成
  • 有互動式配置工具
  • 有映像構建工具

例:Liunx作業系統的生成

1、獲取Liunx核心的原始碼

2、選擇和啟動核心配置程式

3、根據需要配置核心模組和引數

  • 設定對可載入模組支援
  • 設定CPU的型別
  • 對普通的一些屬性進行設定
  • 並口支援
  • 即插即用配置
  • 塊裝置支援的選項
  • 選取TCP/IP networking選項
  • 網路裝置支援的選項
  • 滑鼠設定選項
  • 檔案系統型別
  • 音效卡驅動
  • USB介面支援

4、重新編譯新的核心

5、編譯和安裝模組

6、啟動新核心

  • cp bzImage /boot/bzImage (拷貝到目錄下)
  • GRUB(配置)

reference

作業系統使用者介面——作業系統生成https://blog.csdn.net/GM_AMRC/article/details/100073558


3. 使用者介面

3.1 使用者介面概念

3.1.1 使用者介面定義

​ OS提供給使用者控制計算機的機制,又稱使用者介面。

3.1.2 使用者介面分類

(1)操作介面

(2)系統呼叫(system call,系統功能呼叫,程式介面)

3.1.3 典型的操作介面

  • 圖形介面
  • 命令介面
  • 批處理命令/程式

操作介面

  • 圖形使用者介面(GUI)

​ 視窗,圖示,選單,按鈕,滑鼠(訊息,事件)

  • 鍵盤命令(COMMAND)

​ 在控制檯環境下接收鍵盤輸入的命令

​ 型別:普通命令、批處理程式、shell

3.1.4 批處理

  • 普通命令的集合,批執行,由command解釋執行

  • 支援變數替換、條件、轉移、迴圈、註釋等簡單語法

  • *.BAT(windows字尾)

3.1.5 shell

Shell 是一個用 C 語言編寫的程式,它是使用者使用 Linux 的橋樑。Shell 既是一種命令語言,又是一種程式設計語言。

Shell 是指一種應用程式,這個應用程式提供了一個介面,使用者通過這個介面訪問作業系統核心的服務。

  • shell是作業系統與使用者互動的介面

  • 表現為通過控制檯執行使用者命令的方式

  • shell本身不執行命令,僅僅是組織和管理命令

3.1.6 Bash為現在主流的shell

Bash功能:

  • 命令列編輯功能
  • 命令和檔名補全功能
  • 命令歷史功能
  • 命令別名功能
  • 提供作業控制功能
  • 管道與重定向
  • 具有將命令序列定義為功能鍵的功能
  • shell指令碼程式設計

3.2 shell指令碼程式設計

指令碼(Script)通過類似程式的方式執行具有一定邏輯順序的命令序列完成較複雜的功能和人機互動。

  • 指令碼程式保護在文字檔案中
  • 指令碼程式是shell命令語句的集合
  • shell指令碼程式由shell環境解釋執行
  • 執行shell指令碼檔案需要具有可執行屬性:Chmod+x MyScript.sh

執行方法

1、直接執行(用預設版本的shell執行指令碼程式)

2、使用特定版本的shell執行指令碼

$bash first_script
  • 指定一個特定shell版本(此例是bash)來執行該指令碼
  • first_script逐行執行指令碼中的命令並依次輸出結果。
  • 當指令碼檔案中的命令依次執行完畢,該臨時子shell也自動結束執行,
  • 返回到使用者原來使用的shell狀態。

3、在指令碼檔案首行指定shell

  • 在指令碼開頭增加一行:

    #!/bin/bash      ——#!必須頂格,後接shell全路徑
    
  • 可從/etc/shell獲知所有可用shell及其絕對路徑。

reference

作業系統使用者介面——使用者介面https://blog.csdn.net/GM_AMRC/article/details/100075256

Shell 教程https://www.runoob.com/linux/linux-shell.html


4. 系統呼叫

4.1 系統呼叫定義

​ 作業系統核心為應用程式提供的服務/函式(使用程式碼呼叫固定函式)

4.2 特點

  • 運行於核態,每個系統都有獨一的呼叫和函式編號,呼叫過程中有“自願中斷”

4.3 linux系統呼叫

  • 應用程式隱式呼叫→編譯有INT 80h的程式碼→將使用者定義的函式轉義為核心實現→核心實現

1)作用

① 提高了系統的可擴充套件性

② 增強了系統的可靠性

③ 可移植性強

④ 提供了對分散式系統的支援

⑤ 融入了面向物件技術

2)如何使用

① 客戶只能通過以公有的方式定義的介面使用伺服器,這意味著客戶(客戶程式設計師)唯一的責任是瞭解介面。

② 伺服器(伺服器程式設計人員)的責任是確保伺服器根據該介面可靠並準確的執行。

③ 伺服器設計任務只修改設計的實現細節,而不能修改介面。

這樣程式設計師就能夠獨立的對客戶和伺服器進行改進,對伺服器的修改不會對客戶的行為造成意外的影響。

問題

1. 系統BIOS的功能有哪些?

① 系統啟動配置 ② 基本的裝置1/0服務 ③ 系統的加電自檢和啟動

2. 計算機加電後執行的第一條指令存放在哪裡,有什麼特點?

位置:第一條指令的位置在FFFF:0000,也就是實體地址FFFF0

特點:???????

reference

開機後的第一條指令https://blog.csdn.net/u010383242/article/details/50586782

3. 初始引導的目的和主要過程是什麼?

目的:把OS核心裝入記憶體,並使之開始工作接管計算機系統

主要過程:

  1. 加電,JUMP POST
  2. BIOS中的啟動程式執行
  3. 啟動程式
    • 讀取0面0道第一扇區內容(1MB)
    • 載入MBR中的載入程式
  4. 載入程式
    • 根據相關引數,讀取硬碟指定位置的檔案到記憶體
    • 載入硬碟上OS核心,並初始化基本引數
  5. OS核心:逐步載入OS剩餘部分,直至最後完全控制計算機

4. 何為作業系統的生成?簡述Linux核心的生成過程。

作業系統生成的定義:滿足特定硬體環境和使用者的需要,組裝和構建作業系統的過程

Linux核心的生成過程:

1、獲取Linux核心的原始碼
2、選擇和啟動核心配置程式
3、根據需要配置核心模組和引數
4、重新編譯新的核心
5、編譯和安裝模組
6、啟動新核心

5. 何為使用者介面?有哪些類別?各有什麼特點?

使用者介面:OS提供給使用者控制計算機的機制,又稱使用者介面。

類別:

(1)操作介面

(2)系統呼叫(system call,系統功能呼叫,程式介面)

6. 何為shell?有哪4類典型的shell?

何為shell:shell是作業系統與使用者互動的介面,表現為通過控制檯執行使用者命令的方式,shell本身不執行命令,僅僅是組織和管理命令;

4類典型的shell:

  • Bourne Again Shell (簡稱bash)

  • Bourne Shell(簡稱sh)

  • C-Shelll(簡稱csh)

  • Korn Shell(簡稱ksh)

7. 何為輸出重定向?舉一個Linux或Windows中的重定向的應用命令或例子。

輸出重定向:指不使用作業系統預設的標準輸出裝置顯示資訊,而是指定某個檔案做為標準輸出裝置來儲存檔案資訊。簡單來說,重定向輸出就是把要輸出的檔案資訊寫入到一個檔案中去,而不是將要輸出的檔案資訊輸出到控制檯(顯示屏)。

linux輸出重定向例子:

  • 將標準輸出重定向到檔案
    $ ls /etc/ >etcdir.log

8. 試述執行shell指令碼程式的三種方式?

1、直接執行(用預設版本的shell執行指令碼程式)

2、使用特定版本的shell執行指令碼

3、在指令碼檔案首行指定shell

9. 系統呼叫與普通使用者態函式比較,有何異同點?

系統呼叫:

  1. 使用INT和IRET指令,核心和應用程式使用的是不同的堆疊,因此存在堆疊的切換,從使用者態切換到核心態,從而可以使用特權指令操控裝置;
  2. 依賴於核心,不保證移植性;
  3. 在使用者空間和核心上下文環境間切換,開銷較大;
  4. 是作業系統的一個入口點;
  5. 系統呼叫由作業系統核心提供,運行於核心態;

函式呼叫:

  1. 使用CALL和RET指令,呼叫時沒有堆疊切換;
  2. 平臺移植性好;
  3. 屬於過程呼叫,呼叫開銷較小;
  4. 普通的函式呼叫由函式庫或使用者自己提供,運行於使用者態;

reference

系統呼叫和函式呼叫的區別https://blog.csdn.net/qq_31759205/article/details/80602357

給linux系統增加一個系統呼叫https://blog.csdn.net/qq_41175905/article/details/80529245

10. 何為隱式系統呼叫?

?????????????????????

11. 試述Linux系統呼叫(INT 80H)的工作原理?

12. 試述為Linux增加新的系統呼叫的過程?

  1. 新增原始碼

    第一個任務是編寫加到核心中的源程式,即將要加到一個核心檔案中去的一個函式,該函式的名稱應該是新的系統呼叫名稱前面加上sys_標誌;

  2. 連線新的系統呼叫

    新增新的系統呼叫後,下一個任務是使Linux核心的其餘部分知道該程式的存 在。為了從已有的核心程式中增加到新的函式的連線,需要編輯兩個檔案;

  3. 重建新的Linux核心

    為使新的系統呼叫生效,需要重建Linux的核心。這需要以超級使用者身份登入;

  4. 用新的核心啟動系統

    要使用新的系統呼叫,需要用重建的新核心重新引導系統。為此,需要修 改/etc/lilo.conf檔案;

  5. 使用新的系統呼叫

    在應用程式中使用新新增的系統呼叫。

reference

如何在Linux中新增新的系統呼叫

13. 記錄你電腦啟動過程中輸出的所有資訊,理解其表示什麼含義?有沒有哪些資訊是可以根據使用者配置的不同可以改變或定製的?

win7系統自啟動過程https://wenku.baidu.com/view/591cd58076a20029bd642dea.html

14. 回顧組合語言中關於暫存器結構和定義部分的知識,理解各個暫存器的基本作用和用法。

組合語言中暫存器的作用https://blog.csdn.net/cdsdtt123/article/details/41411219

15. 嘗試去理解用 menucofig命令去配置Linux核心時,配置介面上每個條目的含義和作用?

16. 在windows和Linux上練習使用輸出重定向和管道命令,給出2-3個例子。

17. 在Windows和Linux上分別練習使用批處理程式和Shell指令碼程式設計,實現“統計命令列上指定的文字檔案中所有英文單詞的個數,並在文末加上當前統計時間,例如:Checked at 2019.10.20”。寫出你的實現思路。

程式設計實驗

1. (實驗目的:熟悉Windows批處理程式設計)在Windows環境下,編寫一個批處理程式(算命大師.bat),程式執行後,輸入:出生年月日(例如20000731)。系統輸出你的屬相和星座,例如:你屬兔,獅子座。

2. (實驗目的:熟悉Linux指令碼程式設計)在Linux環境下,編寫一個Shell指令碼程式,能統計給定文字檔案的單詞數,行數。

3. (實驗目的:瞭解作業系統生成的概念,熟悉Linux核心編譯和裁剪)在Ubuntu或Fedora環境下裁剪和編譯Linux核心,並啟用新的核心。原始碼下載網址:www.kernel.org.

4. (實驗目的:熟悉Linux系統呼叫原理)在Ubuntu或Fedora環境下為Linux核心增加1-3個新的系統呼叫,並啟用新的核心,編寫一個應用程式測試新增加的系統呼叫是否能正確工作。原始碼下載網址:www.kernel.org.