Linux操作系統分析課程學習總結報告


Linux簡述

Linux指的是Linus Torvalds維護的(及通過主要鏡像⽹站發 布的)內核。

Linux操作系統的體系架構分為用戶態和內核態

用戶態:CPU可以執行包括特權指令在內的所有指令,可以訪問內存中的所有數據,包括外圍設備,如硬盤、網卡等。

內核態:CPU能夠執行有限范圍內的指令,只能訪問用戶進程中的數據,且不能訪問外圍設備。

Linux系統一般由4個主要部分組成:內核、shell、文件系統和應用程序。

 

 

 

內核、shell和文件系統一起形成了基本的操作系統結構,它們使得用戶可以運行程序、管理文件並使用系統。

Linux內核主要有以下幾個功能:

  1. 進程管理:保證各個進程能夠合理地利用CPU資源完成自身任務。
  2. 內存管理:管理內存資源,使得內存被進程安全使用。
  3. 文件管理:通過文件系統來組織和管理在計算機中所存儲的大量程序和數據。
  4. I/O設備管理:將鼠標、鍵盤等外設抽象為虛擬文件,Linux內核提供諸如open、write、read等接口函數對其統一管理。

一 進程管理

操作系統內核中最核心的功能是進程管理

進程是程序在處理機上的一次執行過程,它是一個動態的概念。而程序是指令的有序集合,是一個靜態的概念。

進程的上下文(context)包括進程的狀態、有關變量和數據結構的值、機器寄存器的值和PCB以及有關程序、數據等。

進程管理的核心功能大致分為四類:控制,同步,通信,調度。內核通過 SCI 提供了一個應用程序編程接口(API)來創建一個新進程(fork、exec),停止進程(kill、exit),並在它們之間進行通信和同步(signal )。

進程的狀態大體上分為:可運行態、暫停態、等待態/等待態、僵死態。

當正在執行的進程由於某種原因要讓出處理機時,系統要做進程上下文切換,以使另一個進程得以執行。

進程調度的時機:

  1. 進程狀態發生變化時
  2. 當前進程時間片用完時
  3. 進程從系統調用返回到用戶態時
  4. 中斷處理后,進程返回到用戶態時

Linux進程調度

Linux的進程調度是基於優先級的調度。Linux的進程分為普通進程和實時進程,在基於優先級的算法下實時進程的優先級高於普通進程。Linux中進程的優先級是動態的,調度程序周期性的調整他們的優先級,避免進程飢餓。調度策略:
  
  SCHED_OTHER 非實時進程,基於優先級的輪轉法

  SCHED_FIFO 實時進程,基於先進先出算法

  SCHED_RR 實時進程,基於優先權的輪轉法
  
  在可運行隊列結構中,arrays數組的兩個元素分別用來表示活動進程集合過期進程集合,active和expired兩個指針分別直接指向這兩個集合。活動進程:處於可運行狀態的進程,並且還沒有用完他們的時間片,他們等待被運行。過期進程:處於可運行狀態的進程,但已經用完了自己的時間片,在其他進程沒有用完它們的時間片之前,他們不能再被運行。

二 中斷處理

中斷分外部中斷(硬件中斷)和內部中斷(軟件中斷)。內部中斷⼜稱為異常(Exception),異常⼜分為故障(fault)和陷阱(trap)。中斷(廣義)會改變處理器執行指令的順序,通常與CPU芯片內部或外部硬件電路產生的電信號相對應。中斷是異步的:由硬件隨機產生,在程序執行的任何時候可能出現;異常是同步的:在(特殊的或出錯的)指令執行時由CPU控制單元產生。

系統調用作為一種特殊的中斷,就是利⽤陷阱(trap)這種軟件中斷⽅式主動從⽤戶態進⼊內核態的。

進程上下文是把系統提供給進程的處於動態變化的運行環境總和。

中斷上下文它是一個內核控制路徑,代表了中斷發生時正在運行的進程執行。

中斷的處理過程:

  1. 確定中斷向量。
  2. 利用中斷向量在IDT中找到對應中斷門,在中斷門中得到段選擇符從而可以從GDT中找到中斷服務例程的段基址。
  3. 確定中斷發生的特權級合法(linux只有內核態和用戶態兩種特權級,此步用來檢查中斷程序的特權是否低於引起中斷的程序的特權,低優先級程序不能引起高優先級程序)
  4. 檢查是否發生特權級變化(用戶態陷入內核態,這時候需要設置內核的堆棧),如果發生讀取當前程序的tss段(通過tr寄存器讀取)來選擇新特權級的ss和esp指針,然后保存舊的ss和esp指針。
  5. 若發生的是故障,用引起異常的指令地址修改cs和eip寄存器的值,以使得這條指令在異常處理結束后能被再次執行。
  6. 在棧中保存eflags、cs和eip的內容。
  7. 如果異常產生一個硬件出錯碼,則將它保存在棧中。
  8. 裝載cs和eip寄存器,其值分別是IDT表中第i項門描述符的段選擇符和偏移量字段。這對寄存器值給出中斷或者異常處理程序的第一條指定的邏輯地址

三、系統調用

Linux內核中設置了一組用於實現各種系統功能的子程序,稱為系統調用。用戶可以通過系統調用命令在自己的應用程序中調用它們。

系統調用和普通的函數調區別:

    系統調用由操作系統核心提供,運行於核心態;

    普通的函數調用由函數庫或用戶自己提供,運行於用戶態;

使用系統調用:

進程是不能訪問內核的。它不能訪問內核所占內存空間也不能調用內核函數,但是系統調用可以。其原理是進程先用適當的值填充寄存器,然后調用一個特殊的指令,這個指令會跳到一個事先定義的內核中的一個位置。

進程可以跳轉到的內核位置叫做sysem_call。這個過程檢查系統調用號,這個號碼告訴內核進程請求哪種服務。然后,它查看系統調用表(sys_call_table)找到所調用的內核函數入口地址。接着,就調用函數,等返回后,做一些系統檢查,最后返回到進程(或到其他進程,如果這個進程時間用盡)。如果你希望讀這段代碼,它在<內核源碼目錄>/kernel/entry.S,Entry(system_call)的下一行。

四 文件系統

Linux為上層用戶提供了一個統一的、抽象的界面來訪問文件系統,實際的文件系統必須實現符合VFS標准的接口,才能與VFS協同工作。

  • 每次open一個文件都會創建一個file對象,如果使用dup()或fork()則一個或多個進程file_sturct的fd_array條目可以指向同一個file對象;
  • file對象中的f_op被設置成指向某個具體文件系統所系統的一組操作函數;
  • file對象中還保存了文件的讀寫位置,並保存了指向該文件的inode指針,將inode串成雙向鏈表構成系統inode表。
  • 所以整體上是每個進程的文件描述符fd數組中的條目指向系統存儲file對象的表,file對象指向inode表中的條目。

 

 

五 心得體會

本學期Linux操作系統分析,通過在Linux內核上的一個簡單、虛擬、可編程的計算機硬件模擬環境mykernel上,我們編寫了一個簡單的操作系統內核、了解了操作系統內核核心功能及運行工作機;通過匯編指令觸發該系統調用,跟蹤系統調用的內核處理過程,系統調用入口的保存現場、恢復現場和系統調用返回以及內核堆棧狀態的變化;通過中斷上下文的切換分析了Linux系統的一般執行過程。通過這門課程,我發現編寫一個Linux內核並不困難,這使我對編程的學習又多了幾分信心。同時對Linux操作系統有了更深入的了解。希望老師在講課的時候可以再多介紹一些基礎知識,在做課程實驗的時候有些步驟零基礎的同學做起來還是有些困難。但是感覺老師門講課都很不錯,語言通俗易懂,適合零基礎同學入門學習。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM