第一天 Linux驅動程序簡介

目錄

一、驅動的作用

二、裸機驅動 VS linux驅動

1、裸機驅動

2、linux驅動

三、linux驅動位于哪里?

四、應用編程 VS 內核編程

1、共同點

2、不同點

五、linux驅動分類

1、字符設備

2、塊設備

3、網絡設備

六、Linux驅動學習難點與誤區

1、學習難點

2、學習誤區


?一、驅動的作用

相信學過os的同學,對上面的圖應該不陌生,操作系統位于應用層和硬件之間,向下管理著各種硬件資源,向上屏蔽硬件細節,提供統一操作接口。當應用層需要操作硬件時,通過各種系統調用向操作系統發出請求,操作系統根據傳入的參數,找到對應硬件的驅動,驅動再根據需求,操作硬件,完成請求。

二、裸機驅動 VS linux驅動

下面以最簡單的“點燈”實驗,來看裸機驅動和linux驅動的差別:

硬件電路圖如下:

當GPIO輸出高電平時,LED燈亮

當GPIO輸出低電平時,LED燈滅

1、裸機驅動

應用層:在while循環里,調用gpio_init()對gpio做初始化,調用Led_on()/Led_off()來控制LED亮滅

驅動層:需要用到兩個moudle:gpio和Led,其中gpio提供gpio操作函數集,如gpio_init(),gpio_output()等等,Led則提供led_init(),led_on()和led_off()?,led_on()調用gpio_ouput(1),讓GPIO輸出高電平,從而點亮led,同理,led_off()調用gpio_ouput(0),讓GPIO輸出低電平,從而熄滅led

2、linux驅動

首先linux驅動都是以module的形式來寫的,其次Led屬于字符設備,所以需要注冊一個字符設備,要向linux內核注冊一個字符設備,需要滿足三要素:分配設備號,實現file_operation操作集,動態分配并add一個cdev。操作gpio的操作可以包含在file_operation操作集里write函數中

你可能會疑惑:為什么linux驅動要這么復雜呢?其實一切都是為了實現“一切皆文件”的思想,這樣操作硬件就可以像操作文本文件一樣簡單啦

三、linux驅動位于哪里?

來一張linux系統全景圖:

為了提升系統的安全性,操作系統利用處理器的特權模式,將進程的地址空間分成了兩部分:用戶空間和內核空間,從上圖可以看出,驅動位于內核空間,所以驅動開發屬于內核編程范疇。

?四、應用編程 VS 內核編程

1、共同點

1)無論應用編程,還是內核編程,都是編程,編程就是寫程序,而程序 = 數據結構 + 算法,所以常用數據結構和算法是編程的基石!?

2)熟悉相應的API及其用法,應用編程需要和內核交互,比如在linux系統中操作文件,首先要open文件,open函數需要兩個參數,一個是路徑,一個是flag。linux驅動同樣需要與linux內核交互,比如創建一個字符設備需要先分配cdev結構體,再cdev_init,最后cdev_add

2、不同點

1)應用程序執行任務,從開始到結束,內核模塊將自己注冊到內核中,在module_init中做些初始化操作后,等待被調用

2)并非所有應用程序都是事件驅動類型,但所有內核模塊都是事件驅動類型

3)應用程序可以選擇偷懶不去釋放資源,由OS來統一回收,內核模塊卸載函數需要做init里相反的操作,否則資源一直被占用,直到系統重啟

4)應用程序可以使用C庫,但內核模塊只能使用內核export出來的符號表

5)處理錯誤的方式不同:應用程序一般會出現段錯誤,可以使用gdb直接調試,內核模塊可能會使系統panic,或者重啟

五、linux驅動分類

根據設備操作的特點,分為字符設備驅動,塊設備驅動和網絡設備驅動

1、字符設備

  • 字節流

  • 一般順序訪問

  • 存在特殊的字符設備,允許lseek,mmap等操作

2、塊設備

  • 以塊大小(512 byte)進行傳輸

  • 任意順序訪問

  • 可以安裝文件系統

3、網絡設備

  • 使用套接字,處理網絡事務

工作中遇到絕大多數的設備為字符設備,比如串口,LCD,觸摸屏,platform設備等等都是字符設備。

六、Linux驅動學習難點與誤區

1、學習難點

1)linux驅動開發屬于內核編程,需要經常與內核其他子系統交互,因此需要熟悉linux內核

2)linux驅動需要處理并發,尤其如今已屬于SMP的天下

3)linux驅動的魯棒性要求高,否則會導致kernel panic

2、學習誤區

1)沒有硬件知識,看不懂原理圖,就不能做驅動開發

解釋:并非所有驅動都依賴對原理圖的理解,在實際工作中,驅動分為外設驅動和bsp驅動,其中bsp驅動,如pinctrl驅動,gpio驅動,clk驅動,regulator驅動,這些只依賴Soc的設計,和原理圖無關。

2)沒有開發板,就沒法學習linux驅動

解釋:如果要開發的驅動不涉及具體硬件,優先選擇qemu環境進行驅動開發

3)看書和看培訓視頻就行,不需要自己動手

解釋:20%理論 + 80%實踐,多動手,多實踐,方能事半功倍!!

4)抱著經典書狂啃就夠了

解釋:其實最好的學習資料是源代碼,經典書雖然經典,但其中內容早已過時,閱讀經典書重要的是把握其中的設計思想,閱讀最新的linux內核源代碼才知曉具體實現細節

參考資料:《LDD3》

? ? ? ? ? ? ? ? ? 《linux設備驅動開發詳解,基于4.0內核》

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/74971.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/74971.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/74971.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

PaddleX產線集成功能的使用整理

一、環境搭建 1.1 安裝paddle-gpu 需要根據安裝機器的cuda的版本,選擇合適的版本進行安裝 #安裝paddle-gpu 官網鏈接 https://www.paddlepaddle.org.cn/install/quick?docurl/documentation/docs/zh/install/pip/linux-pip.html python -m pip install paddle…

docker-compese 啟動mysql8.0.36與phpmyadmin,并使用web連接數據庫

1、找一個文件夾,比如 E:\zqy\file\mysql,cd到這個目錄下創建文件docker-compose.yml 2、將下面的代碼塊復制到docker-compose.yml文件中 version: 3.3 services:mysql:image: mysql:8.0.36container_name: mysqlrestart: alwaysports:- 3306:3306netw…

解決 Gradle 構建錯誤:Could not get unknown property ‘withoutJclOverSlf4J’

解決 Gradle 構建錯誤:Could not get unknown property ‘withoutJclOverSlf4J’ 在構建 Spring 源碼或其他基于 Gradle 的項目時,可能會遇到如下錯誤: Could not get unknown property withoutJclOverSlf4J for object of type org.gradle…

mcp 接freecad畫齒輪

from mcp.server.fastmcp import FastMCP import freecad.gears.commands import os from freecad import app from freecad import part mcp FastMCP("Demo")mcp.tool() def create_gear(num_teeth20,height10,double_helix True):"""創建一個漸開線…

【大前端系列19】JavaScript核心:Promise異步編程與async/await實踐

JavaScript核心:Promise異步編程與async/await實踐 系列: 「全棧進化:大前端開發完全指南」系列第19篇 核心: 深入理解Promise機制與async/await語法,掌握現代異步編程技術 📌 引言 在JavaScript的世界中,異步編程是無…

如何排查java程序的宕機和oom?如何解決宕機和oom?

排查oom 用jmap生成我們的堆空間的快照Heap Dump(堆轉儲文件),來分析我們的內存占用 用可視化工具,例如java中的jhat分析Heap Dump文件 ,它分析完會通過一個瀏覽器打開一個可視化頁面展示分析結果 根據oom的類型來調…

什么是 OLAP 數據庫?企業如何選擇適合自己的分析工具

引言:為什么企業需要 OLAP 數據庫? 你是否曾經經歷過這樣的場景: 市場部門急需一份用戶行為分析報告,數據團隊告訴你:“數據太大了,報表要跑 4 個小時”;業務負責人在會議中提出一個臨時性分析…

測試:認識Bug

目錄 一、軟件測試的生命周期 二、bug 一、軟件測試的生命周期 軟件測試貫穿于軟件的生命周期。 需求分析: ???度:軟件需求是否合理 技術?度:技術上是否可?,是否還有優化空間 測試?度:是否存在業務邏輯錯誤、…

綜合實驗2

1、sw1和sw2之間互為備份 [sw1]interface Eth-Trunk 0 (創建聚合接口) [sw1-Eth-Trunk0]trunkport g0/0/1 (將物理接口劃入到聚合接口中) [sw1-Eth-Trunk0]trunkport g0/0/2 [sw2]interface Eth-Trunk 0 [sw2-Eth-T…

【ArcGIS】ArcGIS10.6徹底卸載和ArcGIS10.2安裝全過程

卸載python3后,解決了ArcGIS與python3沖突問題后,軟件可以正常打開使用了 但是還是出現了問題 用ArcGIS 進行空間分析時,中間操作沒有任何報錯和問題,但是就是沒有運行結果 在別人的軟件上操作一遍可以出現運行結果 關閉確有這個,但真的不是我給它的運行時間不夠,反反復復試…

Django之旅:第五節--Mysql數據庫操作(一)

Django開發操作數據庫更簡單,內部提供了ORM框架 一、安裝第三方模塊 pip install mysqlclient注:最新的django框架需要使用mysqlclient模塊,之前pymysql模塊與django框架有編碼兼容問題。 二、ORM 1、ORM可以幫助我們做兩件事:…

docker部署mongodb數據庫

1、下載 MongoDB 鏡像 使用Docker部署MongoDB 之前,我們需要從 Docker Hub 上下載 MongoDB 鏡像。這里我們下載最新版本的 MongoDB 鏡像,使用以下命令進行下載: docker pull mongo:latest 下載完成后,我們就擁有了最新版本的 Mon…

Enhanced PEC-YOLO:電力施工場景安全裝備檢測的輕量化算法解析

目錄 一、核心概述 二、核心創新點 1. ?C2F_Faster_EMA模塊 2. ?SPPF_CPCA多尺度模塊 3. ?BiFPN頸部網絡

【人工智能】解鎖大模型潛力:Ollama 與 DeepSeek 的分布式推理與集群部署實踐

《Python OpenCV從菜鳥到高手》帶你進入圖像處理與計算機視覺的大門! 解鎖Python編程的無限可能:《奇妙的Python》帶你漫游代碼世界 隨著大語言模型(LLM)的快速發展,其推理能力在自然語言處理、代碼生成等領域展現出巨大潛力。然而,單機部署難以滿足高并發、低延遲的需…

RTMP推流服務器nginx在linux上的編譯部署

RTMP(Real-Time Messaging Protocol)推流確實需要服務器支持?。RTMP推流服務器的主要功能是接收來自推流客戶端的數據流,對其進行處理和轉發。服務器會根據RTMP協議與客戶端建立連接,處理推流數據(如轉碼、錄制等&…

PyQt6實例_批量下載pdf工具_主線程停止線程池

目錄 前置: 代碼: 視頻: 前置: 1 本系列將以 “PyQt6實例_批量下載pdf工具”開頭,放在 【PyQt6實例】 專欄 2 本系列涉及到的PyQt6知識點: 線程池:QThreadPool,QRunnable; 信號與…

Tomcat生產服務器性能優化

試想以下這個情景:你已經開發好了一個程序,這個程序的排版很不錯,而且有著最前沿的功能和其他一些讓你這程序增添不少色彩的元素。可惜的是,程序的性能不怎么地。你也十分清楚,若現在把這款產品退出市場,肯…

正則表達式-筆記

文章目錄 一、正則表達式二、正則表達式的基本語法字符類普通字符非打印字符特殊字符 量詞限定符錨點修飾符(標記) 三、在 Python 中使用正則表達式簡單搜索提取信息替換文本 參考 從驗證用戶輸入,到從大量文本中提取特定信息,再到…

Qwen-0.5b linux部署

參考鏈接 https://blog.csdn.net/imwaters/article/details/145489543 https://modelscope.cn/models/modelscope/ollama-linux 1. ollama安裝 # 安裝ModelScope工具包,用于下載和管理AI模型 pip install modelscope# 下載Ollama的Linux版本安裝包 # --model 指定…

【深度學習】GAN生成對抗網絡:原理、應用與發展

GAN生成對抗網絡:原理、應用與發展 文章目錄 GAN生成對抗網絡:原理、應用與發展1. 引言2. GAN的基本原理2.1 核心思想2.2 數學表達2.3 訓練過程 3. GAN的主要變體3.1 DCGAN (Deep Convolutional GAN)3.2 CGAN (Conditional GAN)3.3 CycleGAN3.4 StyleGAN…