日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

《linux内核设计与实现》读书笔记第一、二章

發布時間:2023/12/10 linux 70 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《linux内核设计与实现》读书笔记第一、二章 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

第一章 Linux內核簡介

1.1 Unix的歷史

1971年,Unix被移植到PDP-11型機中。?
1973年,Unix操作系統用C語言改寫——為Unix系統的廣泛移植鋪平了道路。?
1977年,伯克利推出1BSD系統?
1994年,伯克利推出Unix系統的最終官方版——4.4BSD

unix強大的根本原因

(1)簡潔:僅提供系統調用并有一個非常明確的設計目的?
(2)抽象:所有東西都被當做文件對待?
(3)可移植性:使用C語言編寫,可移植能力強?
(4)進程:創建迅速,獨特的fork系統調用 ;?
(5)清晰的層次化結構:一次執行保質保量地完成一個任務,策略和機制分離的理念,簡單的進程間通信元語把單一目的的程序方便地組合在一起

1.2 追尋Linux足跡:Linux簡介

1991年,Liunx Torvalds開發了Linux

Linux的特點:?
(1)是類Unix系統,但不是Unix?
(2)沒有拋棄Unix的設計目標并且保證了應用程序編程接口的一致。?
(3)Linux系統的基礎是內核、C庫、工具集和系統的基本工具。

1.3 操作系統和內核簡介

操作系統

是指整個系統中負責完成最基本功能和系統管理的那些部分。包括

內核、設備驅動程序、啟動引導程序、命令行shell或者其他種類的用戶界面、基本的文件管理工具和系統工具。

內核

被稱作是管理者或者操作系統的核心。其組成包括:

(1)響應中斷的中斷服務程序?
(2)管理多個進程,分享處理器時間的調度程序?
(3)管理進程地址空間的內存管理程序
(4)網絡、進程間通信等系統服務程序

每個處理器在任何指定時間點上的活動必然概括為下列三者之一:

  • 運行于用戶空間,執行用戶進程
  • 運行于內核空間,處于進程上下文,代表某個特定的進程執行
  • 運行于內核空間,處于中斷上下文,與任何進程無關,處理某個特定的中斷

1.4 Linux內核和傳統Unix內核的比較

單內核和微內核設計之比較

Linux的內核雖然是基于單內核的,也具備微內核的一些特征。 主要有以下特征:

  • 支持動態加載內核模塊
  • 支持對稱多處理(SMP)
  • 內核可以搶占(preemptive),允許內核運行的任務有優先執行的能力
  • 不區分線程和進程

1.5 Linux內核版本

版本號:2.6.26.1?其中,

2 —— 主版本號?
6 —— 從版本號或副版本號?
26 —— 修訂版本號?
1 —— 穩定版本號

副版本號表示這個版本是穩定版(偶數)還是開發版(奇數),上面例子中的版本號是穩定版

1.6 Linux內核開發者社區

可以在http://vegr.kernel.org上訂閱郵件。

第二章 從內核出發

2.1 獲取內核源碼

2.1.1 使用Git

  • 獲取最新提交到版本樹的一個副本?
    $ git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git
  • 下載代碼后,更新自己的分支到最新分支?
    $ git pull

有了這兩個命令,就可以獲取并隨時保持與內核官方的代碼數一致。

2.1.1 安裝內核源代碼

內核壓縮以GNU zip和bzip2兩種

  • 壓縮形式為bzip2?
    運行:$ tar xvjf linux-x.y.z.tar.bz2
  • 壓縮形式為zip?
    運行:$ tar xvzf linux-x.y.z.tar.gz

注釋(xvjf、xvzf):

  • -x 解開;
  • -v 顯示詳細信息;
  • -j 使用bzip2程序;
  • -z 使用gzip程序;
  • -f 使用歸檔文件;

內核源碼一般安裝在/usr/src/linux目錄下。

不要以root身份對內核進行修改。

2.1.3 使用補丁

應用增量補丁,從內部代碼樹開始,只需運行

$ patch -p1 < ../patch-x,y,z

2.2 內核源碼樹

目錄說明
arch特定體系結構的代碼
block塊設備I/O層
crypo加密API
Documentation內核源碼文檔
drivers設備驅動程序
firmware使用某些驅動程序而需要的設備固件
fsVFS和各種文件系統
include內核頭文件
init內核引導和初始化
ipc進程間通信代碼
kernel像調度程序這樣的核心子系統
lib同樣內核函數
mm內存管理子系統和VM
net網絡子系統
samples示例,示范代碼
scripts編譯內核所用的腳本
securityLinux 安全模塊
sound語音子系統
usr早期用戶空間代碼(所謂的initramfs)
tools在Linux開發中有用的工具
virt虛擬化基礎結構

COPYIN:內核許可證;?
CREDITS:內核代碼的開發者列表;?
MAINTAINTERS:維護者列表——負責維護內核子系統和驅動程序;?
Makefile:是基本內核的Makefile;

2.3 編譯內核

2.3.1 配置內核

1、配置項

(1)二選一:yes/no?
(2)三選一:yes/no/module?
module:選定該配置項但編譯的時候以模塊形式生成(多用于驅動程序)

2、內核配置工具

$ make config 最簡單的一個字符界面下的命令行工具;?
$ make menuconfig 基于ncurse庫的圖形界面工具;?
$ make gconfig 基于gtk+的圖形工具;

3、內核配置命令

make config:遍歷所有配置項,并讓用戶選擇?
make deconfig:按默認的配置?
make oldconfig:在修改過配置文件之后,或者在用已有的配置文件配置新的代碼樹的時候,應該驗證和更新配置。?
zcat /proc/config.gz > .config:從/proc下復制出配置文件并且使用它來編譯一個內核

  • 配置選項CONFIGIKCONFIGPROC會把完整的壓縮過的內核配置文件存放在/proc/config.gz中,再次編譯時可以方便地克隆當前的配置。

make:默認的Makefile自動化編譯。

2.3.2 減少編譯的垃圾信息

  • 不看錯誤報告和警告信息,對輸出重定向?
    $ make > ../detritus
  • 把無用的輸出信息重定向到永無返回值的黑洞/dev/null中 $ make > /dev/null

2.3.3 衍生多個編譯作業

  • 以多個作業編譯內核?
    $ make -jn?
    j:指定同時執行多任務;n:要衍生出的作業數)

2.3.4 安裝新內核

  • 模塊的安裝,以root身份,運行?
    % make modules_install?
    這樣可以把所有已編譯的模塊安裝到正確的主目錄/lib/modules下。
  • System.map文件:編譯時在內核代碼樹的根目錄下創建的文件;是一個符號對照表;用來將內核符號與它們的起始地址對應起來。

2.4 內核開發的特點

Linux內核編程與用戶空間內應用程序開發的差異

  • Linux內核編程時不能訪問C庫
  • Linux內核編程時必須使用GNU C
  • Linux內核編程時缺乏像用戶空間那樣的內存保護機制。
  • Linux內核編程時浮點數很難使用。
  • 內核只有一個很小的定長堆棧。
  • 由于內核支持異步中斷、搶占式和SMP,因此必須時刻注意同步和并發。
  • 要考慮可移植性的重要性。

2.4.1 無libc庫抑或無標準頭文件

內核不能使用函數庫的原因:速度與大小,這些庫對內核來說太大且太低效了。

基本頭文件:內核源代碼頂級目錄下的include中
體系結構相關頭文件:內核源代碼樹的arch//include/asm目錄下?
printk()函數:運行指定一個標志來設置優先級,syslogd會根據這個優先級標志來決定在什么地方顯示這條系統消息。?
- 優先級標志是預處理程序定義的一個描述性字符串,在編譯時優先級標志就與要打印的消息綁在一起處理。

2.4.2 GNU C

  • 什么是GNU??
    GNU是一種操作系統,GNU提供的C編譯器就是我們之前使用的gcc。

1、內聯函數?
內聯函數:對時間要求比較高而本身長度比較短,一般定義在頭文件中。

  • 定義一個內聯函數,用static作關鍵字,用inline限定它。?
    static inline void wolf(unsigned long tail_size);

在內核中,為了類型安全和易讀性,優先使用內聯函數而不是復雜的宏。

2、內聯匯編

匯編語言用于偏近底層或對執行時間嚴格要求的地方。

3、分支聲明

對于條件選擇語句,在一個條件經常/很少出現時,編譯器可通過gcc內建的一條指令對條件分支選擇進行優化。?
內核把這條指令封裝成了宏。

2.4.3 沒有內存保護機制

內核中發生的內存錯誤會導致oops

內核中的內存不分頁:每用掉一個字節,物理內存都減少一個

2.4.4 不要輕易在內核中使用浮點數

與用戶空間進程不同,內核不完美支持浮點操作,因為他本身不能陷入

2.4.5 容積小而固定的棧

內核棧的準確大小隨體系結構而變?
每個體系結構對應的內核棧的大小時固定的,不能動態增長。

2.4.6 同步和并發

Linux是搶占多任務操作系統。?
Linux內核支持多處理器系統。?
中斷是異步到來的,完全不顧及當前正在執行的代碼。
Linux內核可以搶占。

2.4.7 可移植性的重要性

能提高移植性的準則

保持字節序?
64位對齊?
不假定字長和頁面長度

小結

1、很喜歡作者把章節分的很細,每一章節的內容很短,但又可以把每個部分講解清楚,讀起來不會覺得枯燥不耐煩。?
2、配合這課本的知識講解,使我對網課的學習有了更多的思考,了解到內核,其實和應用程序一樣也是一些代碼(可以用C、java或其他語言編寫),但唯一的區別就是,他們在物理內存中的組織形式不同,管理方式也不同,內核程序是管理應用程序,并為應用程序服務的。它需要更能加嚴謹的編碼,要求幾乎100%的無差錯。這是我學習完內核后的一些淺顯的理解。

參考資料

1:《Linux內核設計與實現》(原書第三版)

轉載于:https://www.cnblogs.com/java-stx/p/5284917.html

總結

以上是生活随笔為你收集整理的《linux内核设计与实现》读书笔记第一、二章的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。