-- 會員 / 註冊 --  
 帳號:
 密碼:
  | 註冊 | 忘記密碼
3/14 新書到! 12/12 新書到! 12/5 新書到! 11/30 新書到!
購書流程Q & A站務留言版客服信箱
3ds MaxMayaRhinoAfter EffectsSketchUpZBrushPainterUnity
PhotoShopAutoCadMasterCamSolidWorksCreoUGRevitNuke
C#CC++Java遊戲程式Linux嵌入式PLCFPGAMatlab
駭客資料庫搜索引擎影像處理FluentVR+ARANSYS深度學習
單晶片AVROpenGLArduinoRaspberry Pi電路設計CadenceProtel
HadoopPythonStm32CortexLabview手機程式AndroidiPhone
可查書名,作者,ISBN,3dwoo書號
詳細書籍分類

深度探索嵌入式操作系統:從零開始設計、架構和開發

( 簡體 字)
作者:彭東 著類別:1. -> 電腦組織與體系結構 -> 嵌入式系統
譯者:
出版社:機械工業出版社深度探索嵌入式操作系統:從零開始設計、架構和開發 3dWoo書號: 42630
詢問書籍請說出此書號!

缺書
NT售價: 495

出版日:10/1/2015
頁數:806
光碟數:0
站長推薦:
印刷:黑白印刷語系: ( 簡體 版 )
加入購物車 加到我的最愛
(請先登入會員)
ISBN:9787111514879
作者序 | 譯者序 | 前言 | 內容簡介 | 目錄 | 
(簡體書上所述之下載連結耗時費功, 恕不適用在台灣, 若讀者需要請自行嘗試, 恕不保證)
作者序:

譯者序:

前言:

為什么寫這本書

隨著移動互聯網技術的成熟,物聯網也開始嶄露頭角,由此產生了各種小型、低功耗的智能硬件,這些智能硬件被嵌入到移動電話、手表、冰箱、空調、電視機、洗衣機等常用電子產品中,使這些常用電子產品功能更加強大、更加智能,而且它們可以連接到網絡,便于用戶遠程操控,從而大大改善了人們的生活。

因此,嵌入式行業才變得如此火熱,那些被嵌入到電子產品中的智能硬件,也需要一些小巧、特殊的操作系統軟件才能正常工作,這類小巧、特殊的操作系統軟件,稱為嵌入式系統。2013年下半年,我開始學習嵌入式系統,并編寫了一個嵌入式操作系統—LMOSEM。在互聯網上也認識了不少研究嵌入式的朋友,在他們的要求和規勸下,我終于有勇氣把我研究出來的東西歸納、整理成冊,也算是我學習的筆記,于是就有了這本書。雖然有很多的顧慮,怕貽笑方家、怕誤導同道……但是我的每行代碼、每個點子,都在實機上測試過并證明了其正確性,所以也就心下一片坦然了。如果這本書能夠被后來者借鑒一二,或者解決他們的一些疑惑,我自然欣慰萬分。

關于LMOSEM

關于LMOSEM,這得從LMOS開始說起。2010年下半年,我開始準備要寫個操作系統內核,沒有其他目的,只是出于學習,出于興趣。由于是自己獨立從零開始設計、編寫的,我覺得自己這種行為有點瘋狂,索性用LMOS(liberty madness operating system)命名了我的操作系統。LMOS經過這幾年的獨立開發,現在已經發布了6個測試版本。先后從32位單CPU架構發展到64位多CPU架構,現在的LMOS已經是多進程、多線程、多CPU、支持虛擬內存的x86_64體系下的操作系統內核。LMOS的這些特性,非常適合通用計算機領域,如PC、工作站、小型服務器。這些特性導致LMOS代碼量龐大,一些組件不夠小巧,削剪起來非常復雜,很難保證削剪后的組件是否健壯,因此LMOS不適合于嵌入式領域,所以筆者才重新開發了LMOSEM—適合嵌入式領域的操作系統。

LMOSEM依然刪除了很多代碼,因為寫書要做到簡單,便于理解。即便如此,LMOSEM依然包含了現代操作系統的大部分重要組件,如內存管理、進程管理、驅動模型、文件系統等。這些組件的實現過程在本書中都會有詳細的介紹。LMOSEM不支持實時性功能,嵌入式操作系統也不一定要是實時性的操作系統,何況我們是出于學習的目的。為了代碼的清晰、簡單,我們暫不考慮安全性和性能方面的問題。等到明白了操作系統原理,我們再去不斷修正、優化,使之功能變得更多,性能變得更強。筆者開發的LMOSEM操作系統項目,是在Linux操作系統下開發的,用到了Linux操作系統的很多工具。筆者不會和讀者討論為什么不用常用的Windows系統,也不會說誰好、誰不好。如果讀者非常喜歡Windows系統,那么也可以嘗試著把這個項目遷移到Windows系統下。但是筆者書中演示的環境還是Linux系統。關于如何搭建開發環境,本書后面的章節有詳細的介紹。在那里讀者會發現用Linux系統開發LMOSEM內核有很多方便之處,如會用到的MAKE、GCC、LD等,這些工具在Linux系統下都很容易得到,在Windows系統下雖然也能做到,但相對麻煩一點。何況今天的Linux系統已經很好用了。

讀者對象

如果讀者是一位純粹的操作系統愛好者,對其有著濃厚的興趣,那么本書將非常適合。

如果讀者是嵌入式領域的從業者或者學生,也可以從本書中獲得很多幫助。

如果讀者是一位普通的應用軟件開發者,業余時間也可以翻翻此書,書中的一些設計方法和編程手段,或許可以借鑒一二。

如果你只是想了解一些計算機硬件系統和軟件系統的常識,那么本書同樣會讓你獲益。

如何閱讀本書

為了能更輕松地閱讀這本書,筆者建議先了解C語言這門編程語言,對數據結構有所了解就更好了。除這些外,筆者假定讀者沒有其他任何技能。除了需要的上述技能,讀者還需要對操作系統有強大的興趣和求知欲,要有堅強的意志、永遠不放棄的精神。開發操作系統內核本身就不是件容易的事,必然會有很多問題在等著我們,但是遇到問題不要害怕,靜下心從容面對,只要我們不放棄,問題最終會解決。

本書很簡單,沒有拐彎抹角,沒有反復修飾,但是必要的細節從不漏掉。寧可在細節上?嗦一點,也不在不相關的地方多寫一句。

本書的最終目的是構建一個用于學習的嵌入式操作系統內核,并工作在真正的物理機上。為了達到這一目的,本書大體上分為三部分:綜述、硬件部分和軟件部分。

綜述部分(第1章)。

第1章,先說明操作系統的概念、功能和演進歷史,最后得出現代操作系統的模型,使我們可以了解操作系統的輪廓。

硬件部分(第2∼3章)。

第2章,從選擇硬件平臺開始,首先概述硬件平臺的整體情況,接著了解編寫操作系統內核必需的一些平臺上的組件,如實時時鐘、定時器、串口、中斷控制器、內存芯片、Flash芯片、CPU、MMU等。讓讀者有初步的印象,在寫代碼用到某個組件時再詳述其內部編程細節。

第3章,詳細介紹處理器,重點介紹處理器的結構和特性、處理器的地址空間、處理器的狀態和工作模式、處理器的寄存器和指令集。最后介紹處理器中的MMU和Cache,對于MMU,主要介紹MMU的作用和它對操作系統內核開發的影響、如何對MMU編程、MMU的幾種地址映射方式。而對于Cache,重點介紹Cache的作用、Cache的類型、Cache的使用。

軟件部分(第4∼12章)。

第4章,介紹操作系統內核設計、操作系統內核的開發環境、開發操作系統內核的工具:GCC、LD、MAKE,以及它們的使用方法,最后介紹硬件平臺的安裝與測試。

第5章,首先介紹C語言使用寄存器的約定,以及它是如何處理參數、返回值的。接著介紹C語言基本數據類型的位寬及占用內存的大小,并用它們構建后面將要用到的一些基本的數據結構,如list_h_t、spinlock_t、kwlst_t、sem_t。然后介紹C語言的數據結構在內存中存在的形式、對齊方式。最后介紹GCC獨有的嵌入匯編代碼的方式。

第6章,開始介紹LMOSEM的初始化,從第一行匯編代碼開始、初始化MMU和中斷向量、初始化串口設備、初始化內存管理數據結構和中斷相應的數據結構,最后對一些數據結構進行測試。

第7章,開始介紹LMOSEM的內存管理組件。LMOSEM的內存管理組件分為三層:塊級內存管理、頁級內存管理、字級內存管理,這三個層分別應對不同的內存分配請求。本章將結合實際代碼介紹如何一步步實現這三大內存管理層。

第8章,介紹LMOSEM的中斷管理組件,內容包括中斷控制器的細節、中斷管理組件的結構、如何處理中斷、安裝中斷處理的回調函數等。

第9章,介紹LMOSEM的設備驅動模型,其中介紹LMOSEM如何管理眾多的硬件設備、LMOSEM支持的設備類型、驅動模型的數據結構和基礎性代碼,最后用兩個驅動程序實例介紹如何在LMOSEM的驅動模型下編寫規范的設備驅動程序。

第10章,介紹LMOSEM的進程管理組件,包括進程的由來、進程相關的數據結構、系統空轉進程的建立與運行、進程調度、新建進程、進程的睡眠與喚醒、進程測試等相關內容。

第11章,介紹LMOSEM的文件系統組件,包括文件系統的設計、文件系統的建立、文件系統的基礎操作、文件本身的操作,如文件的打開、新建、讀寫、刪除等。最后對文件系統組件進行嚴格的測試。

第12章,介紹LMOSEM的接口,包括許多LMOSEM的API和庫函數的實現細節,主要包括時間、進程、內存、文件與設備、標準輸入/輸出等方面的API和庫函數。

勘誤和支持

由于筆者水平有限,加之編寫時間倉促,書中難免會出現一些不準確的地方,懇請讀者批評指正,在技術之路上共勉。我的CU博客地址是:http://blog.chinaunix.net/uid/28032128.html。本書源代碼已制作成光盤鏡像文件,并上傳到華章網站(www.hzbook.com),需要的讀者可自行下載。

致謝

我,自幼患病,讀書不多,計算機成了唯一的興趣愛好,沒有父母的長期支持,連生活都尚且不能自理,更別說完成此書了,他們對我的幫助和關愛,縱使千萬言語也難表一二。由于經常在物理機上測試內核,要拆裝一些設備和器件,這多虧了我的小弟,因為他一有時間就幫我做這部分工作。當然還有幫助過我的朋友,有一些是身邊的,有些是網絡中的。對父母、所有的親人、朋友,我也只有常懷感恩之心,說聲謝謝,謝謝他們一直的支持、幫助,謝謝他們一直對我那滿滿的關愛!

讓筆者和你一起帶著未知,帶著好奇,帶著興奮,踏上操作系統的旅程吧!
內容簡介:

內容簡介

本書將是操作系統實踐領域和嵌入式操作系統領域的又一里程碑之作。
作者是計算機領域“鬼才”,獨立編寫出了多進程、多線程、多CPU、支持虛擬內存的x86_64體系下的操作系統內核,一共6個測試版本,10萬余行代碼;在此基礎之上,作者又開發出了基于ARM平臺的嵌入式系統內核。這兩個內核都可以完全運行于物理機上。
本書從硬件和軟件兩個維度系統、深度闡述嵌入式操作系統的構成、原理和實現方法,真正可以實現教讀者從零開始設計、架構和開發一個完整的、可工作的嵌入式操作系統。
硬件部分分析了所選擇的平臺及其之上的組件。先宏觀地分析了平臺的外圍組件:實時時鐘、定時器、串口、中斷控制器、內存芯片、flash芯片、CPU、MMU等,讓讀者先有個初步的印象,在寫代碼用到某個組件時再詳述其內部編程細節。接著重點分析了CPU和MMU的細節,以及內存芯片,這三個部件是程序運行的基石,所以在寫代碼之前必須詳細了解它們的細節。
軟件部分首先分析和講解了操作系統內核的功能及其所包含的組件、操作系統的架構設計、構建操作系統的工具,以及C語言的調用約定、基本的數據結構和C數據結構在內存中的鏡像;然后詳細講解了如何編寫代碼完成這些組件:初始化、內存管理、中斷管理、設備管理、進程管理、文件系統、系統調用接口、應用程序庫。對這些組件的功能、要求、硬件細節、數據結構和功能代碼做了完整且詳細的講解。系統調用接口為了顧及讀者們已有的知識體系,模擬了類UNIX調用接口,方便讀者理解核心原理。
本書始終保持這樣的結構:從硬件平臺到架構設計,到數據結構,最后落實到每行代碼,無論是針對整個操作系統,還是操作系統中的每一個組件,每一個功能模塊都保持著這樣的結構,正是因為這樣的結構,學完這本書我們每一個人都可以豪邁地說一句:“我是一個真正的操作系統實踐者。”
相信很多同行和筆者以前一樣,閱讀過很多操作系統理論方面的書籍,感覺它們所講述的理論大同小異且比較容易理解,但是真要我們自己去動手開發和實現操作系統時,我們可能連操作系統的第一行代碼該怎么寫都不知道。為什么會這樣?
因為操作系統是硬件平臺上的第一層軟件,若不了解硬件平臺的細節,是不能實現操作系統的,所以本書一開始就選擇了一款常用的硬件平臺,并對其進行了詳細描述,重點介紹了硬件平臺上的實時時鐘、定時器、串口、中斷控制器、內存芯片、flash芯片、CPU、MMU等,然后介紹操作系統架構設計和開發環境與開發工具,尤其開發工具,詳細了解開發工具會大大方便后面的開發工作并解決一些困惑,最后介紹了操作系統的初始化、HAL、內存管理、中斷管理、設備管理、進程管理、文件系統、系統調用接口、應用程序庫。對這些組件的介紹都是先明確這個組件要完成什么功能,達到什么要求。接著詳述這個組件必須要關注的硬件的細節,然后把我們的想法和設計歸納成數據結構。最后編寫完成這些功能的代碼。
這些內容將奠定本書在操作系統實踐領域中里程碑式的地位。
目錄:

前言

第1章 操作系統的功能及為什么需要它1

1.1從hello world開始1

1.2 操作系統功能演進3

1.3 小結7

第2章 硬件平臺8

2.1 選擇平臺8

2.1.1 mini24408

2.1.2 mini2440平臺的信息9

2.2 必須要關注的硬件13

2.2.1 原因14

2.2.2 RTC15

2.2.3 定時器16

2.2.4 串口17

2.2.5 中斷控制器18

2.2.6 SDRAM19

2.2.7 Norflash23

2.2.8 Nandflash24

2.3 小結26

第3章 處理器28

3.1 ARM公司與其處理器28

3.2 ARM920T的結構與特性29

3.2.1 ARM920T CPU結構29

3.2.2 ARM920T CPU特性32

3.3 ARM920T存儲體系33

3.3.1 ARM920T地址空間33

3.3.2 ARM920T存儲器格式34

3.3.3 ARM920T存儲地址對齊35

3.4 ARM920T 狀態35

3.4.1 ARM狀態36

3.4.2 Thumb 狀態36

3.5 ARM920T處理器的7種工作模式37

3.6 寄存器38

3.7 異常和中斷43

3.7.1 什么是異常和中斷43

3.7.2 異常中斷向量46

3.8 ARM920T指令集47

3.8.1 指令及其編碼格式48

3.8.2 分支跳轉指令50

3.8.3 數據處理指令53

3.8.4 裝載和存儲指令63

3.8.5 程序狀態寄存器操作指令73

3.8.6 協處理器操作指令76

3.8.7 異常中斷產生指令79

3.9 MMU80

3.9.1 MMU概述80

3.9.2 為什么要有MMU82

3.9.3 ARM920T CP15協處理器85

3.9.4 MMU 頁表98

3.9.5 MMU頁面訪問權限的控制113

3.9.6 MMU的快表TLB113

3.9.7 MMU的編程接口114

3.10 Cache115

3.10.1 ARM920T的Cache115

3.10.2 Cache的原理116

3.10.3 Cache的類型及要注意的問題117

3.10.4 ARM920T Cache的編程接口119

3.11 小結120

第4章 操作系統內核的設計與構建122

4.1 操作系統內核的設計122

4.1.1 內核要完成的功能123

4.1.2 內核的架構124

4.1.3 分離硬件的相關性126

4.1.4 我們的選擇127

4.2 開發環境及相關工具129

4.2.1 Linux環境129

4.2.2 文本編輯器132

4.2.3 GCC134

4.2.4 LD136

4.2.5 make139

4.3 LMOSEM的構建系統142

4.3.1 LMOSEM的makefile142

4.3.2 LMOSEM的鏈接腳本147

4.4 開發板的安裝150

4.5 小結154

第5章 語言間調用約定與基本數據結構156

5.1 寄存器使用約定156

5.1.1 寄存器別名157

5.1.2 參數傳遞與返回值157

5.2 基本數據結構159

5.2.1 C語言的基本數據結構160

5.2.2 list_h_t數據結構161

5.2.3 spinlock_t數據結構164

5.2.4 kwlst_t數據結構165

5.2.5 sem_t數據結構166

5.3 數據結構存在于內存中的形式168

5.4 C與匯編的混用170

5.5 小結174

第6章 內核初始化175

6.1 開始175

6.1.1 第一行匯編代碼175

6.1.2 第一個C函數178

6.2 MMU和中斷向量的初始化181

6.2.1 初始化MMU181

6.2.2 復制中斷向量186

6.3 串口初始化190

6.3.1 串口硬件190

6.3.2 內核的printf196

6.4 機器數據結構201

6.4.1 設計數據結構201

6.4.2 確定一些重要數據結構與內核的地址203

6.5 初級內存管理初始化205

6.5.1 設計一些數據結構205

6.5.2 初始化mmapdsc_t結構數組209

6.5.3 建立起內存分配數據結構212

6.6 中斷初始化215

6.6.1 設計一些數據結構215

6.6.2 初始中斷源描述符220

6.7 初始化測試222

6.8 小結225

第7章 內存管理226

7.1 內核功能層入口226

7.2 內存管理組件的設計228

7.3 塊級內存管理229

7.3.1 塊級內存管理數據結構視圖229

7.3.2 塊級內存管理接口230

7.3.3 主分配函數232

7.3.4 分配時查找alcfrelst_t 234

7.3.5 分配時查找和操作mmapdsc_t236

7.3.6 分配代碼寫得對嗎239

7.3.7 主釋放函數240

7.3.8 釋放時查找alcfrelst_t 241

7.3.9 釋放時查找和操作mmapdsc_t242

7.3.10 測試塊級內存管理層246

7.4 頁級內存管理248

7.4.1 頁級內存管理接口及調用流程248

7.4.2 相關的數據結構251

7.4.3 頁級內存管理初始化254

7.4.4 分配主函數256

7.4.5 分配時查找mplhead_t257

7.4.6 分配時新建頁級內存池258

7.4.7 分配時操作mplhead_t262

7.4.8 分配代碼寫得對嗎263

7.4.9 釋放主函數265

7.4.10 釋放時查找mplhead_t266

7.4.11 釋放時操作mplhead_t268

7.4.12 釋放時刪除頁級內存池269

7.4.13 測試頁級內存管理層271

7.5 字級內存管理273

7.5.1 字級內存接口及調用流程274

7.5.2 相關的數據結構275

7.5.3 分配主函數276

7.5.4 分配時查找mplhead_t278

7.5.5 分配時新建字級內存池279

7.5.6 分配時操作mplhead_t282

7.5.7 分配代碼寫得對嗎283

7.5.8 釋放主函數285

7.5.9 釋放時查找mplhead_t285

7.5.10 釋放時操作mplhead_t287

7.5.11 釋放時刪除字級內存池288

7.5.12 測試字級內存管理層289

7.6 小結292

第8章 中斷管理293

8.1 中斷與中斷控制器293

8.1.1 什么是中斷293

8.1.2 S3C2440A中斷控制器294

8.2 中斷管理的架構與相關數據結構298

8.2.1 中斷管理的架構298

8.2.2 設計數據結構intfltdsc_t和intserdsc_t298

8.3 中斷處理301

8.3.1 中斷輔助例程301

8.3.2 從中斷向量開始305

8.3.3 保存CPU上下文306

8.3.4 中斷主分派例程310

8.3.5 確定中斷源314

8.3.6 調用中斷處理例程317

8.4 安裝中斷回調例程319

8.5 小結322

第9章 驅動模型323

9.1 操作系統內核如何管理設備323

9.1.1 分權而治323

9.1.2 設備類型325

9.1.3 驅動程序327

9.2 相關數據結構328

9.2.1 驅動329

9.2.2 派發例程類型329

9.2.3 設備ID330

9.2.4 設備331

9.2.5 IO包332

9.2.6 設備表333

9.3 驅動模型的基礎設施335

9.3.1 驅動程序從哪里執行335

9.3.2 新建與注冊設備340

9.3.3 注冊回調函數344

9.3.4 發送IO包345

9.3.5 調用驅動程序函數346

9.3.6 等待服務347

9.3.7 完成服務350

9.3.8 驅動模型輔助函數352

9.4 systick驅動程序實例356

9.4.1 systick硬件356

9.4.2 systick驅動程序框架360

9.4.3 systick驅動程序實現362

9.4.4 測試systick驅動程序368

9.5 RTC驅動程序實例370

9.5.1 RTC硬件370

9.5.2 RTC驅動程序實現375

9.6 小結385

第10章 進程386

10.1 應用程序的運行386

10.1.1 程序運行需要什么資源387

10.1.2 任何時刻資源都可用嗎388

10.1.3 提出多道程序模型389

10.2 相關的數據結構390

10.2.1 設計進程的數據結構391

10.2.2 調度進程表392

10.3 LMOSEM內核的第一個進程394

10.3.1 進程管理組件的初始化395

10.3.2 建立空轉進程396

10.3.3 空轉進程運行399

10.4 新建進程404

10.4.1 分配進程描述符404

10.4.2 分配內存空間406

10.4.3 加入進程調度表408

10.5 進程調度410

10.5.1 調度算法410

10.5.2 處理進程時間片411

10.5.3 檢查調度狀態414

10.5.4 選擇進程415

10.5.5 進程切換418

10.5.6 進程等待與喚醒421

10.5.7 進程測試425

10.6 小結428

第11章 文件系統430

11.1 文件系統設計430

11.1.1 文件系統只是一個設備430

11.1.2 數據格式與存儲塊432

11.1.3 如何組織文件433

11.1.4 關于我們文件系統的限制434

11.2 相關的數據結構434

11.2.1 超級塊435

11.2.2 位圖435

11.2.3 目錄437

11.2.4 文件管理頭438

11.3 文件系統格式化440

11.3.1 建立超級塊440

11.3.2 建立位圖445

11.3.3 建立根目錄448

11.4 文件系統基礎操作452

11.4.1 獲取與釋放根目錄文件453

11.4.2 字符串操作455

11.4.3 分解路徑名457

11.4.4 檢查文件是否存在459

11.5 文件操作460

11.5.1 新建文件461

11.5.2 刪除文件463

11.5.3 打開文件466

11.5.4 讀寫文件469

11.5.5 關閉文件472

11.5.6 驅動整合473

11.6 文件系統測試475

11.6.1 格式化測試475

11.6.2 文件操作測試479

11.7 小結482

第12章 系統調用與應用程序庫483

12.1 系統調用機制483

12.1.1 軟中斷指令484

12.1.2 傳遞系統調用參數486

12.1.3 系統調用分發器488

12.2 時間管理系統調用489

12.3 進程管理系統調用492

12.3.1 進程的運行與退出492

12.3.2 獲取進程的ID494

12.4 內存管理系統調用496

12.5 設備與文件系統調用498

12.5.1 設備與文件的打開498

12.5.2 設備與文件的關閉506

12.5.3 設備與文件的讀寫508

12.5.4 設備與文件的控制512

12.6 應用程序庫514

12.7 測試520

12.8 小結526

后記528
序: