![]() ![]() |
操作系統(tǒng)實踐 ![]()
本書可分為兩大部分,第一部分是Linux操作與應用編程,包括Linux常用命令、C語言編程工具和典型的Linux應用開發(fā),如多進程、進程通信等,并提供一個基于開源的Qt框架和MySQL數(shù)據(jù)庫的綜合實訓案例;第二部分是Linux內核編程,這一部分緊密結合操作系統(tǒng)課程的教學內容,包含進程管理、內存管理、設備驅動程序和虛擬文件系統(tǒng)等。
作為計算機學科的核心專業(yè)基礎課程,操作系統(tǒng)的教學面臨很大的挑戰(zhàn)。
首先,在理論教學上操作系統(tǒng)描述的對象是微觀的、隱蔽的、抽象的。操作系統(tǒng)講述的模型、算法來自于與日常認識差別極大、以ns或ms秒為單位計時的計算空間(Cyberspace),這些模型、算法很難被直接觀察、真實演示。 其次,在實踐教學上操作系統(tǒng)往往面對的是具體的、整體的實際操作系統(tǒng),而幾乎每一個實際操作系統(tǒng)都是讓人望而生畏的龐然大物,都有各自的一套復雜規(guī)定和實現(xiàn)方法。 因此,無論是理論教學還是實踐教學,往往只能針對抽象后的操作系統(tǒng)普遍原理、方法及其模擬來進行。也因此,一些同學在學習操作系統(tǒng)課程后會有一個感慨: 操作系統(tǒng)理論就像一門哲學,感覺學了很多,卻又什么也沒掌握; 操作系統(tǒng)實踐就像仰望高山,看到了其大其雄,但又無從攀登。 實踐方能出真知。沒有實踐的支撐,操作系統(tǒng)的教學就是空中樓閣。在過去的十多年中,編者曾經(jīng)嘗試了多種實踐教學方法來提升教學效果,但結果都不太令人滿意,原因主要有兩個: 要么太簡單,無法真正揭示操作系統(tǒng)的內涵; 要么難度太高,很多同學難以完成。在嘗試的過程中,編者發(fā)現(xiàn)了一個現(xiàn)象: 目前操作系統(tǒng)的教材非常多,關于Windows、Linux等實際操作系統(tǒng)內核分析與編程的書籍也非常多,但與操作系統(tǒng)課程內容緊密結合、適于實踐教學的書卻很少。因此我們萌生了一個想法,能不能編寫一本以實際操作系統(tǒng)為素材、以操作系統(tǒng)授課內容為主線、以驗證實驗為主要手段的實踐教學用書,來幫助學生理解操作系統(tǒng)抽象的概念和原理呢?于是編寫了本書。 1. 本書內容 本書可分為兩部分: 第一部分是Linux操作和應用編程; 第二部分是Linux內核編程。 (1) 第一部分為第1~10章,主要是為學習過C語言、但未接觸過Linux編程的讀者提供一個快速上手的途徑。Linux應用,包括操作與編程,不光在實踐中有廣泛應用,而且對于理解Linux內核也有重要幫助。 第1、2章主要介紹Linux的基本操作和常用的Shell命令。 第3~7章是與Linux應用編程相關的內容,包含Linux平臺上的C語言開發(fā)環(huán)境、Makefile、系統(tǒng)時間、多進程程序開發(fā)、進程通信等。 第8、9章介紹目前Linux上流行的Qt框架和MySQL數(shù)據(jù)庫。 第10章綜合前面各章知識,設計了一個Linux綜合實訓案例,并給出了相應的實訓題目。 (2) 第二部分為第11~19章,基本上是按操作系統(tǒng)課程的內容結構進行編排的,目的是配合操作系統(tǒng)理論教學,使讀者對操作系統(tǒng)課程中的重要概念、理論和方法有一個直觀、具體、生動的認識。 第11章是Linux內核的配置與構建,第12章介紹Linux內核模塊編程基本流程。 第13~16章對應進程管理,包括Linux進程控制塊、多線(進)程、同步機制、進程間通信等。 第17章對應內存管理,包括Linux物理內存、段頁式尋址和虛擬地址空間管理等。 第18章對應設備管理,包括Linux設備文件、驅動程序等。 第19章對應文件系統(tǒng),包括Linux虛擬文件系統(tǒng)、文件系統(tǒng)的加載等。 另外,與本書配套的電子資源中還給出了Ubuntu系統(tǒng)的安裝方法、Linux內核常用的系統(tǒng)調用以及Shell編程等內容。 本書各章節(jié)均有數(shù)量不等的配套實驗,相應代碼均在本書的配套素材中。由于實驗較多,讀者可以根據(jù)具體情況來組合使用; 各章節(jié)包含的實驗請讀者參考本書實驗目錄。 2. 本書使用建議 讀者在使用本書時,可以根據(jù)具體情況來進行組合安排。 第一部分內容可以作為Linux應用與編程課程的相關教材和實驗用書。其中,第2章可以用于Linux基本應用實驗,第3~9章可以作為Linux應用開發(fā)實驗,其中的第3、4章是基礎,不可跳過。另外,第10章給出了一個可以用于綜合實訓的基本框架,并且在10.5節(jié)給出了部分實訓題目。 第二部分內容可以作為操作系統(tǒng)課程的配套實驗用書。如果讀者有C語言編程經(jīng)驗,但沒有Linux編程經(jīng)驗,那么可以選學第一部分的基礎內容,然后把重點放在第二部分; 如果讀者有較多Linux應用編程經(jīng)驗,可以直接從第二部分開始。第二部分各章具有較強的獨立性,但第12、13章是后續(xù)各章的基礎,請不要跳過。 本書內容以驗證性實驗為主,課后練習則是以驗證實驗為基礎的設計實驗,要求讀者自己完成。雖然是以驗證性實驗為主,但其涉及的內容遠不止實驗本身,例如在第17章的實驗3中,要把一個變量的物理地址計算出來,就需要把分頁機制完整地梳理一遍。強烈建議讀者閱讀本書時一定要運行、分析電子資源中的源代碼,結合操作系統(tǒng)教材理解其原理和機制。電子資源的網(wǎng)址為清華大學出版社(www.tup.tsinghua.edu.cn)本書頁面或http://os.sdust.edu.cn/linux/。 另外需要強調的是,本書不是系統(tǒng)講解Linux的書籍,而主要是通過實驗來幫助讀者更好地掌握操作系統(tǒng)的原理、方法和概念。因此,考慮到教學的方便性和適用性,有些內容并未包含在本書中。例如,本書并未給出系統(tǒng)調用的實驗,原因就在于添加一個新的系統(tǒng)調用必須重新編譯內核,而這個過程短則半個小時,長則1個小時以上,不適于實踐教學; 類似的原因導致進程調度實驗也未出現(xiàn)在本書中。當然讀者可以把本書作為一個臺階,進一步深入學習Linux,到那時你會發(fā)現(xiàn)Linux原來并非那么讓人望而生畏。 本書分工如下: 黃玲編寫第1~3章,李哲編寫第4~6章、11章和19章,李旭健編寫第7~10章,房勝編寫第12~18章。全書由房勝和李旭健統(tǒng)稿。本書編寫和出版過程中,得到了清華大學出版社工作人員的大力支持。此外,本書參考了很多文獻,既有操作系統(tǒng)的教材,也有Linux內核的書籍和網(wǎng)上資料,感謝這些作者。另外,張征亮、孫楠楠、高秀洋、張叢靜、李秀麗參與了本書的編寫、審校和代碼測試工作,在此一并表示感謝。 由于本書涉及內容廣泛,且Linux內核日漸龐大,不斷更新、演變,限于編者的水平,書中難免有不當甚至謬誤之處,請各位讀者不吝指正,您的支持是我們進一步努力的源動力。 作者2015年6月
第1章Linux概述
1.1Linux的發(fā)展 1.1.1Linux概念 1.1.2Linux和UNIX的淵源 1.1.3與Linux相關的協(xié)議和標準 1.2Linux的內核架構 1.2.1Linux操作系統(tǒng)結構 1.2.2Linux內核體系結構 1.2.3內核版本和獲取 1.2.4內核源代碼目錄結構 1.3Linux的主要版本 1.3.1Linux版本介紹 1.3.2Ubuntu的首次使用 1.4本章小結 習題 第2章Linux基本命令與應用 2.1認識命令行 2.1.1Terminal 2.1.2命令用法初體驗 2.1.3其他虛擬終端 2.1.4相關概念 2.2使用文本文件 2.2.1創(chuàng)建文本文件 2.2.2查看文本文件內容 2.2.3查找及統(tǒng)計 2.3目錄和文件 2.3.1目錄及文件的基本操作 2.3.2文件權限 2.4管理用戶和用戶組 2.4.1相關配置文件 2.4.2相關操作 2.5其他常見命令 2.5.1掛載和卸載設備 2.5.2安裝和卸載軟件 2.6本章小結 習題 練習 第3章從Hello Linux程序開始 3.1Hello Linux 3.1.1hello_linux的誕生 3.1.2Linux平臺C語言編碼風格 3.1.3開發(fā)工具 3.2gcc編譯 3.2.1單文件的編譯 3.2.2多個源文件的編譯 3.2.3其他介紹 3.3gdb調試 3.3.1gdb介紹 3.3.2使用gdb調試C語言文件 3.4本章小結 習題 練習 第4章利用Makefile管理一個工程 4.1第一個Makefile 4.1.1利用make編譯一個程序文件 4.1.2利用make編譯多個程序文件 4.2Makefile的基本概念與規(guī)則 4.2.1Makefile的基本概念 4.2.2規(guī)則 4.3本章小結 習題 練習 第5章Linux系統(tǒng)中的時間 5.1時間表示 5.1.1Linux系統(tǒng)時間 5.1.2Linux應用程序時間函數(shù) 5.2利用程序顯示系統(tǒng)時間 5.2.1常用時間函數(shù) 5.2.2高級時間函數(shù) 5.3時間的測量與計時 5.3.1時間測量 5.3.2計時器 5.4本章小結 習題 練習 第6章多進程程序開發(fā) 6.1進程概念 6.2進程的創(chuàng)建 6.3連續(xù)調用多次fork函數(shù) 6.4啟動外部程序 6.5本章小結 習題 練習 第7章進程間通信 7.1概述 7.2管道通信 7.2.1管道概述 7.2.2無名管道 7.2.3命名管道 7.3套接字通信 7.3.1用文件套接字實現(xiàn)本地進程通信 7.3.2用網(wǎng)絡套接字實現(xiàn)網(wǎng)絡進程通信 7.4本章小結 習題 練習 第8章利用Qt開發(fā)GUI應用程序 8.1Qt及Qt Creator 8.1.1Qt簡介 8.1.2Qt Creator 8.1.3Qt的安裝和啟動 8.1.4Qt Creator的界面組成 8.2用Qt Creator完成一個GUI項目 8.2.1創(chuàng)建Qt GUI項目 8.2.2程序的運行 8.3信號和槽 8.3.1信號和槽的概念 8.3.2用信號槽機制響應GUI事件 8.3.3關于信號槽的進一步說明 8.4Qt設計師 8.4.1簡介 8.4.2Qt設計師的功能 8.5本章小結 習題 練習 第9章MySQL數(shù)據(jù)庫 9.1安裝MySQL 9.2MySQL的基本用法 9.2.1MySQL管理 9.2.2數(shù)據(jù)庫操作 9.2.3數(shù)據(jù)類型 9.2.4表操作 9.2.5創(chuàng)建一個數(shù)據(jù)庫 9.3使用C語言訪問MySQL數(shù)據(jù)庫 9.3.1連接數(shù)據(jù)庫 9.3.2執(zhí)行SQL語句 9.3.3處理數(shù)據(jù) 9.4本章小結 習題 練習 第10章Linux綜合應用 10.1概述 10.1.1系統(tǒng)需求 10.1.2本章內容結構 10.2原型設計 10.2.1添加資源文件 10.2.2界面設計 10.2.3界面布局 10.2.4添加動作 10.3系統(tǒng)設計 10.3.1系統(tǒng)架構 10.3.2客戶端功能設計 10.3.3服務器功能設計 10.4系統(tǒng)實現(xiàn) 10.4.1數(shù)據(jù)結構(通信協(xié)議) 10.4.2客戶端實現(xiàn) 10.4.3服務器端實現(xiàn) 10.4.4幾點說明 10.5Linux應用綜合實訓 10.6本章小結 第11章構建Linux內核系統(tǒng) 11.1概述 11.2內核初始化 11.3內核配置 11.4內核構建 11.5本章小結 練習 第12章添加最簡單的Linux內核模塊 12.1用戶態(tài)與內核態(tài) 12.1.1C/C++應用程序的運行機制 12.1.2Linux內核模塊 12.2添加最簡單的Linux內核模塊 12.2.1LKM代碼框架 12.2.2LKM編譯 12.2.3kello.c的編譯、添加和刪除 12.2.4LKM與C應用程序的差異 12.3printk和某些常見宏 12.3.1實時顯示內核模塊運行信息 12.3.2顯示位置信息 12.4本章小結 練習 第13章基于proc的Linux進程控制塊信息讀取 13.1proc偽文件系統(tǒng) 13.1.1proc中的文件 13.1.2proc中文件的內容 13.1.3proc偽文件系統(tǒng)介紹 13.2Linux中的進程控制塊 13.2.1Linux進程控制塊task_struct 13.2.2進程重要信息解讀 13.3通過proc讀取Linux進程信息 13.3.1創(chuàng)建proc文件 13.3.2基于seq_file機制的proc文件操作 13.3.3task_struct信息讀取過程 13.3.4tasklist內核模塊編譯和添加 13.3.5tasklist內核模塊工作流程 13.4task_struct重要信息 13.4.1Linux進程調度策略 13.4.2進程優(yōu)先級 13.4.3進程控制塊中的其他信息 13.5向proc文件寫入數(shù)據(jù) 13.5.1用戶空間和內核空間之間傳遞數(shù)據(jù) 13.5.2內核空間內存分配 13.5.3proc文件的寫操作函數(shù) 13.6本章小結 習題 練習 第14章POSIX多任務及同步機制 14.1fork創(chuàng)建進程 14.1.1fork創(chuàng)建進程的流程 14.1.2fork/exec創(chuàng)建進程的流程 14.1.3fork進階問題 14.2POSIX線程機制 14.2.1POSIX概述 14.2.2POSIX線程創(chuàng)建 14.3POSIX多線程及同步機制 14.3.1多個線程的資源競爭訪問 14.3.2POSIX同步機制 14.4條件變量與生產(chǎn)者消費者問題 14.4.1同步與互斥 14.4.2POSIX條件變量 14.4.3條件變量在生產(chǎn)者消費者問題中的應用 14.5本章小結 習題 練習 第15章用戶態(tài)和內核態(tài)信號量 15.1信號量與同步問題 15.1.1信號量概述 15.1.2同步問題 15.2POSIX信號量 15.2.1無名信號量 15.2.2有名信號量 15.2.3POSIX信號量用于線程同步問題 15.2.4POSIX信號量用于進程間同步 15.2.5Linux中的信號量技術 15.3內核信號量和內核線程 15.3.1Linux內核信號量 15.3.2Linux內核線程 15.3.3內核信號量和線程的例子 15.3.4Linux內核同步技術 15.4本章小結 習題 練習 第16章基于共享內存的進程間通信 16.1共享內存 16.2共享內存映射文件 16.2.1單個進程的內存映射文件 16.2.2多個進程間的內存映射文件的同步 16.3POSIX共享內存對象 16.4本章小結 習題 練習 第17章Linux內存管理 17.1Linux物理內存管理機制 17.1.1內存結點node 17.1.2內存結點zone 17.1.3物理頁框page 17.2IA32的尋址機制 17.2.1IA32的段機制 17.2.2IA32的頁面映射機制 17.2.3IA32中的控制寄存器以及PAE、PSE 17.3IA32結構上的Linux地址映射機制 17.3.1Linux中段地址映射機制 17.3.2IA32 Linux段地址映射實驗 17.3.3IA32 Linux頁地址映射 17.3.4IA32 Linux頁地址映射實驗 17.4Linux進程地址空間 17.4.1Linux中進程的虛擬地址空間 17.4.2獲取進程虛擬地址空間信息 17.4.3Linux中進程的虛擬存儲區(qū)域vma 17.4.4獲取進程的虛擬內存區(qū)域信息 17.4.5Linux中進程、內存和文件的關系 17.5本章小結 習題 練習 第18章Linux設備驅動程序 18.1概述 18.1.1設備管理基本概念 18.1.2Linux字符設備管理 18.2字符設備CMOS驅動程序 18.2.1CMOS RTC信息 18.2.2獲取CMOS RTC信息的驅動程序內核模塊 18.2.3CMOS RTC驅動程序內核模塊測試 18.3基于內存映射的雜項設備驅動程序 18.3.1Linux中的雜項設備 18.3.2設備驅動中的內存映射 18.3.3基于內存映射的雜項設備驅動程序 18.3.4測試 18.4本章小結 習題 練習 第19章Linux虛擬文件系統(tǒng) 19.1概述 19.1.1VFS在Linux中的作用 19.1.2VFS支持的文件系統(tǒng)類型 19.1.3VFS的基本數(shù)據(jù)結構 19.2VFS對象的操作 19.2.1注冊文件系統(tǒng) 19.2.2文件系統(tǒng)裝載 19.2.3與進程相關的文件系統(tǒng)數(shù)據(jù)結構 19.2.4從當前進程訪問Linux內核VFS文件系統(tǒng) 19.3proc文件系統(tǒng) 19.3.1主要數(shù)據(jù)結構 19.3.2proc文件系統(tǒng)的操作 19.4本章小結 習題 練習 參考文獻 實驗目錄 第2章Linux基本命令與應用 實驗1: 認識命令行的相關實驗 實驗2: 創(chuàng)建文本文件 實驗3: 查看文本文件 實驗4: 文本文件查找及統(tǒng)計 實驗5: 目錄及文件基本操作 實驗6: 文件權限 實驗7: 管理用戶和用戶組 實驗8: 其他常見操作 第3章從Hello Linux程序開始 實驗1: 簡單程序開發(fā) 實驗2: 單步編譯和多步編譯 實驗3: 瀏覽gdb內置命令 實驗4: 利用gdb調試程序 第4章利用Makefile管理一個工程 實驗1: Makefile與命令行編譯的比較 實驗2: 編寫Makefile 第5章Linux系統(tǒng)中的時間 實驗1: 編程顯示系統(tǒng)時間 實驗2: Linux中的時間測量 實驗3: Linux中的計時器 第6章多進程程序開發(fā) 實驗1: 利用fork創(chuàng)建進程 實驗2: 連續(xù)調用多次fork函數(shù) 實驗3: 啟動外部程序 第7章進程間通信 實驗1: 管道通信 實驗2: 文件套接字通信 實驗3: 網(wǎng)絡套接字通信 第8章利用Qt開發(fā)GUI應用程序 實驗1: Qt的安裝與啟動 實驗2: 創(chuàng)建Qt GUI項目 實驗3: 信號槽機制 第9章MySQL數(shù)據(jù)庫 實驗1: MySQL數(shù)據(jù)庫操作 實驗2: MySQL表操作 實驗3: 創(chuàng)建一個MySQL數(shù)據(jù)庫 實驗4: 用C語言訪問MySQL數(shù)據(jù)庫 第12章添加最簡單的Linux內核模塊 實驗1: 添加最簡單的內核模塊kello 實驗2: 內核模塊輸出信息顯示 第13章基于proc的Linux進程控制塊信息讀取 實驗1: 測試proc文件系統(tǒng)功能 實驗2: 創(chuàng)建顯示系統(tǒng)進程信息的proc模塊 實驗3: 顯示Linux進程控制塊中更多的信息 第14章POSIX多任務及同步機制 實驗1: Linux進程創(chuàng)建 實驗2: POSIX線程創(chuàng)建 實驗3: POSIX線程互斥和參數(shù)傳遞 實驗4: 使用POSIX條件變量實現(xiàn)線程同步 第15章用戶態(tài)和內核態(tài)信號量 實驗1: 使用POSIX信號量實現(xiàn)線程同步 實驗2: 使用POSIX信號量實現(xiàn)進程同步 實驗3: 創(chuàng)建Linux內核線程并使用內核信號量實現(xiàn)同步 第16章基于共享內存的進程間通信 實驗1: 使用內存映射文件實現(xiàn)進程間通信 實驗2: 使用共享內存對象實現(xiàn)進程同步 第17章Linux內存管理 實驗1: 獲取IA32段寄存器中的描述符 實驗2: 獲取IA32中的全局段表信息 實驗3: 獲取C程序中一個邏輯地址對應的物理地址 實驗4: 顯示進程的虛擬內存地址空間分布信息 實驗5: 獲取一個進程的虛擬存儲區(qū)域信息 第18章Linux設備驅動程序 實驗1: 實現(xiàn)讀取CMOS實時時鐘信息的驅動程序 實驗2: 實現(xiàn)一個基于內存映射的設備驅動程序 第19章Linux虛擬文件系統(tǒng) 實驗1: 訪問Linux內核虛擬文件系統(tǒng) 實驗2: 加載newproc文件系統(tǒng)
你還可能感興趣
我要評論
|