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