玩轉Linux設備驅動你需要弄懂這些問題

2022-01-10 電子產品世界

Linux是一套免費使用和自由傳播的類Unix作業系統,是一個基於POSIX和UNIX的多用戶、多任務、支持多線程和多CPU的作業系統。它能運行主要的UNIX工具軟體、應用程式和網絡協議。它支持32位和64位硬體。Linux繼承了Unix以網絡為核心的設計思想,是一個性能穩定的多用戶網絡作業系統。

想要深入理解linux設備驅動,你必須明確以下幾個問題:

• 應用程式、庫、內核、驅動程序的關係

• 設備類型

• 設備文件、主設備號與從設備號

• 驅動程序與應用程式的區別

• 用戶態與內核態

• Linux驅動程序功能

1) 應用程式調用一系列函數庫,通過對文件的操作完成一系列功能。

應用程式以文件形式訪問各種硬體設備(Linux特有的抽象方式,把所有的硬體訪問抽象為對文件的讀寫、設置)

函數庫

部分函數無需內核的支持,由庫函數內部通過代碼實現,直接完成功能

部分函數涉及到硬體操作或內核的支持,由內核完成對應功能,我們稱其為系統調用

2) 內核處理系統調用,根據設備文件類型、主設備號、從設備號(後面會講解),調用設備驅動程序。

3) 設備驅動直接與硬體通信。

硬體是千變萬化的,沒有八千也有一萬了,就像世界上有三種人:男人、女人、女博士一樣,linux做了一個很偉大也很艱難的分類:把所有的硬體設備分為三大類:字符設備塊設備網絡設備

1) 字符設備:字符(char)設備是個能夠像字節流(類似文件)一樣被訪問的設備。

對字符設備發出讀/寫請求時,實際的硬體I/O操作一般緊接著發生;

字符設備驅動程序通常至少要實現open、close、read和write系統調用。

比如我們常見的lcd、觸控螢幕、鍵盤、led、串口等等,就像男人是用來幹活的一樣,他們一般對應具體的硬體都是進行出具的採集、處理、傳輸。

2) 塊設備:一個塊設備驅動程序主要通過傳輸固定大小的數據(一般為512或1k)來訪問設備。

塊設備通過buffer cache(內存緩衝區)訪問,可以隨機存取,即:任何塊都可以讀寫,不必考慮它在設備的什麼地方。

塊設備可以通過它們的設備特殊文件訪問,但是更常見的是通過文件系統進行訪問。

只有一個塊設備可以支持一個安裝的文件系統。

比如我們常見的電腦硬碟、SD卡、U盤、光碟等,就像女人一樣是用來存儲信息的。

3) 網絡接口:任何網絡事務都經過一個網絡接口形成,即一個能夠和其他主機交換數據的設備。

訪問網絡接口的方法仍然是給它們分配一個唯一的名字(比如eth0),但這個名字在文件系統中不存在對應的節點。

內核和網絡設備驅動程序間的通信,完全不同於內核和字符以及塊驅動程序之間的通信,內核調用一套和數據包傳輸相關的函數(socket函數)而不是read、write等。

比如我們常見的網卡設備、藍牙設備,就像女博士一樣,數量稀少但又不可或缺。

linux中所有的驅動程序最終都能歸到這三種設備中,當然他們之間也沒有非常嚴格的界限,這些都是程序中對他們的劃分而已,比如一個sd卡,我們也可以把它封裝成字符設備去操作也是沒有問題的。就像。。。

有了設備類型的劃分,那麼應用程式應該怎樣訪問具體的硬體設備呢?

或者說已經確定他是一個男人了,那麼怎麼從萬千世界中區分他與他的不同呢?

答案是:姓名,在linux驅動中也就是設備文件名。

那麼重名怎麼辦?

答案是:身份證號,在linux驅動中也就是設備號(主、從)。

設備文件

在linux系統中有一個約定俗成的說法:「一切皆文件」,應用程式使用設備文件節點訪問對應設備, Linux下的各種硬體設備以文件的形式存放於/dev目錄下,可以使用ls /dev 查看Linux把對硬體的操作全部抽象成對文件的操作(open,read,write,close,…)

每個設備文件都有其文件屬性(c或者b),使用ls /dev -l 的命令查看, 表明其是字符設備或者塊設備,網絡設備沒有在這個文件夾下,用來明其性別(男人、女人)

主設備號、從設備號

在設備管理中,除了設備類型外,內核還需要一對被稱為主從設備號的參數,才能唯一標識一個設備,類似人的身份證號

主設備號

用於標識驅動程序,相同的主設備號使用相同的驅動程序,例如:S3C2440 有串口、LCD、觸控螢幕三種設備,他們的主設備號各不相同;

從設備號

用於標識同一驅動程序的不同硬體

例:PC的IDE設備,主設備號用於標識該硬碟,從設備號用於標識每個分區,2440有三個串口,每個串口的主設備號相同,從設備號用於區分具體屬於那一個串口。

應用程式以main開始

驅動程序沒有main,它以一個模塊初始化函數作為入口

應用程式從頭到尾執行一個任務

驅動程序完成初始化之後不再運行,等待系統調用

應用程式可以使用glibc等標準C函數庫

驅動程序不能使用標準C庫

驅動程序是內核的一部分,工作在內核態

應用程式工作在用戶態

數據空間訪問問題

無法通過指針直接將二者的數據地址進行傳遞

系統提供一系列函數幫助完成數據空間轉換

get_user

put_user

copy_from_user

copy_to_user

對設備初始化和釋放資源

把數據從內核傳送到硬體和從硬體讀取數據

讀取應用程式傳送給設備文件的數據和回送應用程式請求的數據

檢測和處理設備出現的錯誤(底層協議)

用於區分具體設備的實例

↓↓↓↓點擊閱讀原文,進入網站,查看更多新聞

相關焦點

  • Linux驅動實踐:你知道【字符設備驅動程序】的兩種寫法嗎?
    這個動態分配的設備號,我們要把它記住,因為在其他的API函數中需要使用它。創建驅動目錄和驅動程序$ cd linux-4.15/drivers/$ mkdir my_driver1$ cd my_driver1$ touch driver1.cdriver1.c 文件的內容如下(不需要手敲,文末有代碼下載連結):
  • linux字符設備驅動基本框架
    對於Linux的驅動程序,需要遵循一定的框架結構。嵌入式Linux的學習其實並不難,只要深入理解Linux的框架,寫起來也可以得心應手。1.linux函數調用過程1.1 系統函數調用的意義在Linux的中,有一個思想比較重要:一切皆文件。也就是說,在應用程式中,可以通過open,write,read等函數來操作底層的驅動。
  • 全面掌握Linux驅動框架——字符設備驅動、I2C驅動、總線設備驅動、NAND FLASH驅動
    眾所周知,字符設備是Linux驅動基礎也是重點,還沒學到字符設備那章的同學當做預習,已經學完了的可以很好複習,試想一下,關掉書和視頻,你能參考內核自帶的驅動寫出LED字符設備驅動來嗎?以下是Linux字符設備驅動框架圖:
  • Linux內核學習:簡單的字符設備驅動
    學習Linux內核最好的入門方式之一是從字符設備驅動開始模仿(來自於《奔跑吧 Linux內核——入門篇》)。對於我們日常生活中存在的大量設備,如攝像頭,USB充電器,藍牙,Wi-Fi等,這些設備在電氣特性和實現原理均不相同,對Linux系統來說如何抽象和描述他們呢?Linux很早就根據設備共同特徵將其劃分為三大類型:1,字符設備;塊設備;網絡設備。
  • 嵌入式Linux設備驅動開發之:實驗內容——test驅動
    本文引用地址:http://www.eepw.com.cn/article/257106.htm1.實驗目的該實驗是編寫最簡單的字符驅動程序,這裡的設備也就是一段內存,實現簡單的讀寫功能,並列出常用格式的Makefile以及驅動的加載和卸載腳本。
  • 從串口驅動到Linux驅動模型,想轉Linux的必會!
    這一階段我們有三個問題需要解決:1.什麼是Linux作業系統。2.什麼是Linux設備驅動。3.關於串口的種種。要了解這些概念。如下我介紹了一點這方面的知識。不過遺憾的是對一些概念有著不可避免的向前引用。這個過程中我會儘量忽略次要因素。以在本次調研中最主要目的為主線。如果讀者您對這些概念已經有很深入的理解。
  • 【專業技術】Linux設備驅動第七篇:高級字符驅動操作之阻塞IO
    比如一個進程調用read讀取數據,當沒有數據可讀時該怎麼辦,是立即返回還是等到有數據的時候;另一種情況是進程調用write向設備寫數據,如果緩衝區滿了或者設備正忙的時候怎麼辦,是立即返回還是繼續等待直到設備可寫?這種情況下,一般的預設做法是使進程睡眠直到請求可以滿足為止。本篇就介紹遇到這類問題驅動的處理方法。睡眠什麼是睡眠?
  • Linux Framebuffer驅動剖析之二—驅動框架、接口實現和使用
    管理不同的主設備是由Linux設備驅動框架來完成的。另外,由於Linux把設備也認為是一個文件,因此設備驅動之上還架設了一層虛擬文件系統(VFS),因此,實際上,應用層是跟framebuffer對應的VFS接口進行交互的。如下圖:對於驅動開發人員來說,其實只需要針對具體的硬體平臺SOC和具體的LCD(焊接連接到該SOC的引腳上)來進行第一部分的寄存器編程(紅色部分)。
  • Linux驅動程序學習步驟經典收藏
    了解linux驅動程序技巧學習的方法很重要,學習linux作業系統時,你可能會遇到關於驅動方面的問題,這裡將介紹學習linux
  • Linux環境下USB的原理、驅動和配置
    隨著生活水平的提高,人們對USB設備的使用也越來越多,鑑於Linux在硬體配置上尚不能全部即插即用,因此關於Linux如何配置和使用,成為困擾我們的一大問題。USB最初是為了替代許多不同的低速總線(包括並行、串行和鍵盤連接)而設計的,它以單一類型的總線連接各種不同的類型的設備。USB的發展已經超越了這些低速的連接方式,它現在可以支持幾乎所有可以連接到PC上的設備。最新的USB規範修訂了理論上高達480Mbps的高速連接。
  • 基於Linux平臺下的FPGA的ARM驅動開發方法
    為此,本文以S3C2410上使用Altera公司的EP2S30F67214為例,系統地介紹了在Linux系統環境下的FPGA的驅動方法。1基本原理Linux下的設備驅動程序通常是一個存在於應用程式和實際設備間的軟體層。
  • Linux2.6內核驅動移植參考
    作者:晏渭川 隨著Linux2.6的發布,由於2.6內核做了教的改動,各個設備的驅動程序在不同程度上要 進行改寫。為了方便各位Linux愛好者我把自己整理的這分文檔share出來。該文當列舉 了2.6內核同以前版本的絕大多數變化,可惜的是由於時間和精力有限沒有詳細列出各個 函數的用法。
  • Linux設備驅動之Kobject、Kset
    3、數據結構關聯:整體來看, 設備模型是一個極端複雜的數據結構,通過其間的大量連結而構成一個多層次的體系結構。kobject實現了該結構並將其聚合在一起。  此篇文章,只分析第一條,kobject 與 kset sysfs 之間的關係。
  • 「正點原子Linux連載」第六十二章Linux SPI驅動實驗
    也就是SPI主機端最終會通過transfer函數與SPI設備進行通信,因此對於SPI主機控制器的驅動編寫者而言transfer函數是需要實現的,因為不同的SOC其SPI控制器不同,寄存器都不一樣。和I2C適配器驅動一樣,SPI主機驅動一般都是SOC廠商去編寫的,所以我們作為SOC的使用者,這一部分的驅動就不用操心了,除非你是在SOC原廠工作,內容就是寫SPI主機驅動。
  • 【乾貨】你真的需要了解一下 Linux 系統 UDP 丟包問題分析思路
    1、首先網絡報文通過物理網線發送到網卡2、網絡驅動程序會把網絡中的報文讀出來放到 ring buffer 中,這個過程使用 DMA(Direct Memory Access),不需要 CPU 參與3、內核從 ring buffer 中讀取報文進行處理,執行 IP 和 TCP/UDP 層的邏輯,最後把報文放到應用程式的 socket buffer
  • Linux嵌入式驅動開發——ioctl接口
    並且在應用層傳入內核層的過程,需要執行copy函數,對於我們這裡只需要傳入0或者1的少量數據來說,有些繁瑣。什麼是unlocked_ioctl接口?所以,對於gpio控制led燈或者蜂鳴器等操作時,我們不需要大量的數據讀寫,可以使用ioctl函數,來簡化,而read/write函數專職於大量數據的傳輸。unlocked_ioctl接口命令規則unlocked_ioctl總共32位第一個分區 0-7,命令的編號,範圍是0-255第二個分區 8-15 命令的幻數。
  • vxworks嵌入式作業系統下串行設備驅動程序開發思路
    掌握驅動程序的基本工作流程,無論對我們開發上層的應用還是自己編寫相應的驅動程序,都很有幫助。本文主要以i8250串口驅動程序為例,介紹一下串行驅動程序編寫的基本思路。 驅動程序,簡而言之就是對具體的硬體設備進行管理和服務的程序。為了提高代碼的可移植性,vxworks將所有的輸入/輸出設備都看成是一個文件,我們對設備的輸入/輸出操作,都可以看作是對指定文件的讀寫操作。
  • 嵌入式Linux系統中MMC卡驅動管理技術研究
    讀寫進程被中斷喚醒後,首先讀取MMC卡響應寄存器MMC_RES中的狀態信息,再根據這些狀態信息判斷命令是否發布成功和卡的當前狀態。如果這些狀態信息表示命令執行成功,則通過讀寫緩衝寄存器MMC_RXFIFO和MMC_TXFIFO進行數據的讀寫(這裡使用DMA進行數據傳輸,提高了數據的傳輸速度);如果返回的狀態信息表明命令執行不成功,則根據狀念信息進行相應的出錯處理。
  • Linux SD/MMC/SDIO驅動分析
    所以 SDIO 本身是一種相當單純的技術,透過 SD 的 I/O 接腳來連接外部外圍,並且透過 SD 上的 I/O 數據接位與這些外圍傳輸數據,而且 SD 協會會員也推出很完整的 SDIO stack 驅動程序,使得 SDIO 外圍(我們稱為 SDIO 卡)的開發與應用變得相當熱門。
  • 「正點原子Linux連載」第五十九章Linux LCD驅動實驗
    在裸機中我們可以隨意的分配顯存,但是在Linux系統中內存的管理很嚴格,顯存是不需要申請的,不是你想用就能用的。而且因為虛擬內存的存在,驅動程序設置的顯存和應用程式訪問的顯存要是同一片物理內存。屏幕參數信息屬於屏幕設備信息內容,這些肯定是要放到設備樹中的,因此我們本章實驗的主要工作就是修改設備樹,NXP官方的設備樹已經添加了LCD設備節點,只是此節點的LCD屏幕信息是針對NXP官方EVK開發板所使用的4.3寸480*272編寫的,我們需要將其改為我們所使用的屏幕參數。