1. 程式人生 > >《Linux4.0裝置驅動開發詳解》筆記--第二章:Linux核心及核心程式設計

《Linux4.0裝置驅動開發詳解》筆記--第二章:Linux核心及核心程式設計

2.1 Linux核心發展及演變

  • 1991年10月5日 Linus Torvalds建立
  • 五個支柱:Unix系統、Minix系統、GNU計劃、POSIX標準和Internet
  • 每2-3個月更新一次大的版本號

2.2 Linux2.6後的核心特點

  1. 新的排程器:高負荷下的出色效能,更好的處理器擴充套件,採用CFS演算法,新增排程類:SCHED_DEADLINE,它實現了EDF(最早截止期限優先)演算法
  2. 核心搶佔:提高系統的實時性,增強系統的互動性,但也有不可搶佔的空間:中斷上下文、軟中斷上下文和自旋鎖的區間,如果打上RT-Preempt補丁,即可支援硬實時。
  3. 改進執行緒模型:採用NPTL(本地POSIX執行緒庫)模型,操作速度極大提高,更加遵循POSIX規範
  4. 虛擬化記憶體變化:融合了r-map(反向對映,通過頁結構快速找到頁面的對映)技術,改善虛擬記憶體在一定大小負載下的效能
  5. 檔案系統:新增基於B樹的Btrfs,是下一代的Linux檔案系統
  6. 音訊:高階Linux音訊體系結構ALSA取代缺陷很多的OSS,支援USB音訊和MIDI裝置,並支援雙工重放等功能
  7. Linux3.7以後實現一個Linux可以適用於所有的arm系統

2.3 Linux核心組成

2.3.1 Linux核心程式碼的目錄結構

  • arch:和硬體體系結構相關的程式碼,每個平臺每個目錄
  • block:塊裝置驅動的I/O排程
  • crypto:常用加密和雜湊演算法,還有一些壓縮以及CRC校驗演算法
  • documentation:核心各部分的通用解釋和註釋
  • fs:支援的各種檔案系統
  • include:核心API級別的標頭檔案,與系統相關的標頭檔案放在include/linux子目錄下
  • init:核心程式碼的初始化程式碼
  • ipc:程序間通訊程式碼
  • lib:庫檔案程式碼
  • mm:記憶體管理程式碼
  • script:配置核心的指令碼檔案
  • usr:用於打包和壓縮的cpio等

2.3.2 核心組成部分

  • 程序排程:多數程序是由使用者空間建立,通過系統呼叫進入核心空間,核心程式設計是可以啟動核心執行緒來處理併發任務,這些執行緒沒有使用者空間
  • 記憶體管理:控制多個程序安全的共享記憶體區域,通過MMU完成程序從虛擬空間向物理空間的轉換
  • 虛擬檔案系統:隱藏各個硬體的具體細節,為所有的裝置提供了統一的介面,是檔案系統的抽象
  • 網路介面:對各種網路標標準的存取和各種網路硬體的支援,分為網路協議和網路驅動程式
  • 程序間通訊:訊號量、共享記憶體、訊息佇列、管道以及Unix域套接字等

2.3.3 核心空間和使用者空間

  • 核心可以進行任何操作,但應用程式被禁止對硬體的直接訪問和對記憶體的未授權訪問
  • 這兩個名詞用來區分程式執行的兩種不同的狀態,他們使用不同的地址空間,使用者空間可以通過系統呼叫和硬體中斷來訪問核心空間

2.4 核心的編譯及載入

2.4.1 Linux核心配置系統組成

  • Makefile:分佈於核心原始碼
  • 配置檔案(Kconfig):給使用者提供配置選項
  • 配置工具:命令解析器和配置使用者介面,都是指令碼語言
  • 通過make config、make menuconfig生成.config檔案記錄哪部分被編入核心,哪部分被編譯成模組
  • source可以引入每一層的Kconfig

2.4.2 Kconfig和Makefile

2.4.2.1linux增加程式需要完成以下3項工作

  • 將編寫的原始碼複製到Linux核心原始碼相應得目錄中
  • 在目錄的Kconfig檔案中增加關於原始碼相應的編譯配置選項
  • 在目錄的Makefile檔案中增加對新原始碼的編譯條目

2.4.1.2Makefile語法規則

  • 目標定義:用來定義哪些內容要作為模組編譯,哪些要編譯並連結進核心,如:obj-y/m/n += foo.o,obj-$(CONFIG_ISDN) += isdn.o
  • 多檔案模組的定義:如下,模組名為ext2,有balloc.o、dir.o等目標檔案最終連結生成ext2.o直至ext2.ko檔案,是否包含xattr.o、acl.o等檔案取決於核心配置檔案的配置情況。
obj-$(CONFIG_EXT2_FS) += ext2.o
ext2-y :=balloc.o dir.o file.o ...
ext2-$(CONFIG_EXT2_FS_XATTR) += xattr.o xattr_user.o ...
ext2-$(CONGIF_EXT2_FS_XIP) += xip.o
  • 目標層次迭代:如下, 當CONFIG_EXT2_FS的值為y或者m時,kbuild將會把ext2目錄列入向下的目錄中
obj-$(CONFIG_EXT2_FS) += ext2/

2.4.2.3Kconfig語法規則

配置選項

大多數核心配置選項對應的Kconfig中的一個配置選項,”config” 關鍵字定義新的配置選項,之後的幾行程式碼定義了誒配置選項的屬性。配置選項的屬性包含:型別,資料提示,依賴關係,選擇關係以及幫助資訊、預設值等

config MODVERSIONS
    bool "Module versioning support"
    help
        Usually, you have to use modules compiled with your kernel.
        Saying Y here makes it ...
  • 每個配置選擇必須包含指定的型別,包括bool,tristate, string, hex 和int,其中tristate和string是基本的型別,其他型別都是基於這兩種型別,型別定以後可以緊跟輸入提示,下面兩段指令碼是等價的
bool "Networking support"bool
prompt "Networking support"
  • 輸入提示的一般格式為以下形式,其中可選的if用來表示該提示的依賴關係。
prompt <prompt> [if <expr>]

預設值的格式為以下形式,如果使用者不設定對應的選項則配置選項的值就是預設值

default <expr> [if <expr>]
  • 依賴關係的格式為以下形式,多重依賴中間要用“&&”間隔
depends on (或者requires) <expr>

依賴關係也可以用在選單中的其他選項,如下兩段指令碼是等價的

bool "foo" if BAR
default y if BAR
和
depends on BAR
bool "foo"
default y
  • 選擇關係的格式如下,如果A選擇了B,那麼A選中的情況下自動選中B
select <symbol> [if <expr>]
  • 資料範圍格式如下
range <symbol> <symbol> [if <expr>]
  • Kconfig中的expr定義如下
<expr> :: <symbol>
            <symbol> '=' <symbol>
            <symbol> '!' <symbol>
            '(' <expr> ')'
            '!' <expr>
                <expr> '&&' <expr>
                <expr> '||' <expr>

symbol分為兩類,一類由選單入口配置項定義的非常數symbol,另一類是作為expr組成部分常數symbol。比如

config SHDMA_R8A73A4
       def_bool y
       depends on ARCH_R8A73A4 && SH_DMA != n

表示式“depends on ARCH_R8A73A4 && SH_DMA !=n”暗示只有當ARCH_R873A4被選中,而SH_DMA沒有選中的時候,才可能出現這個SHDMA_R8A73A4。

  • 為int和hex型別的選項設定可以接受的輸入值範圍,使用者只能輸入大於等於第一個symbol,且小於等於第二個symbol的值
  • 幫助資訊的格式為
help(或---help---)
    開始
    ...
    結束

選單結構

配置選項在選單結構的中的位置可有兩種方法決定。
第一種方法為:

menu "Network device support"
    depends on NET
config NETDEVICES
    ...

所有處於“menu”和“endmenu”中的選項都會成為“Network device support”的子選單,而且,所有的子選單(config)選項都會繼承父選單(menu)的依賴關係,比如,“Network device support”對“NET”的依賴會被載入到配置選項NETDEVICES的依賴列表中。
注意:menu後面跟的“Network device support”項僅僅是一個選單,沒有對應真實的匹配項,也不具備不同的三種狀態,這與config的區別。

另一種方法為:
同過分析依賴關係生成選單結構。如選單項在一定程度上依賴與前面的選項,他就能成為該選項的子選單。如果父選項為“n”,子選項不可見;如果父選項可見,子選項才可見。例如:

config MODULES
    bool "Enable loadable module support"

config MODVERSIONS
    bool "Set version information on all module symbol"
    depends on MODULES

comment "module support disabled"
    depends on !MODULES

MODVERSIONS直接依賴MODULES,只有MODULES不為“n”時,該選項才可見。
除此之外,Kconfig中還可能使用“choices … endchoice”、”comment”、“if…endif”這樣的語法結構。其中“choices … endchoice”的結構

choice
<choice options>
<choice block>
endchoice

它定義一個選擇群,其接受的選項(choice potions)可以是前面描述的任何屬性,例如,LDD6410的VGA輸出解析度可以是1024*768或者是800*600,在driver/video/samsung/Kconfig中就定了如下choice

choice
depends on FB_S3C_VGA
prompt "Select VGA Resolution for S3C Framebuffer"
default FB_S3C_VGA_1024_768
config FB_S3C_VGA_1024_768
    bool "1024*[email protected]"
    ---help---
    TBA
config FB_S3C_VGA_640_480
    bool "640*[email protected]"
    ---help---
    TAB
endchoice

上述例子中,prompt配合choice起到提示的作用。
具體例子見《Linux裝置驅動開發詳解》第三版 P72-73

2.4.3 Linux核心的引導

  1. 上電 => SOC嵌入bootrom 引導=> CPU0上的bootloader
  2. 其他非CPU0進入WFI狀態等待CPU0喚醒
  3. CPU0引導bootloader喚醒非CPU0,喚醒後和CPU0都投入執行
  4. CPU0導致使用者空間的init程式被呼叫,init派生出其他程序,其他程序在派生出其他程序
  5. zimage:是由未壓縮的解壓演算法和壓縮的核心組成,bootloader負責解壓

相關推薦

Linux4.0裝置驅動開發筆記--第十八ARM Linux裝置

18.1 ARM裝置樹簡介 裝置舒適一種描述印鑑的資料結構,它起源於OpenFirmware(OF) 採用裝置樹前後對比: 採用裝置樹之前:ARM架構的板極硬體細節過多的被硬編碼在arch/arm/plat-xxx和arch/arm/mach-xxx中

Linux4.0裝置驅動開發筆記--第二Linux核心核心程式設計

2.1 Linux核心發展及演變 1991年10月5日 Linus Torvalds建立 五個支柱:Unix系統、Minix系統、GNU計劃、POSIX標準和Internet 每2-3個月更新一次大的版本號 2.2 Linux2.6後的核心特點

Linux裝置驅動開發 第3版 (即 Linux裝置驅動開發 基於最新的Linux 4 0核心 )進展同步更

                本博實時更新《Linux裝置驅動開發詳解(第3版)》的最新進展。 目前已經完成稿件。 2015

linux裝置驅動開發筆記——15 linux i2c驅動

  結合實際程式碼和書中描述,可能跟書上有一定出入。本文後續晶片相關程式碼參考ZYNQ。 15.1 總體結構   如下圖,i2c驅動分為如下幾個重要模組 核心層core,完成i2c匯流排、裝置、驅動模型,對使用者提供sys檔案系統訪問支援;為i2c內部adpter等提供註冊介面。  adpter,介面卡,實

關於召回《Linux裝置驅動開發-基於最新的Linux 4.0核心》的通知

問題描述關於《Linux裝置驅動開發詳解:基於最新的Linux 4.0核心》一書1.華章分社在沒

LinuxLinux裝置驅動開發基於最新的Linux 4.0核心

1 Linux裝置驅動概述及開發環境構建 1.1 裝置驅動的作用 驅使硬體裝置行動 1.2 無作業系統時的裝置驅動 典型架構:一個無限迴圈中夾雜著對裝置中斷的檢測或者對裝置的輪詢 1.3 有作業系統時的裝置驅動 併發 、記

Linux裝置驅動開發基於最新的Linux 4.0核心》一刷勘誤

這是第一次印刷的勘誤,大部分應該買的都是5刷了,這些錯誤基本已經絕跡。還是有部分童鞋買的書老書,

Linux裝置驅動開發》-- 互斥體(mutex)

儘管訊號量已經可以實現互斥的功能,而且包含 DECLARE_MUTEX() 、init_MUTEX ()等定義訊號量的巨集或函式, 從名字上看就體現出了互斥體的概念, 但是mutex 在 Linux 核心中還是真實地存

宋寶華《Linux裝置驅動開發》——sysfs檔案系統與linux裝置模型(5.4.2)

以下讀書筆記內容,摘自宋寶華《Linux裝置驅動開發詳解》一書。 1、sysfs檔案系統的簡介 (1)linux2.6以後的核心引進syfs檔案系統,是虛擬檔案系統; (2)產生一個包括所有系統硬體

分享《Linux裝置驅動開發》第2版高清電子版

新浪微博:@宋寶華Barry 在@微盤 分享了《linux裝置驅動開發詳解》第2版1080P電子版,擬升級為第3版,3.16核心,Cortex-A9 SMP,Device tree, DVFS, suspend/hibernation, big.LITTLE, CMA,分層/

宋寶華《linux裝置驅動開發》——platform裝置驅動(12.2)

以下讀書筆記,整理於宋寶華《linux裝置驅動開發詳解》一書。 1、piatform匯流排出現的原因 在SOC整合的獨立外設控制器、掛接在soc記憶體空間的外設不依附與此類匯流排(PCI、USB、I

Linux驅動開發》——LCD裝置驅動重要資料結構驅動框架

核心檔案:/drivers/video/fbmem.c 18.2.3.Linux幀緩衝相關資料結構與函式          1. fb_info結構體(最關鍵) /* struct fb_info 結構體 */ struct fb_info {     int node;

嵌入式驅動開發視訊教程

第一章+Linux裝置驅動模型 第二章Linux核心模組  第三章Linux核心程式設計API  第四章Linux字元裝置驅動  第五章Linux塊裝置驅動  第六章Linux platfo

pci驅動開發

一、在瞭解pic啟動開發前,作為開發人員需瞭解以下核心結構體:struct pci_device_id {    __u32 vendor, device;/* Vendor and device ID or PCI_ANY_ID*/    __u32 subvendor,

轉載linux平臺裝置驅動架構 Linux Platform Device and Driver

從Linux 2.6起引入了一套新的驅動管理和註冊機制:Platform_device和Platform_driver。Linux中大部分的裝置驅動,都可以使用這套機制, 裝置用Platform_device表示,驅動用Platform_driver進行註冊。Linux platform driver機制和傳

FS_S5PC100平臺上Linux Camera驅動開發(一)

說明:         理解攝像頭驅動需要四個前提:         1)攝像頭基本的工作原理和S5PC100整合的 Camera控制器 的工作原理         2)platform_device和platform_driver工作原理         3)Linu

linux裝置驅動uevent,高通平臺battery上報電量例項

本文以高通平臺上的android系統為參照展開探討。1,uevent是什麼呢? uevent是一種linux裝置模型中的一個組成部分。kset中包含的uevent_ops結構體擁有uevent的操作函式。 uevent可以在裝置發生變化時主動通知應用層。是對普通先註冊裝置後

linux平臺裝置驅動架構 Linux Platform Device and Driver——神文,非常詳細

從Linux 2.6起引入了一套新的驅動管理和註冊機制:Platform_device和Platform_driver。 Linux中大部分的裝置驅動,都可以使用這套機制, 裝置用Platform_device表示,驅動用Platform_driver進行註冊。 Linux platform driver機

Spotify敏捷模式三部曲第二研發過程

  文章轉自:Scrum中文網     引言 在本系列文章的第一篇,我們介紹了Spotify的敏捷研發團隊,以及它獨特的組織架構。Spotify的研發團隊採用的是一種非常獨特的組織架構,如下圖所示: 整個研發組織有多個稱為“Tribe部落”的單元組成,每個部落中包括多

《JAVA多線程編程核心技術》 筆記第二對象變量的並發訪問

問題 內部類 nds safety string line 基本概念 子類 標記 一、基本概念1、安全的變量和不安全的變量2、臟讀的理解3、鎖重入:4、鎖釋放5、死循環:二、synchronized 的理解:三、synchronized 同步方法3.1 同步方法不具有繼承