1. 程式人生 > >Linux下PCIe驅動以及DMA機制

Linux下PCIe驅動以及DMA機制

1. 驅動程式作用:

·        裝置驅動程式嚮應用程式遮蔽了硬體在實現上的細節,使得應用程式可以像操作普通檔案一樣操作外部裝置。Linux作業系統抽象了對硬體的處理,可以使用和操作檔案相同的,標準的系統呼叫介面來完成開啟,關閉,讀寫喝I/O控制操作,而驅動程式主要任務也就是實現這些系統呼叫函式。

·        每個裝置檔案對應兩個裝置號,其中主裝置號標識裝置種類,也標識了裝置所使用的驅動程式;次裝置號標識使用同一裝置驅動程式的不同硬體裝置。裝置檔案的主裝置號必須與裝置驅動程式在登陸該裝置時申請的主裝置號一致,否則使用者程序無法訪問到裝置驅動程式。

2. 塊裝置與字元裝置的區別:

·        

二者之間區別僅僅在於核心與驅動程式之間的軟體介面上,塊裝置利用一塊系統記憶體作為緩衝區,當用戶程序對裝置進行讀寫請求時,驅動程式先檢視緩衝區的內容,如果能滿足使用者要求,則返回相應資料,否則呼叫相應請求函式進行實際I/O操作。

3. DMA迴圈緩衝區的分配與實現:

·        對於高速資料訊號的採集處理,需要在驅動程式的初始化模組(probe)中申請大量的DMA迴圈緩衝區,申請的大小直接關係著能否實時對高速資料處理的成敗。直接記憶體訪問(DMA)是一種硬體機制,允許外圍裝置和主記憶體直接直接傳輸I/O資料,避免了大量的計算開銷。

4. Linux核心的記憶體分割槽段:

·        三個區段,可用於

DMA的記憶體,常規記憶體以及高階記憶體。

·        通常的記憶體分配發生在常規記憶體區,但是通過設定記憶體標識也可以請求在其他區段中分配。可用於DMA的記憶體指存在於特別地址範圍內的記憶體,外設可以利用這些記憶體執行DMA訪問,進行資料通訊傳輸。

·        DMA迴圈緩衝區的分配要求:物理連續,DMA可以訪問,足夠大。

5. Linux記憶體分配函式:

·        Linux系統使用虛擬地址,記憶體分配函式提供的都是虛擬地址,通過virt_to_bus轉換才能得到實體地址。

·        分配核心記憶體空間的函式:kmalloc實現小於128KB的核心記憶體申請,申請空間物理連續;

__get_free_pages實現最大4MB的記憶體申請,以頁為單位,所申請空間物理連續;vmalloc分配的虛擬地址空間連續,但在物理上可能不連續。

·        Linux核心中專門提供了用於PCI裝置申請核心記憶體的函式pci_alloc_consistent,支援按位元組長度申請,該函式呼叫__get_free_pages,故一次最大為4MB

6. DMA資料傳輸的方式:

·        一種是軟體發起的資料請求(例如通過read函式呼叫),另一種是硬體非同步將資料傳給系統。對於資料採集裝置,即便沒有程序去讀取資料,也要不斷寫入,隨時等待程序呼叫,因此驅動程式應該維護一個環形緩衝區,當read呼叫時可以隨時返回給使用者空間需要的資料。

7. PCIe中向CPU發起中斷請求的方式:

·        訊息訊號中斷(MSI),INTx中斷。

·        MSI中斷方式下,裝置通過向OS預先分配的主存空間寫入特定資料的方式請求CPU的中斷服務,為PCIe系統首選的中斷訊號機制,對於PCIePCI/PCI-X的橋接裝置和不能使用MSI機制的傳統端點裝置,採用INTx虛擬中斷機制。

·        PCIe設備註冊中斷時使用共享中斷方式,Linux系統通過request_irq實現中斷處理程式的註冊,呼叫位置在裝置第一次開啟,硬體產生中斷之前;同樣,free_irq時機在最後一次關閉裝置,硬體不用中斷處理器之後。

·        中斷處理函式的功能是將有關中斷接收的資訊反饋給裝置,並對資料進行相應讀寫。中斷訊號到來,系統呼叫相應的中斷處理函式,函式判斷中斷號是否匹配,若是,則清除中斷暫存器相應的位,即在驅動程式發起新的DMA之前裝置不會產生其他中斷,然後進行相應處理。

8. 資料讀寫和ioctl控制:

·        資料讀寫:應用程序不需要資料時,驅動程式動態維護DMA環形緩衝區,當應用程序請求資料,驅動程式通過Linux核心提供copy_from_user()/copy_to_user()實現核心態和使用者態之間的資料拷貝。

·        硬體控制:使用者空間經常回去請求裝置鎖門,報告錯誤資訊,設定暫存器等,這些操作都通過ioctl支援,可以對PCIe卡給定的暫存器空間進行配置。

9. 中斷處理程式的註冊:

·        中斷號在BIOS初始化階段分配並寫入裝置配置空間,然後Linux在建立pci_dev時從配置空間中讀出該中斷號並寫入pci_devirq成員中,所以註冊中斷程式時直接從pci_dev中讀取就行。

·        當裝置發生中斷,8259A將中斷號發給CPUCPU根據中斷號找到中斷處理程式,執行。

10. DMA資料傳輸機制的產生:

·        傳統經典過程:資料到達網絡卡 -> 網絡卡產生一箇中斷給核心 -> 核心使用 I/O 指令,從網絡卡I/O區域中去讀取資料。這種方式,當大流量資料到來時,網絡卡會產生大量中斷,核心在中斷上下文中,會浪費大量資源處理中斷本身。

·        改進:NAPI,即輪詢,即核心遮蔽中斷,隔一定時間去問網絡卡,是否有資料。則在資料量小的情況下,這種方式會浪費大量資源。

·        另一個問題,CPU到網絡卡的I/O區域,包括I/O暫存器和I/O記憶體中讀取,再放到系統實體記憶體,都佔用大量CPU資源,做改進,即有了DMA,讓網絡卡直接從主記憶體之間讀寫自己的I/O資料。

·        首先,核心在主記憶體中為收發資料建立一個環形的緩衝佇列(DMA環形緩衝區),核心將這個緩衝區通過DMA對映,將這個佇列交給網絡卡;網絡卡收到資料,直接放進環形緩衝區,即直接放到主記憶體,然後向系統產生中斷;

·        核心收到中斷,取消DMA對映,可以直接從主記憶體中讀取資料。

相關推薦

LinuxPCIe驅動以及DMA機制

1. 驅動程式作用: ·        裝置驅動程式嚮應用程式遮蔽了硬體在實現上的細節,使得應用程式可以像操作普通檔案一樣操作外部裝置。Linux作業系統抽象了對硬體的處理,可以使用和操作檔案相同的,標準的系統呼叫介面來完成開啟,關閉,讀寫喝I/O控制操作,而驅動程式主要任

linux程序、以及程序間的通訊機制

2.1程序基本概念         程序是Linux事務管理的基本單元,所有的程序均擁有自己獨立的處理環境和系統資源。程序的環境由當前系統狀態及其父程序資訊決定和組成。系統的第一個程序init由核心產生,以後所有的程序都是

Linux編譯mongodb以及C++客戶端驅動

想在Linux下編譯一下mongo和它的C++驅動,網上一堆教程,官方一堆文件,實現起來依舊困難重重。我就很納悶了,本來mongodb就是C++寫的,為什麼不直接提供出驅動,而java,C#之類的,倒是直接提供了jar包和dll檔案。今天終於編譯成功,趕緊記錄下來。 Lin

Linux安裝mysql以及配置JDBC驅動

Linux的版本為Centos6.3,使用rpm包安裝mysql 詳細步驟如下 1、安裝的軟體包mysql-server-*.rpmmysql-devel-*.rpm 2、修改初始化密碼/usr/bi

linuxmemcached安裝以及啟動

啟動參數 actor 是否 設置 查看 解決 bsp rem 內存 1.下載memcached服務器端安裝文件 版本: memcached-1.4.2.tar.gz 下載地址:http://www.danga.com/memcached/download.

Linux 設備驅動之 UIO 機制

insmod ask ice 物理內存 讀寫 rto signed sla 用戶空間 一個設備驅動的主要任務有兩個: 1. 存取設備的內存 2. 處理設備產生的中斷 對於第一個任務。UIO 核心實現了mmap()能夠處理物理內存(physical memory),邏輯內存(

linux升級npm以及node

port sta 開發者 rem ID 查看 簡單 穩定版 ret npm升級 廢話不多說,直接講步驟。先從容易的開始,升級npm。 npm這款包管理工具雖然一直被人們詬病,很多人都推薦使用yarn,但其使用人數還是不見減少,況且npm都是隨node同時安裝好的,一時讓我拋

linux find---xargs以及find--- -exec結合使用

每次 取消 這樣的 iso hostname options tex input dir 例:刪除/home/raven下,包括子目錄裏所有名為abc.txt的文件: find /home/raven -name abc.txt | xargs rm -rf 如果不使用xa

linux部署Nginx以及相關簡介

配置 quest 上傳文件 reload 就是 conn 動靜 config html 1、安裝工具包   yum install -y wget  下載工具   yum install -y vim-enhanced  vim編輯器   yum install -y ma

Linux安裝MySQL以及一些小坑

還需 .com star itl inux ret sdn 鏈接 keyword 第一次寫博客,各位湊合著看吧(假裝有人看)。 我這裏使用的是centos7。 1、首先打開終端,查看有沒有安裝過MySQL: [root@localhost lyp]# rpm -qa |

Linuxredis安裝以及遠端訪問 搭建過程綜合整理

虛擬機器以及linux安裝 VMware安裝,我安裝的版本是14.1.1.28517 虛擬機器以及linux安裝過程傳送門:點選開啟連結,虛擬機器簡簡單單的典型安裝就行 虛擬機器安裝後需要啟用,啟用碼傳送門:點選開啟連結 linux系統用的是centos7 linux系統安裝時候需要注

slor6.6 在linux的安裝以及啟動失敗解決辦法

一、前言: 環境:(注–>一切不說明環境的安裝教程都是耍流氓) centos7 solr6.6.5 jdk1.8 tomcat8 曾記得在solr4的時候曾經的一個外包專案需要使用到檢索功能折騰了差不多一個周,從lucene到solr

Linuxnfs配置以及使用

1.nfs配置 NFS概念 網路檔案系統(NFS)是Unix系統和網路附加儲存檔案管理器常用的網路檔案系統,允許多個客戶端通過網路共享檔案訪問。它可用於提供對共享二進位制 目錄的訪問,也可用於允許使用者在同一工作組中從不同客戶端訪問其檔案。NFS協議有多個版本:Linu

linux驅動控制gpio的方法

arm linux下寫驅動控制gpio時,有兩種方法: 1. 用ioremap()得到暫存器的地址,然後用iowrite32()或writel()函式寫暫存器控制gpio 1)查datashee

Linux標準I/O緩衝機制

平臺:Ubuntu作業系統 編譯器:g++ 首先讓我們看一段程式碼: #include <iostream> #include <unistd.h> using namespace std; int main() { for (int i

linuxMySQL安裝以及配置

1.下載安裝包 wget http://cdn.mysql.com/archives/mysql-5.6/mysql-5.6.26-linux-glibc2.5-x86_64.tar.gz 2.解壓安裝包 tar zxvf mysql-5.6.26-linux-glibc2.5-x8

linuxi2c驅動筆記

1. 幾個基本概念 1.1. 裝置模型 由 匯流排(bus_type) + 裝置(device) + 驅動(device_driver) 組成,在該模型下,所有的裝置通過匯流排連線起來,即使有些裝置沒有連線到一根物理總線上,linux為其設定了一個內部的、虛擬的platf

linux安裝mariadb以及相關配置

版本:centos7 Linux下安裝MariaDB官方文件參見:https://mariadb.com/kb/zh-cn/installing-mariadb-with-yum/ 1.建立MariaDB.repo檔案 vi /etc/yum.repos.d

linux安裝node以及npm

1、wget https://nodejs.org/dist/v8.11.4/node-v8.11.4-linux-x64.tar.xz  2、tar -Jxv -f node-v8.9.3-linux-x64.tar.xz 解壓 3、cd node-v8.9.3-linux-x6

.Neter玩轉Linux系列之四:Linuxshell介紹以及TCP、IP基礎

基礎篇 實戰篇 一、Linux下的shell 概述:每個人在成功登入LINUX後,系統會出現不同的提示符號,例如 $、~、#等,然後你就可以開始輸入需要的命令,若是命令正確,系統 就會依據命令的要求來執行,直到登出系統為止,在登入到登出期間, 輸入的每個命令都會經常解譯及