国产第1页_91在线亚洲_中文字幕成人_99久久久久久_五月宗合网_久久久久国产一区二区三区四区

讀書月攻略拿走直接抄!
歡迎光臨中圖網 請 | 注冊
> >>
嵌入式C語言自我修養——從芯片、編譯器到操作系統

包郵 嵌入式C語言自我修養——從芯片、編譯器到操作系統

出版社:電子工業出版社出版時間:2021-04-01
開本: 24cm 頁數: 24,544頁
中 圖 價:¥76.7(6.5折) 定價  ¥118.0 登錄后可看到會員價
加入購物車 收藏
開年大促, 全場包郵
?新疆、西藏除外
本類五星書更多>

嵌入式C語言自我修養——從芯片、編譯器到操作系統 版權信息

嵌入式C語言自我修養——從芯片、編譯器到操作系統 本書特色

適讀人群 :嵌入式學習者、開發者,從事Linux下C語言開發工作的人員★ 多年嵌入式開發及培訓一線實戰經驗傾囊分享 ★ 內容幾乎涵蓋了嵌入式開發的所有知識點 ★ 從底層到上層,從芯片、硬件到軟件、框架 ★ 大白話寫作風格,通俗易懂,不怕學不會 ★ 在ARM平臺下講解程序的編譯、鏈接和運行原理 ★ 現場“手撕”ARM匯編代碼,剖析C函數調用、傳參過程 ★ 多角度剖析C:CPU/計算機體系結構/編譯器/操作系統/軟件工程 ★ GNU C編譯器擴展語法精講(在GNU開源軟件、Linux內核中) ★ 內存堆棧管理機制的底層剖析,從根源上理解內存錯誤 ★ 從零開始一步一步搭建和迭代嵌入式軟件框架 ★ 教你用OOP思想分析Linux內核中復雜的驅動和子系統 ★ C語言的多任務并發編程思想,CPU和操作系統零基礎入門 ★ 幫你快速構建嵌入式完整知識體系 ★ 擴充AIoT時代嵌入式新的知識點 ★ 更難能可貴的是,本書內容經過大量學員的驗證 ★ 學員說好才是真的好

嵌入式C語言自我修養——從芯片、編譯器到操作系統 內容簡介

本書從底層CPU的制造流程和工作原理開始講起, 到計算機體系結構, C程序的反匯編分析, 程序的編譯、運行和重定位, 程序運行時的堆棧內存動態變化, GNU C編譯器的擴展語法, 指針的靈活使用, C語言的面向對象編程思想, C語言的模塊化編程思想, C語言的多任務編程思想, 進程、線程和協程的概念, 從底層到上層, 從芯片、硬件到軟件、框架, 幾乎涵蓋了嵌入式開發的所有知識點。

嵌入式C語言自我修養——從芯片、編譯器到操作系統 目錄

第1章工欲善其事,必先利其器

1.1 代碼編輯工具:Vim

1.1.1 安裝Vim

1.1.2 Vim常用命令

1.1.3 Vim配置文件:vimrc

1.1.4 Vim的按鍵映射

1.2 程序編譯工具:make

1.2.1 使用IDE編譯C程序

1.2.2 使用gcc編譯C源程序

1.2.3 使用make編譯程序

1.3 代碼管理工具:Git

1.3.1 什么是版本控制系統

1.3.2 Git的安裝和配置

1.3.3 Git常用命令

第2章計算機體系結構與CPU工作原理

2.1 一顆芯片是怎樣誕生的

2.1.1 從沙子到單晶硅

2.1.2 PN結的工作原理

2.1.3 從PN結到芯片電路

2.1.4 芯片的封裝

2.2 一顆CPU是怎么設計出來的

2.2.1 計算機理論基石:圖靈機

2.2.2 CPU內部結構及工作原理

2.2.3 CPU設計流程

2.3 計算機體系結構

2.3.1 馮·諾依曼架構

2.3.2 哈弗架構

2.3.3 混合架構

2.4 CPU性能提升:Cache機制

2.4.1 Cache的工作原理

2.4.2 一級Cache和二級Cache

2.4.3 為什么有些處理器沒有Cache

2.5 CPU性能提升:流水線

2.5.1 流水線工作原理

2.5.2 超流水線技術

2.5.3 流水線冒險

2.5.4 分支預測

2.5.5 亂序執行

2.5.6 SIMD和NEON

2.5.7 單發射和多發射

2.6 多核CPU

2.6.1 單核處理器的瓶頸

2.6.2 片上多核互連技術

2.6.3 big.LITTLE結構

2.6.4 超線程技術

2.6.5 CPU核數越多越好嗎

2.7 后摩爾時代:異構計算的崛起

2.7.1 什么是異構計算

2.7.2 GPU

2.7.3 DSP

2.7.4 FPGA

2.7.5 TPU

2.7.6 NPU

2.7.7 后摩爾時代的XPU們

2.8 總線與地址

2.8.1 地址的本質

2.8.2 總線的概念

2.8.3 總線編址方式

2.9 指令集與微架構

2.9.1 什么是指令集

2.9.2 什么是微架構

2.9.3 指令助記符:匯編語言

第3章ARM體系結構與匯編語言

3.1 ARM體系結構

3.2 ARM匯編指令

3.2.1 存儲訪問指令

3.2.2 數據傳送指令

3.2.3 算術邏輯運算指令

3.2.4 操作數:operand2詳解

3.2.5 比較指令

3.2.6 條件執行指令

3.2.7 跳轉指令

3.3 ARM尋址方式

3.3.1 寄存器尋址

3.3.2 立即數尋址

3.3.3 寄存器偏移尋址

3.3.4 寄存器間接尋址

3.3.5 基址尋址

3.3.6 多寄存器尋址

3.3.7 相對尋址

3.4 ARM偽指令

3.4.1 LDR偽指令

3.4.2 ADR偽指令

3.5 ARM匯編程序設計

3.5.1 ARM匯編程序格式

3.5.2 符號與標號

3.5.3 偽操作

3.6 C語言和匯編語言混合編程

3.6.1 ATPCS規則

3.6.2 在C程序中內嵌匯編代碼

3.6.3 在匯編程序中調用C程序

3.7 GNU ARM匯編語言

3.7.1 重新認識編譯器

3.7.2 GNU ARM編譯器的偽操作

3.7.3 GNU ARM匯編語言中的標號

3.7.4 .section偽操作

3.7.5 基本數據格式

3.7.6 數據定義

3.7.7 匯編代碼分析實戰

第4章程序的編譯、鏈接、安裝和運行

4.1 從源程序到二進制文件

4.2 預處理過程

4.3 程序的編譯

4.3.1 從C文件到匯編文件

4.3.2 匯編過程

4.3.3 符號表與重定位表

4.4 鏈接過程

4.4.1 分段組裝

4.4.2 符號決議

4.4.3 重定位

4.5 程序的安裝

4.5.1 程序安裝的本質

4.5.2 在Linux下制作軟件安裝包

4.5.3 使用apt-get在線安裝軟件

4.5.4 在Windows下制作軟件安裝包

4.6 程序的運行

4.6.1 操作系統環境下的程序運行

4.6.2 裸機環境下的程序運行

4.6.3 程序入口main()函數分析

4.6.4 BSS段的小秘密

4.7 鏈接靜態庫

4.8 動態鏈接

4.8.1 與地址無關的代碼

4.8.2 全局偏移表

4.8.3 延遲綁定

4.8.4 共享庫

4.9 插件的工作原理

4.10 Linux內核模塊運行機制

4.11 Linux內核編譯和啟動分析

4.12 U-boot重定位分析

4.13 常用的binutils工具集

第5章內存堆棧管理

5.1 程序運行的“馬甲”:進程

5.2 Linux環境下的內存管理

5.3 棧的管理

5.3.1 棧的初始化

5.3.2 函數調用

5.3.3 參數傳遞

5.3.4 形參與實參

5.3.5 棧與作用域

5.3.6 棧溢出攻擊原理

5.4 堆內存管理

5.4.1 裸機環境下的堆內存管理

5.4.2 uC/OS的堆內存管理

5.4.3 Linux堆內存管理

5.4.4 堆內存測試程序

5.4.5 實現自己的堆管理器

5.5 mmap映射區域探秘

5.5.1 將文件映射到內存

5.5.2 mmap映射實現機制分析

5.5.3 把設備映射到內存

5.5.4 多進程共享動態庫

5.6 內存泄漏與防范

5.6.1 一個內存泄漏的例子

5.6.2 預防內存泄漏

5.6.3 內存泄漏檢測:MTrace

5.6.4 廣義上的內存泄漏

5.7 常見的內存錯誤及檢測

5.7.1 總有一個Bug,讓你淚流滿面

5.7.2 使用core dump調試段錯誤

5.7.3 什么是內存踩踏

5.7.4 內存踩踏監測:mprotect

5.7.5 內存檢測神器:Valgrind

第6章GNU C編譯器擴展語法精講

6.1 C語言標準和編譯器

6.1.1 什么是C語言標準

6.1.2 C語言標準的內容

6.1.3 C語言標準的發展過程

6.1.4 編譯器對C語言標準的支持

6.1.5 編譯器對C語言標準的擴展

6.2 指定初始化

6.2.1 指定初始化數組元素

6.2.2 指定初始化結構體成員

6.2.3 Linux內核驅動注冊

6.2.4 指定初始化的好處

6.3 宏構造“利器”:語句表達式

6.3.1 表達式、語句和代碼塊

6.3.2 語句表達式

6.3.3 在宏定義中使用語句表達式

6.3.4 內核中的語句表達式

6.4 typeof與container_of宏

6.4.1 typeof關鍵字

6.4.2 typeof使用示例

6.4.3 Linux內核中的container_of宏

6.4.4 container_of宏實現分析

6.5 零長度數組

6.5.1 什么是零長度數組

6.5.2 零長度數組使用示例

6.5.3 內核中的零長度數組

6.5.4 思考:指針與零長度數組

6.6 屬性聲明:section

6.6.1 GNU C編譯器擴展關鍵字:__attribute__

6.6.2 屬性聲明:section

6.6.3 U-boot鏡像自復制分析

6.7 屬性聲明:aligned

6.7.1 地址對齊:aligned

6.7.2 結構體的對齊

6.7.3 思考:編譯器一定會按照aligned指定的方式對齊嗎

6.7.4 屬性聲明:packed

6.7.5 內核中的aligned、packed聲明

6.8 屬性聲明:format

6.8.1 變參函數的格式檢查

6.8.2 變參函數的設計與實現

6.8.3 實現自己的日志打印函數

6.9 屬性聲明:weak

6.9.1 強符號和弱符號

6.9.2 函數的強符號與弱符號

6.9.3 弱符號的用途

6.9.4 屬性聲明:alias

6.10 內聯函數

6.10.1 屬性聲明:noinline

6.10.2 什么是內聯函數

6.10.3 內聯函數與宏

6.10.4 編譯器對內聯函數的處理

6.10.5 思考:內聯函數為什么定義在頭文件中

6.11 內建函數

6.11.1 什么是內建函數

6.11.2 常用的內建函數

6.11.3 C標準庫的內建函數

6.11.4 內建函數:__builtin_constant_p(n)

6.11.5 內建函數:__builtin_expect(exp,c)

6.11.6 Linux內核中的likely和unlikely

6.12 可變參數宏

6.12.1 什么是可變參數宏

6.12.2 繼續改進我們的宏

6.12.3 可變參數宏的另一種寫法

6.12.4 內核中的可變參數宏

第7章數據存儲與指針

7.1 數據類型與存儲

7.1.1 大端模式與小端模式

7.1.2 有符號數和無符號數

7.1.3 數據溢出

7.1.4 數據類型轉換

7.2 數據對齊

7.2.1 為什么要數據對齊

7.2.2 結構體對齊

7.2.3 聯合體對齊

7.3 數據的可移植性

7.4 Linux內核中的size_t類型

7.5 為什么很多人編程時喜歡用typedef

7.5.1 typedef的基本用法

7.5.2 使用typedef的優勢

7.5.3 使用typedef需要注意的地方

7.5.4 typedef的作用域

7.5.5 如何避免typedef被大量濫用

7.6 枚舉類型

7.6.1 使用枚舉的三種方法

7.6.2 枚舉的本質

7.6.3 Linux內核中的枚舉類型

7.6.4 使用枚舉需要注意的地方

7.7 常量和變量

7.7.1 變量的本質

7.7.2 常量存儲

7.7.3 常量折疊

7.8 從變量到指針

7.8.1 指針的本質

7.8.2 一些復雜的指針聲明

7.8.3 指針類型與運算

7.9 指針與數組的“曖昧”關系

7.9.1 下標運算符[]

7.9.2 數組名的本質

7.9.3 指針數組與數組指針

7.10 指針與結構體

7.11 二級指針

7.11.1 修改指針變量的值

7.11.2 二維指針和指針數組

7.11.3 二級指針和二維數組

7.12 函數指針

7.13 重新認識void

第8章C語言的面向對象編程思想

8.1 代碼復用與分層思想

8.2 面向對象編程基礎

8.2.1 什么是OOP

8.2.2 類的封裝與實例化

8.2.3 繼承與多態

8.2.4 虛函數與純虛函數

8.3 Linux內核中的OOP思想:封裝

8.3.1 類的C語言模擬實現

8.3.2 鏈表的抽象與封裝

8.3.3 設備管理模型

8.3.4 總線設備模型

8.4 Linux內核中的OOP思想:繼承

8.4.1 繼承與私有指針

8.4.2 繼承與抽象類

8.4.3 繼承與接口

8.5 Linux內核中的OOP思想:多態

第9章C語言的模塊化編程思想

9.1 模塊的編譯和鏈接

9.2 系統模塊劃分

9.2.1 模塊劃分方法

9.2.2 面向對象編程的思維陷阱

9.2.3 規劃合理的目錄結構

9.3 一個模塊的封裝

9.4 頭文件深度剖析

9.4.1 基本概念

9.4.2 隱式聲明

9.4.3 變量的聲明與定義

9.4.4 如何區分定義和聲明

9.4.5 前向引用和前向聲明

9.4.6 定義與聲明的一致性

9.4.7 頭文件路徑

9.4.8 Linux內核中的頭文件

9.4.9 頭文件中的內聯函數

9.5 模塊設計原則

9.6 被誤解的關鍵字:goto

9.7 模塊間通信

9.7.1 全局變量

9.7.2 回調函數

9.7.3 異步通信

9.8 模塊設計進階

9.8.1 跨平臺設計

9.8.2 框架

9.9 AIoT時代的模塊化編程

第10章C語言的多任務編程思想和操作系統入門

10.1 多任務的裸機實現

10.1.1 多任務的模擬實現

10.1.2 改變任務的執行頻率

10.1.3 改變任務的執行時間

10.2 操作系統基本原理

10.2.1 調度器工作原理

10.2.2 函數棧與進程棧

10.2.3 可重入函數

10.2.4 臨界區與臨界資源

10.3 中斷

10.3.1 中斷處理流程

10.3.2 進程棧與中斷棧

10.3.3 中斷函數的實現

10.4 系統調用

10.4.1 操作系統的API

10.4.2 操作系統的權限管理

10.4.3 CPU的特權模式

10.4.4 Linux系統調用接口

10.5 揭開文件系統的神秘面紗

10.5.1 什么是文件系統

10.5.2 文件系統的掛載

10.5.3 根文件系統

10.6 存儲器接口與映射

10.6.1 存儲器與接口

10.6.2 存儲映射

10.6.3 嵌入式啟動方式

10.7 內存與外部設備

10.7.1 內存與外存

10.7.2 外部設備

10.7.3 I/O端口與I/O內存

10.8 寄存器操作

10.8.1 位運算應用

10.8.2 操作寄存器

10.8.3 位域

10.9 內存管理單元MMU

10.9.1 地址轉換

10.9.2 權限管理

10.10 進程、線程和協程

10.10.1 進程

10.10.2 線程

10.10.3 線程池

10.10.4 協程

10.10.5 小結



展開全部

嵌入式C語言自我修養——從芯片、編譯器到操作系統 節選

5.7.1 總有一個Bug,讓你淚流滿面 總有一種興奮讓你不能自抑,花枝亂顫;總有一個Bug讓你夙夜難眠,淚流滿面。當一個Bug讓你毫無頭緒,讓你調到天昏地暗,到*后幾乎要放棄,開始漫無目的地亂改代碼,祈求奇跡出現時,說明你需要休息一下了:出去轉一轉,吹個風,說不定靈感乍現,一下子又有了思路…… 發生段錯誤的根本原因在于非法訪問內存,即訪問了權限未許可的內存空間。在日常編程中,有哪些行為會引發段錯誤呢? 常見的錯誤行為是訪問內存禁區。如前面的圖5-47所示的內核空間、零地址、堆和mmap區域之間的內存空間,這部分地址空間要么被內核占用,要么還處于“未開發”狀態,需要申請才能使用。這就和城郊的荒地一樣,你不能一看空著就跑過來蓋房子,你需要先獲得土地的使用權。 int main (void) { int i; i = *(int *)0x8048000; //代碼段只能讀,不能寫 *(int *)0x8048000 = 100; //段錯誤 i = *(int *)0x0; //段錯誤 return 0; } 當我們往一個只讀區域的地址空間執行寫操作時,或者訪問一個禁止訪問的地址(如零地址)時,都會發生段錯誤。在實際編程中,總會因為各種各樣的疏忽不小心觸碰到這些“紅線”,導致段錯誤。 #include int main (void) { char *p; *p = 1; return 0; } 編譯運行上面的程序,可能正常運行,也可能會發生段錯誤。在函數內定義的局部變量如果未初始化,它的值是隨機的,如果你人品大爆發,這個地址處于安全訪問區,則向這個地址寫數據是沒有大問題的,至少不會報段錯誤。如果你運氣不好,這個隨機值正好處在內核空間,你再向這個地址寫數據,則程序會立刻發生段錯誤并終止運行。 在我們調試鏈表時,通常通過指針來操作每一個節點。如果指針在遍歷鏈表時已經指向鏈表的末尾或頭部,指針已經指向NULL了,此時再通過該指針去訪問節點的成員,就相當于訪問零地址了,也會發生一個段錯誤,這個指針也就變成了非法指針。 在Linux環境下,每一個用戶進程默認有8MB大小的棧空間,如果你在函數內定義大容量的數組或局部變量,就可能造成棧溢出,也會引發一個段錯誤。內核中的線程也是如此,每一個內核線程只有8KB的內核棧,在實際使用中也要非常小心,防止堆棧溢出。 在訪問數組時,如果超越數組的邊界繼續訪問,也會發生一個段錯誤。我們使用malloc()申請的堆內存,如果不小心多次使用free()進行釋放,通常也會觸發一個段錯誤。 //double_free.c #include int main (void) { char *p; p = (char *) malloc (64); free(p); free(p); //引發段錯誤 return 0; } 程序在編譯階段出現錯誤,我們可以通過錯誤提示信息很快定位并解決。由于C語言語法檢查的寬松性,程序中對內存訪問的各種操作并不報錯,或者給一個警告信息,這會導致程序在運行期間出現段錯誤時很難定位。此時我們可以借助一些第三方工具來快速定位段錯誤。

嵌入式C語言自我修養——從芯片、編譯器到操作系統 作者簡介

王利濤 嵌入式工程師,培訓講師,多年嵌入式開發經驗,包括芯片測試、BSP、驅動開發、USB子系統等,目前在開發“嵌入式工程師自我修養”系列在線視頻教程,以及在個人博客“宅學部落”分享更多的嵌入式、Linux、AIoT技術。

商品評論(0條)
暫無評論……
書友推薦
本類暢銷
編輯推薦
返回頂部
中圖網
在線客服
主站蜘蛛池模板: 两个人看的www高清视频 | 性色综合| 成全世界免费高清观看 | 99精品高清不卡在线观看 | 欧美成人天天综合在线 | 亚色中文 | 久久久精品人妻一区亚美研究所 | 一区二区不卡视频 | 少妇人妻精品一区二区 | 特级一级毛片视频免费观看 | 毛片a区| 亚洲av综合色区无码一二三区 | 操大逼网| 一级夫妻生活片 | 欧洲1区二区三区二页 | 欧美成综合网网站 | 99热精品久久只有精品30 | 亚洲va无码va在线va天堂 | 国内精品免费视频自在线 | 在线 | 一区二区三区四区 | 国产精品亚洲欧美大片在线观看 | 亚洲 欧洲 校园 自拍 都市 | 欧美一级香蕉毛片 | 欧美大片aaa | 护士奶头又白又大又好摸视频 | 欧美区在线观看 | 亚洲一区在线免费观看 | 黑丝在线免费观看 | 男女朋友做爽爽爽免费视频网 | 国产亚洲女在线线精品 | 国产一级在线免费观看 | 亚洲欧洲无卡二区视頻 | 久久午夜一区二区 | 国产一级又色又爽又黄大片 | 在线播放成人毛片免费视 | 久久免费特黄毛片 | 一级做a爰片性色毛片新版的 | 黄色不卡视频 | 亚洲欧美日韩精品久久亚洲区色播 | 国产亚洲欧美日韩俺去了 | 免费一级a毛片在线播放视 免费一级e一片在线播放 |