字元裝置驅動1

2021-09-30 06:48:50 字數 2950 閱讀 2875

1

.cdev

結構體linux2.6

核心使用

cdev

結構體描述字元裝置

struct cdev // cdev

的定義在 ;

其中dev_t

定義了裝置號為32位

,前12位為主裝置號,後

20位為次裝置號

.可以使用如下巨集呼叫來獲得主、次裝置號:

major(dev_t dev)

minor(dev_t dev)

mkdev(int major,int minor) //

通過主次裝置號來生成

dev_t

以上巨集呼叫在核心原始碼中如此定義:

#define minorbits20

#define minormask((1u << minorbits) - 1)

//(1<<20 -1)

此操作後,

minormask

巨集的低20位為1

,高12位為0

#define major(dev)((unsigned int) ((dev) >> minorbits))

#define minor(dev)((unsigned int) ((dev) & minormask))

#define mkdev(ma,mi)

(((ma) << minorbits) | (mi))

下面一組函式用來對

cdev

結構體進行操作:

void cdev_init(struct cdev *, const struct file_operations *);//

初始化,建立

cdev

和file_operation

之間的連線

struct cdev *cdev_alloc(void); //

動態申請乙個

cdev

記憶體void cdev_put(struct cdev *p); //

釋放int cdev_add(struct cdev *, dev_t, unsigned); //

註冊裝置,通常發生在驅動模組的載入函式中

void cdev_del(struct cdev *);//

登出裝置,通常發生在驅動模組的解除安裝函式中

cdev_init()

的源**清單如下

// linux/fs/char_dev.c

void cdev_init(struct cdev *cdev, const struct file_operations *fops)

cdev_alloc()

用於動態申請乙個

cdev

記憶體,**清單如下

struct cdev *cdev_alloc(void)

return p; }

cdev_add

和cdev_del

分別用於新增和刪除乙個

cdev

,完成字元裝置的註冊和登出。

在字元裝置模組載入函式中呼叫

cdev_add

,模組寫在函式中呼叫

cdev_del

2. 分配和釋放裝置號

在註冊時應該先呼叫:

int register_chrdev_region(dev_t from,unsigned count,const char *name)

函式為其分配裝置號,

此函式可用:

int alloc_chrdev_region(dev_t *dev,unsigned baseminor,unsigned count,const char *name)

函式代替,

他們之間的區別在於:

register_chrdev_region()

用於已知裝置號時,另乙個用於動態申請,其優點在於不會造成裝置號重複的衝突。

在登出之後,應呼叫:

void unregister_chrdev_region(dev_t from,unsigned count)

函式釋放原先申請的裝置號。

他們之間的順序關係如下:

register_chrdev_region()

-->cdev_add() //

載入模組中

cdev_del()-->unregister_chrdev_region() //

解除安裝模組中

3. file_operations

結構體主要成員有

open, close , llseek, read, write, readdir, ioctl, mmap,poll

等,結構比較龐大,他們最終會被呼叫

4 linux

字元裝置驅動的組成

4.1

字元裝置驅動模組載入與解除安裝

模板如下

//xxdevice struct

struct ***_dev

***_dev;

static int __init ***_init(void)

static void __exit ***_exit(void)

4.2

完成file_operations

中的成員函式

按照file_operations

中定義的統一結構編寫實現函式

注意copy_from_user

和copy_to­_user

的使用struct file_operations ***_fops =//init the fops

;具體例項  :

makefile:

執行 insmod globalmem.ko ,載入模組

lsmod 和 /proc/devices 中可以看見 globalmem

通過: mknod /dev/globalmem c $device_number 0 建立裝置節點

在 /sysy/module 中會有相應的目錄和檔案

字元裝置驅動 1

字元裝置驅動 1 成於堅持,敗於止步 linux 字元裝置驅動結構 cdev 結構體 在 linux 2.6 核心中使用 cdev 結構體描述字元裝置,cdev 結構體的定義如 所示。1 struct cdev 2 cdev 結構體的 dev t 成員定義了裝置號,為 32 位,其中高 12 位為主...

驅動開發 字元裝置1

函式的呼叫 open syscall define3 sys open char filename,inflag do sys open do file open path openat do tmpfile return fd finish open do dentry open open ino...

字元裝置驅動學習(1)

首先,以查詢方式的按鍵驅動開始字元裝置驅動的學習。一.寫出框架 對於驅動的學習,框架思想非常重要 1.1.file operation file operation 結構是乙個字元驅動如何應用程式建立連線.這個結構,定義在 linux fs.h中,是乙個函式指標的集合.每個開啟檔案與它自身的函式集合...