1. 程式人生 > >操作系統基本知識(一)

操作系統基本知識(一)

兩個 code 緩沖 inline 內存管理 中斷 字節 核心 結束

計算機系統體系結構:

  1. 單處理器的計算機系統,它只有一個general purpose 的處理器,它有一個CPU來執行通用的指令集, 另外,裏面也包括一些專用的控制器(處理器),比如控制硬盤、網卡、鍵盤的等,這些控制器通常由操作系統管理;
  2. 多處理器的計算機系統,可以分為非對稱型(asymmetric multiprocessing )與對稱型(symmetric multiprocessing, SMP); 在非對稱型的多處理器系統中,由其中一個處理器控制與監督其它的處理器工作; 在對稱型的多處理器系統中,所有的處理器都是平等的。 對於多處理器計算機系統,通常每一個處理器都有自己的寄存器與緩存,所以的處理器都共享物理內存的;
    另外,現代的CPU設計,通常在一個chip上設計多個計算單元,常稱為多核處理器, 從2006年以後, 現在Intel 與AMD的CPU都本都是多核處理器了。
  3. 集群計算機系統

操作系統的相關操作:

  1. 通過雙模或多模(dual-mode or multimode) 操作 來確定 可以區分系統(內核或特權)指令還是用戶指令, 實現的方法是通過硬件增加一個mode 位來識別; 把一些危險的或特征重要的指令設為特權指令,這樣用戶就無法執行,確定操作系統的性;
  2. 使用一個timer 進行周期性的中斷,來確保了操作系統可以一直掌控著CPU的控制權. 比如,萬一個用戶進入無限循環時, 通過這麽一個中斷可以把CPU的控制權交給操作系統;

操作系統結構:

  1. 什麽是系統調用(system calls)?
    因為在用戶狀態是沒有辦法執行內核指令,怎麽辦??那就通過系統調用來完成吧。它是由操作系統內核提供的一些服務,包括:進程管理、文件操作、內存管理、通信等;
  2. 什麽是API(application programming interface)?
    它是應用程序接口, 對於應用程序編程人員是可見的。 它其實是對 系統調用的封裝,一個API可以對應一個系統調用,也可以包括多個system calls. 當編程人員使用需要使用內核功能時, 不需要直接調用系統調用,而是通過API來完成,API再去調用相應的systm calls。 為什麽這麽做??1. 為了程序的可移植性,API常常可以做到統一,而system call 的實現可以不不一樣;2. 使用API比直接使用 system call 要簡單的多。
    常用的三種API: windows系統的windows API; POSIX based 的系統(unix, linux, MAc OSX)的 POSIX API; JAVA虛擬機的 Java API;
  3. 什麽是 system call interface?
    它就是系統調用接口, 它可以截獲API中使用的系統函數調用, 然後system call interface 再調用實際的 內核函數完成任務; system call interface 起到 在API與實際的核函數之間的link 作用;
  4. 操作系統的結構組成?
    1)簡單的 monolithic 操作系統;整個內核裏包括很多東西;性能高,但是維護、調試難。
    2) 分層的結構,實現簡單;
    3)microkernel結構,把一些必要的功能加入內核,其它的都放入到用戶態裏去;
    4)模塊化的結構: 一些必要的功能在內核,加入一些可以加載的其它模塊(在內核態);
    5) hybrid system :雜交以上的;

操作系統的啟動: (講啟動過程 ,重點說了一下在加載硬盤上的 bootloader程序之前,電腦都幹了哪些事, 具體到 bootloader程序, 不同的操作系統不一樣吧)

了解一些背景知識:

1. CS:IP 兩個寄存器指示了 CPU 當前將要讀取的指令的地址,其中 CS 為代碼段寄存器,而 IP 為指令指針寄存器 。

2. 1979年,Intel 推出了8088 CPU, 8088內部數據總線都是16位,外部數據總線是8位,可以尋址 1024 KB 的內存; 1981年8088芯片首次用於IBM PC機中,開創了全新的微機時代, 它運行的操作系統也是第一代的DOS系統。也正是從8088開始,PC機(個人電腦)的概念開始在全世界範圍內發展起來。

3. PC機的設計師將8088CPU 可以尋址的 1M 中的低端640KB用作RAM,供DOS及應用程序使用, 這就是640K的基本內存; 高端的384KB常稱作上位內存, 則保留給ROM、視頻適配卡等系統使用。從此,這個界限便被確定了下來並且沿用至今。這384K中的的低128KB是顯示緩沖區,高64KB是系統BIOS(基本輸入/輸出系統)空間,中間192KB空間用於其它留用,如下圖所示。在微軟的操作系統沒有徹底脫離DOS的時候,即使你的電腦裝有幾兆或幾十兆內存,但如果你使用以DOS為核心的操作系統,那麽你也只有640K的內存可以直接使用,1M以上的內存要通過一些內存管理工具才能使用。從Windows 95開始,才不存在常規內存的限制了,所有的內存,不管是8M還是128M,都可以被直接使用。

技術分享圖片

操作系統的啟動過程:

1. 當在我們剛剛接通電源的時候,整個系統由BIOS控制,電壓還不太穩定,主板芯片組會向CPU發出reset的命令讓CPU開始初始化,同時主板芯片組等待電源發出POWE GOOD命令,一旦電源發出POWER GOOD命令,主板芯片組就會撤出 reset 的命令, 此時,這時候,CS:IP 兩個寄存器指向FFFF0H地址, CPU從 FFFF0H 地址開始執行尋址指令(這個地址是在BIOS內而不再內存裏面),在這個地址中無論是AMI BIOS還是Award BIOS,在這個地址中都會存儲一條跳轉命令,直接跳轉到系統BIOS中真正的啟動代碼處(這個代碼一定在 F0000H至 FFFFFH之間的某個地方),BIOS的代碼都是在BIOS芯片ROM中的,那個跳轉命令也是在ROM中的。

補充:為什麽是 FFFF0H的位置加入跳轉指令呢?

BIOS ROM芯片裏面的程序是在計算機出廠的時候直接燒錄在裏面的,完成一些主機自檢等操作,並提 供一些訪問磁盤等基本輸入輸出服務,由於不同的計算機廠商生產的計算機所帶的外設不一樣,因此,這段程序大小也限機型的不同而不一樣, 所以,不能把這個段代碼的地址設置為從 00000H開始, 為了解決這個問題,8086規 定,CPU均從0xFFFF0處開始執行,而在0xFFFF0處,放一條無條件轉移指令JMP,跳轉到BIOS的代碼處(這個都是廠商自己規定);

2. 運行BISO的代碼,幹什麽事呢?POST自檢!
主要的工作就是執行主機自檢(POST),當BIOS檢查到硬件正常後,按照 CMOS 中對啟動設備的設置順序檢測可用的啟動設備。BIOS將相應啟動設備的第一個扇區(也就是MBR扇區)讀入內存地址為0000:7C00H 處,並檢查MBR的結束標誌位是否等於55AAH(活動盤的標誌),若不等於則轉去嘗試其他啟動設備,如果沒有啟動設備滿足要求則顯示"NO ROM BASIC"然後死機。

補充:為什麽是07C00H處呢?(http://blog.csdn.net/bkxiaoc/article/details/50380835)

“0x7C00” 第一次出現是在 “IBM PC 5150” 的 BIOS 的 19號中斷例程中。

IBM PC 5150 是現代 x86 PC 的鼻祖,為了保證向下兼容的原則,”0x7C00”得以保留。 19號中斷例程 就是 “POST”(Power On Self Test) ,上電自檢(包括檢查是否存在驅動器),之後將啟動盤的第一分區的第一扇區的 512b 數據拷貝到 0x7c00處。 0x7c00”是由 IBM PC 5150 BIOS開發團隊決定(David Bradley博士)。

“0x7C00 = 32KiB - 1024B” 有什麽特殊含義? 是為了解決系統和 CPU 內存分布的需求!!

BIOS 決定這個地址的理由如下:
  1. 32kb是符合(DOS)系統加載的最小空間
  2. 8086/8088 0x0 - 0x3ff用於BIOS的中斷向量和BIOS數據區域。
  3. 引導扇區是512字節,boot 程序需要的數據/堆棧 大於 512 字節。
  4. 因此,0x7c00, 32KB 的最後 1024B 被選中了。

系統加電啟動後,可以自由使用 0x7c00起始的, 32KB 的最後 1024B空間。

3. 這時候就需要磁盤第一扇區上的MBR代碼了,linux與windows的代碼不一定一樣, 以linux 為例,說明:

具體參考:https://www.cnblogs.com/ronny/p/7787259.html, 寫的很明白;

操作系統基本知識(一)