1. 程式人生 > >Linux字元裝置

Linux字元裝置

一.驅動程式的概念


     所謂裝置驅動程式就是控制與管理硬體裝置資料收發的軟體,它是應用程式與硬體裝置溝通的橋樑。從本質上講驅動程式主要負責硬體裝置的資料讀寫,引數配置與中斷處理。裝置驅動程式是作業系統的一部分,通常執行在核心層。應用層通過系統呼叫進入核心層,核心層根據系統呼叫號來呼叫驅動程式對應的介面函式。在linux中驅動程式執行的原理如下圖1.1所示:

                   圖 1.1   linux系統中硬體.驅動與運用層的分層關係


二.linux中裝置型別


    Linux系統將裝置分成三種基本型別,每個模型通常實現為其中某一類:字元模組,塊模組或網路模組。這三種類型如下:

2.1.字元裝置


   字元(char)裝置是個能夠像位元組流(類似檔案)一樣被訪問的裝置,由字元裝置驅動程式來實現這種特性。字元裝置驅動程式通常至少要實現open,close,read和write系統呼叫。大多數字符裝置是一個個只
能順序訪問的資料通道。


2.2.塊裝置


     和字元裝置類似,塊裝置也是通過/dev目錄下的檔案系統節點來訪問。塊裝置能容納檔案系統,在大多數unix系統中,進行I/O操作時塊裝置每次只能傳輸一個或多個完整的塊。而每個塊包含512個位元組(或2的更高次冪位元組的資料)。Linux可以讓應用程式像字元裝置一樣地讀寫塊裝置,允許一次傳遞任意多位元組的資料。因此,塊裝置和字元裝置的區別僅僅在於核心內部管理資料的方式,也就是核心及驅動程式之間的軟體介面,而這些不同對使用者來講是透明的。在核心中,和字元裝置驅動程式相比,塊驅動程式具有完全不同的介面。

2.3.網路介面


    任何網路事務都經過一個網路介面形成,即一個能夠和其他主機交換資料的裝置。通常,介面是個硬體裝置,但也可能是個純軟體裝置。Linux的網路子系統主要是基於BSD UNIX的socket機制,在網路子系統和驅動程式之間定義專門的資料結構(sk buff)進行資料的傳遞。Linux作業系統支援對傳送資料和接收資料的快取,提供流量控制機制,提供對多種網路協議的支援.

三.字元裝置驅動原理


3.1.file_operations

    linux中字元裝置驅動程式的主要功能是實現裝置的讀寫和控制介面。對於字元裝置驅動程式,最核心的就是file_operations結構,這個結構實際上是VFS(虛擬檔案系統)的檔案介面,它的每個成員函式一般都對應一個系統呼叫。使用者程序利用系統呼叫對裝置檔案進行諸如讀和寫等操作時,系統呼叫通過裝置檔案的豬裝置號找到對應的裝置驅動程式,並且呼叫相應的驅動程式函式。
file_operations結構定義如下:
struct file_operations 
{
struct module *owner;//應用該結構的模組的指標,一般為THIS_MODULES
loff_t (*llseek) (struct file *, loff_t, int);//用來修改檔案當前的讀寫位置
ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);//從裝置中同步讀取資料
ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);//向裝置傳送資料
int (*open) (struct inode *, struct file *);//開啟
int (*release) (struct inode *, struct file *);//關閉
int (*ioctl) (struct inode *, struct file *, unsigned int, unsigned long);//執行裝置I/O命令
…………………………………
};

其中struct file代表一個開啟的檔案,在執行file_operations中的open操作時被建立。


3.2.應用層與驅動層的呼叫關係


圖3.1.清晰地描述了應用層與驅動層之間的呼叫關係,假設驅動程式中定義的file_operation是fops.

         圖3.1.應用層與驅動層之間的呼叫關係


3.3.一般字元裝置驅動需要提供的介面


    在linux中一切裝置的驅動都是以檔案形式存在(以字元裝置說明操作佈置),操作一個檔案肯定得需要先開啟,然後根據實際硬體的特徵,看是否需要進行有關的引數設定,實質就是操作硬體裝置的暫存器(不包括CPU本身),然後實現CPU與具體的硬體進行通訊,這種通訊只有兩種方式,一是向硬體中寫資料,二是向硬體中讀資料。圖3.1已經很清楚了描述了一般的字元裝置驅動需要嚮應用層提供的API函式。


四.linux字元裝置驅動中的遊戲規則


4.1.主次裝置號


    在linux應用程式中開啟一個檔案後會返回一個檔案描述符fd(網路連線成功後也會返回一個檔案描述符,有的地方稱為“控制代碼”),用於區別各個檔案。那麼在linux中怎麼管理裝置檔案呢?裝置驅動檔案一般位於/dev目錄下,如果執行ls –l命令,則可在裝置檔案項的最後修改日期前看到兩個數(用逗號分隔),這個兩個數就是相應裝置的主裝置號和次裝置號。
crw-rw----. 1 root root     10,  60  5月 23 15:14 network_latency
crw-rw----. 1 root root     10,  59  5月 23 15:14 network_throughput
crw-rw-rw-. 1 root root      1,   3  5月 23 15:14 null
crw-r-----. 1 root kmem     10, 144  5月 23 15:14 nvram
crw-rw----. 1 root root      1,  12  5月 23 15:14 oldmem
通常而言,主裝置號標識裝置對應的驅動程式,現代的linux核心允許多個驅動程式共享主裝置號,次裝置號由核心使用用於正確確定裝置檔案所指的裝置。

4.2.裝置編號的內部表達


    在核心中,dev_t型別(在)用來儲存裝置編號-----包括主裝置號和次裝置號。dev_t是一個32位的數,其中的12位用來表示主裝置號,而其餘20位用來表示次裝置號。如果要獲得dev_t的主裝置號或次裝置號,應使用:
    MAJOR(dev_t dev);
    MINOR(dev_t dev);
相反,如果需要將主裝置號和次裝置號轉換為dev_t型別,則使用:
MKDEV(int major,int minor);

4.3.cdev結構體


在linux2.6核心中,使用cdev結構體描述一個字元裝置,cdev結構體的定義如下所示:
struct cdev {
 struct kobject kobj;//內嵌的kobject物件
 struct module *owner;//所屬模組
 const struct file_operations *ops;//檔案操作結構體
 struct list_head list;
 dev_t dev;//裝置號
 unsigned int count;
};
   Linux2.6核心提供了一組函式用於操作cdev結構體;
void cdev_init(struct cdev *,struct file_operations *);
strcut cdev *cdev_alloc(void);
void cdev_put(strcut cdev *p);
int cdev_add(struct cdev *,dev_t ,unsigned );
void cdev_del(struct cdev *);
各個函式的作用如下:
cdev_init()函式用於初始化cdev的成員,並建立cdev和file_operations之間的聯絡。
cdev_alloc()函式用於動態申請一個cdev記憶體。
cdev_add()函式和cdev_del函式分別向系統新增和刪除一個cdev,完成字元裝置的註冊和登出。對cdev_add()的呼叫通常發生在字元裝置驅動模組載入函式中,而對cdev_del()函式的呼叫則通常發生在字元裝置驅動模組解除安裝函式中。
注意:在老2.6的版本和2.4的核心中註冊一個字元裝置驅動程式的經典方式為:
int register_chrdev(unsigned int major,const char *name,struct file_operations *fops);
其中,major是裝置的主裝置號,name是驅動程式的名字,而fops是預設的file_operations結構。
如果使用register_chrdev函式,將自己的裝置從系統中移除的正確函式是:
int unregister_chrdev(unsigned int major,const char *name);


4.4. 分配和釋放裝置編號


在呼叫cdev_add()函式向系統註冊字元是裝置之前,應首先呼叫register_chrdev_region()或者
alloc_chrdev_region()函式向系統申請裝置號,這兩個函式的原型為:
int register_chrdev_region(dev_t from,unsigned count,const char *name);
int alloc_chrdev_region(dev_t *dev,unsigned baseminor,unsigned const char *name);
 register_chrdev_region()函式用於已經知道起始裝置的裝置號的情況,而alloc_chrdev_region()
用於裝置號未知,向系統動態申請未被使用的裝置號的情況,函式呼叫成功之後,會得到的裝置號放入
第一個dev中。alloc_chrdev_region()與register_chrdev_region()對比的優點在於它會自動避開裝置
號重複的衝突。
相反地,在呼叫cdev_del()函式從系統登出字元裝置之後,unregister_chrdev_region()應該被呼叫以
釋放原先申請的裝置號,這個函式的原型為:
void unregister_chrdev_region(dev_t from,unsigned count); 

五.字元裝置驅動程式設計流程與方法


    字元裝置的驅動可以總結為兩點:一是對cdev結構體進行初始化,實現對字元裝置的註冊,二是實現file_operations這個結構體中需要實現的API函式介面。


5.1.整體的驅動設計模組


字元裝置驅動程式的整體框架如下圖5.1所示:

                        

                     圖5.1 字元裝置驅動程式的整體框架

5.2.字元裝置驅動模組載入與解除安裝函式


5.2.1字元裝置驅動模組載入函式設計流程

採用2.6版本的核的註冊字元裝置方法實現。字元裝置驅動模組載入函式的設計流程如下圖5.2所示:

                     圖5.2  字元裝置驅動模組載入函式的設計流程

    在申請裝置號的時候可以採用動態申請或者採用固定主裝置的方式去申請(這種方式務必不要佔用現有核心已經使用到的裝置號).在給結構體分配記憶體時使用kmalloc函式,分配完後務必需要將裡面的資料清0。
在初始化cdev這個結構體都是按照標準的流程走的。在這裡有個出錯處理方法務必要注意,這是linux編寫程式的一大特點,無論是在驅動程式還是在應用程式中都會設計到出錯處理的。


5.2.2.字元裝置驅動模組解除安裝函式


模組的解除安裝函式比較簡單,軟體設計流程如下圖5.3所示:

            

           圖5.3  模組的解除安裝軟體設計流程


登出cdev採用函式cdev_del(),釋放裝置結構體記憶體採用函式kfree(),釋放裝置號採用unregister_chrdev_region().

5.3. read()和write()函式設計


5.3.1.read()和write()的使用介紹


read和write方法完成的任務是相似的,亦即,拷貝資料到應用程式空間,或反過來從應用程式拷貝資料。它們的函式原型如下:
ssize_t read(struct file *filp,char _ _user *buff,size_t count,loff_t *offp);
ssize_t write(struct file *filp,const char _ _user *buff,size_t count,loff_t *offp);
引數filp是檔案指標,引數count是請求傳輸的資料長度。引數buff是指向使用者空間的緩衝區,這個緩衝區或者儲存要寫入的資料,或者是一個存放新讀入的空緩衝區。最後的oftp是一個指向”long offset type(長偏移量型別)”物件的指標,這個物件指明使用者在檔案中存取操作的位置。返回值是”signed size type(有符號的尺寸型別)”。read和write方法的buff引數是使用者空間的指標。因此,核心程式碼不能直接引用其中的內容。出現這種限制的原因如下:
1).隨著驅動程式所執行的構架的不同或者核心配置的不同,在核心模式中遠行時,使用者空間的指標是無效的。該地址可能根本無法被對映到核心空間,或者可能指向某些隨機資料。
2).即使該指標在核心空間中代表相同的東西,但使用者空間的記憶體是分頁的,而在系統呼叫被呼叫時,涉及到的記憶體可能根本不在RAM中。對於使用者空間記憶體的直接引用將導致頁錯誤,而這對核心程式碼來說是不允許發生的事件。其結果可能是一個”opps”,它將導致呼叫該系統呼叫的程序死亡。
3).我們討論的指標可能是由使用者程式提供,而該程式可能存在缺陷或者是個惡意程式。如果我們的驅動程式盲目引用使用者提供的指標,將導致系統出現開啟的後門,從而允許使用者空間程式隨意訪問或者覆蓋系統中的記憶體。如果我們不打算因為自己的驅動程式而危及使用者系統的安全性,則永遠不應直接引用使用者空間的指標。


read和write程式碼要做的工作就是在使用者地址空間和核心地址空間之間進行整段資料的拷貝。這種能力是由下面的核心函式提供的,它們用於拷貝任意的一段位元組序列,這也是大多數read和write方法實現的核心部分。
unsigned long copy_to_user(void _ _user *to,const void *from,unsigned long count);
unsigned long copy_from_user(void *to,const void _ _user *from,unsigned long count);
雖然這些函式的行為很像通常的memcpy函式,但當核心空間內執行的程式碼訪問使用者空間時需要注意。
這兩個函式的作用不限於在核心空間和使用者空間之間的拷貝資料,它們還檢查使用者空間的指標是否有效,如果指標無效,就不會進行拷貝;另外一個方面,如果在拷貝過程中遇到無效地址,則僅僅會複製部分資料。在這兩種情況下,返回值是還需要拷貝的記憶體數量值。至於實際的訪問方法,read方法的任務是從裝置拷貝資料到使用者空間(copy_to_user),而write方法則是從使用者空間拷貝資料到裝置上(使用copy_from_user).每次read或write系統呼叫都會請求一定數目的位元組傳輸,不過驅動程式也並不限制小資料量的傳輸。

5.3.2.write()/read()程式設計流程


write/read程式設計流程如圖5.4所示

     

                        圖 5.4write/read程式設計流程


5.4.ioctl()函式設計


5.4.1.ioctl()函式介紹

除了讀取和寫入裝置之外,大部分驅動程式還需要另外一種能力,即通過裝置驅動程式執行各種型別的硬體控制。簡單資料傳輸之外,大部分裝置可以執行其他一些操作,比如,使用者空間經常會改變波特率的大小,設定裝置地址等。這些操作通常通過ioctl方法支援,該方法實現了同名的系統呼叫。在使用者空間,ioctl系統呼叫具有如下原型:
int ioctl(int fd,unsigned long cmd,…);
由於使用了一連串的”.”緣故,這個原型在UNIX系統呼叫中顯得比較特別,通常這個點代表可變數目的引數表。
驅動程式的ioctl方法原型和使用者空間的版本存在一些不同:
int (*ioctl) (struct inode *inode,strcut file *filp,unsigned int cmd,unsigned long arg);
inode和filp兩個指標的值對應於應用程式傳遞的檔案描述符fd,這和傳給open方法的引數一樣。引數cmd由使用者空間不經修改地傳遞給驅動程式,可選的arg引數則無論使用者程式使用的是指標還是整數值,它都以unsigned long 的形式傳遞給驅動程式。

5.4.2.ioctl()命令


在編寫ioctl程式碼之前,需要對應不同的命令編號。多數程式設計師的第一本能是從0或者1開始選擇一組小的編號,然而,有許多種理由要求不能這樣選擇命令的編號。為了防止對錯誤的裝置使用正確的命令,命令號應該在系統範圍內唯一。這種錯誤匹配並不是不會發生,程式可能發現自己正在試圖對FIFO和audio等這類非序列裝置輸入流修改波特率。如果每一個ioctl命令都是唯一的,應用才程式進行這種操作時就會得到一個EINVAL錯誤,而不是無意間成功地完成了意想不到的操作。要按linux核心的約定方法為驅動程式選擇ioctl編號,應該首先看看include/asm/ioctl.h和Documentation/ioctl-neumber.txt這兩個檔案。
標頭檔案定義了要使用的位欄位:型別(幻數),序數,傳送方向以及引數的大小等等。
type:幻數。選擇一個號碼,並在整個驅動程式中使用這個號碼。這個欄位有8位寬(_IOC_TYPEBITS)。
number:序數(順序編號)。它也是8位寬(_IOC_NRBITS)。
direction:如果相關命令涉及到資料傳輸,則該位欄位定義資料傳輸的方向。可以使用的值包括_IOC_NONE(沒有資料傳輸),_IOC_READ,_IOC_WRITE以及_IOC_READ|_IOC_WRITE(雙向傳輸資料)。資料傳輸是從應用程式的角度看的,也就是說,IOC_READ意味著從裝置中讀取資料,所以驅動程式必須向用戶空間寫入資料。
Size:所涉及的使用者資料大小。這個欄位的寬度與體系結構有關,通常是13位或14位,具體可通過_IOC_SIZEBITS找到針對體系結構的具體資料。
I/O控制命令的組成如下表5.1所示:
裝置型別 序列號 方向 資料尺寸
8bit 8bit 2bit 13/14bit
表5.1 I/O控制命令的組成


5.5.open()函式設計


open()函式提供給驅動程式以初始化的能力,從而為以後的操作完成初始化做準備。在大部分驅動程式中,open應該完成如下工作:檢查裝置特定的錯誤(諸如裝置未就緒或類似的硬體問題)。如果裝置是首次開啟,則對其進行初始化。如有必要,更新f_op指標。分配並填寫置於filp->private_data裡的資料結構。
open()函式的原型如下:
int (*open) (strcut inode *inode,struct file *filp);

5.6.release()函式


release方法的作用正好與open相反。有時候也會發現這個方法的實現被稱為device_close,而不是device_release。無論是那種形式,這個裝置方法都應該完成下面的任務:釋放由open分配的,儲存在filp->private_data中的所有內容。在最後一次關閉操作時關閉裝置。

六.核心提供的API函式


int MAJOR(dev_t dev);
int MINOR(dev_t dev);
這兩個巨集從裝置編號中抽取出主/次裝置號
dev_t MKDEV(unsigned int major,unsigned int minor);
這個巨集由主/次裝置號構造一個dev_t資料項
int register_chrdev_region(dev_t from,unsigned count,const char *name);
int alloc_chrdev_region(dev_t *dev,unsigned baseminor,unsigned const char *name);
void unregister_chrdev_region(dev_t from,unsigned count);  
提供給驅動程式用來分配和釋放裝置編號範圍的函式。在期望的主裝置號預先知道的情況下,應呼叫register_chrdev_region();
而對動態分配,使用int alloc_chrdev_region().
int register_chrdev(unsigned int major,const char *name,struct file_operations *fops);
老的(2.6版本之前)字元設備註冊例程。
int unregister_chrdev(unsigned int major,const char *name);
用於登出由register_chrdev函式註冊的驅動程式。major和name字串必須包含與註冊驅動程式時使用相同的值。
void cdev_init(struct cdev *,struct file_operations *);
strcut cdev *cdev_alloc(void);
void cdev_put(strcut cdev *p);
int cdev_add(struct cdev *,dev_t ,unsigned );
void cdev_del(struct cdev *);
用來管理cdev結構的函式,核心中使用該結構表示字元裝置。
unsigned long copy_to_user(void _ _user *to,const void *from,unsigned long count);
unsigned long copy_from_user(void *to,const void _ _user *from,unsigned long count);
在使用者和核心空間之間拷貝資料。
int (*ioctl) (struct inode *inode,strcut file *filp,unsigned int cmd,unsigned long arg);
用於對硬體的控制。

相關推薦

Linux字元裝置驅動模型--字元裝置的註冊

當我們編寫字元裝置驅動程式的時候,在進行字元裝置物件cdev的分配、初始化,裝置號的註冊這些初始化階段之後,就可以將它加入到系統中,這樣才能使用這個字元裝置。將一個字元裝置加入到系統中呼叫的函式時cdev_add,核心原始碼如下: int cdev_add(struct cdev *

Linux 字元裝置驅動結構(二)—— 自動建立裝置節點

      上一篇我們介紹到建立裝置檔案的方法,利用cat /proc/devices檢視申請到的裝置名,裝置號。 第一種是使用mknod手工建立:mknod filename type major minor 第二種是自動建立裝置節點:利用u

Linux 字元裝置驅動結構(一)—— cdev 結構體、裝置號相關知識解析

一、字元裝置基礎知識 1、裝置驅動分類       linux系統將裝置分為3類:字元裝置、塊裝置、網路裝置。使用驅動程式: 字元裝置:是指只能一個位元組一個位元組讀寫的裝置,不能隨機讀取裝置記憶體中的某一資料,讀取資料需要按照先後資料。

linux 字元裝置框架使用 初級

#include <linux/module.h> #include <linux/init.h> #include <linux/kernel.h> #include <linux/types.h> #include <linux/cdev.h

Linux字元裝置驅動註冊三種方法以及核心分析

       Linux驅動是使用者訪問底層硬體的橋樑,驅動有可以簡單分成三類:字元裝置、塊裝置、網路裝置。其中最多的是字元裝置,其中字元裝置的註冊方法主要有三種:雜項設備註冊、早期字元設備註冊、標準字元設備註冊。以及詳細介紹各類方法註冊。 開發環境: PC:WMwork

linux字元裝置驅動模型

一.雜項裝置驅動模型 雜項的主裝置號固定為10,只有255個次裝置號。可以直接生成驅動核心。 1.需要確定每個模型都會用到的檔案操作方法集合指標 2.確定核心的結構體 static struct miscdevice abc 確定三個引數,第一個為次裝置號,第二個是次裝

Linux字元裝置中的兩個重要結構體(file、inode)

對於Linux系統中,一般字元裝置和驅動之間的函式呼叫關係如下圖所示 上圖描述了使用者空間應用程式通過系統呼叫來呼叫程式的過程。一般而言在驅動程式的設計中,會關係 struct file 和 struct inode 這兩個結構體。 使用者空間使用open()系統呼叫函式開啟一個字元裝置時( int fd

Linux字元裝置驅動

一、字元裝置基礎 字元裝置:是指只能一個位元組一個位元組進行讀寫操作的裝置,不能隨機讀取裝置中的某一資料、讀取資料要按照先後資料。字元裝置是面向流的裝置,常見的字元裝置有滑鼠、鍵盤、串列埠、控制檯和LED等。 一般每個字元裝置或者塊裝置都會在/dev目錄(可以是任意目錄,這樣是為了統一)下對應一個裝置檔案

3---linux字元裝置之點亮led

概要:上一篇我們編寫了一個非常簡單的字元裝置框架和一個我們自己寫的fops,似乎還是感覺有點索然無味,因此這篇我們搞一個能在現實世界上出現的東西,就是led亮起來 上一篇我們寫了一個字元裝置的框架,因此我們可以拿過來用:2—linux字元裝置進階篇 1.檢視2440原理圖,隨便找一個

2---linux字元裝置進階篇

概要:上一篇我們編寫了一個簡單的驅動程式,似乎有點索然無味,其實我也是這樣覺得的,所以這篇我們將加大力度。 看了上一篇的字元裝置似乎覺得很簡單,事實不然。 如何註冊字元裝置 先來看幾個函式: int register_chrdev_region(dev_t dev_id

1--linux字元裝置驅動

1. 編寫一個簡單的字元裝置框架 *****hello.c***** #include <linux/module.h> #include <linux/kernel.h> #include <linux/fs.h> #include <

從零開始寫linux字元裝置驅動程式(一)(基於友善之臂tiny4412開發板)

從這篇博文開始,我將開始手把手教會大家寫linux裝置驅動程式這是開篇,如何來寫第一個字元裝置驅動程式。首先,寫一個最簡單的字元裝置驅動程式需要什麼?或者說我們需要了解什麼?1、每一個字元裝置至少需要有一個裝置號2、裝置號 = 主裝置號 + 次裝置號3、同一類裝置的主裝置號一

Linux 字元裝置驅動結構(三)—— file、inode結構體及chardevs陣列等相關知識解析

       先看下面這張圖,這是Linux 中虛擬檔案系統、一般的裝置檔案與裝置驅動程式值間的函式呼叫關係;         上面這張圖展現了一個應用程式呼叫字元裝置驅動的過程, 在裝置驅動程式的設計中,一般而言,會關心 file 和 inode 這兩個結構體  

Linux字元裝置與塊裝置的區別與比較

Linux中I/O裝置分為兩類:塊裝置和字元裝置。兩種裝置本身沒有嚴格限制,但是,基於不同的功能進行了分類。 (1) 字元裝置:提供連續的資料流,應用程式可以順序讀取,通常不支援隨機存取。相反,此類裝置支援按位元組/字元來讀寫資料。舉例來說,調變解調器是典型的字元裝置。 (

linux字元裝置驅動程式scull例項

這個例子還是比較完整的講述了字元驅動開發的過程,尤其字元驅動程式的設計流程,包括測試在內。 【1.系統環境】 該驅動程式在UBUNTU10.04LTS編譯通過,系統核心為linux-2.6.32-24(可使用uname -r 命令來檢視當前核心的版本號) 由於安裝UBUNTU10.04LTS時,沒有安裝LI

Linux字元裝置

一.驅動程式的概念      所謂裝置驅動程式就是控制與管理硬體裝置資料收發的軟體,它是應用程式與硬體裝置溝通的橋樑。從本質上講驅動程式主要負責硬體裝置的資料讀寫,引數配置與中斷處理。裝置驅動程式是作業系統的一部分,通常執行在核心層。應用層通過系統呼叫進入核心層,核心

【14】Linux-字元裝置控制技術

Linux-字元裝置控制技術 裝置控制-應用函式 在使用者空間,使用ioctl系統呼叫來控制裝置: int ioctl(int fd, unsigned long cmd, ....) fd:要控制的裝置檔案描述符 cmd:傳送給裝置的控制命令,其實只是用來起到標識作用 .

Linux 字元裝置驅動開發--記憶體讀寫操作

學習Linux的累計時間已經有兩年多了,工作關係,學習的過程總是斷斷續續的,現在整理一下,下面要分享的是一個簡單的linux驅動程式,將記憶體當作一個虛擬的裝置去讀寫,沒有什麼實際的用處,像hello wold!程式一樣,我們簡單體會一下linux驅動程式的特點,Linux

linux 字元裝置和misc裝置

字元裝置 2.6版本前使用的結構體和函式 <span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"></span>&l

linux字元裝置驅動開發模板及Makefile

#include <linux/init.h> #include <linux/module.h> #include <linux/fs.h> #include <linux/cdev.h> #include <linux/device.h> //