Linux 標準字元裝置

2022-06-30 04:36:14 字數 3487 閱讀 4099

標準字元是核心對字元裝置驅動的一種管理方式。

標準字元裝置和早期字元、雜項字元裝置本質上相同,都是對字元裝置驅動的不同管理方式。

乙個裝置驅動,不管用早期字元裝置、雜項字元裝置、標準字元裝置去管理,裝置驅動功能沒有任何區別!

標準字元裝置是由早期字元裝置拓展得到的,是由早期字元裝置發展而來的,和早期字元裝置80%相似!

標準字元裝置的用途:主要在早期字元裝置基礎上,拓展了裝置號的範圍!

標準字元裝置也可以用來管理一類類的裝置!

特殊宣告:標準字元裝置的裝置號分配比較靈活、自由!

字元裝置具備三種核心屬性:裝置號、裝置節點檔案、檔案操作集合

標準字元裝置的裝置號分布:u32  devnum = (major << 20) | minor;

主裝置號: 0 ~ 2^12

次裝置號: 0 ~ 2^20

裝置節點檔案:

標準字元裝置註冊成功之後,分配得到裝置號。但是裝置節點檔案並不會自動建立,需要手動建立!

例: mknod   /dev/led_hehe   c   major   minor

檔案操作集合:

所有裝置驅動的檔案操作集合完全相同。

標準字元裝置結構體實質上和早期字元裝置結構體一樣!

標準字元裝置結構體:struct  cdev

struct cdev {

struct kobject kobj;

struct module* owner; //this_module

const struct file_operations* ops; //檔案操作集合

struct list_head  list; //字元裝置匯流排

dev_t dev; //裝置號

unsigned int count; //要同時連續註冊的裝置個數

標準字元裝置是由早期字元裝置拓展而來的,分析早期字元裝置註冊函式,可以獲取標準字元裝置註冊方式!

早期字元裝置註冊函式分析: register_chrdev();

register_chrdev();

--> __register_chrdev(major, 0, 256, name, fops); //因為該函式,早期字元裝置才必須同時註冊

256個次裝置號

--> struct cdev *cdev; // 1. 字元裝置結構體指標變數宣告

--> __register_chrdev_region(major, baseminor, count, name);//2. 分配乙個主裝置號對應的多個連續次裝置號

--> cdev = cdev_alloc(); //3. 在核心層分配字元裝置結構體變數空間

--> cdev->owner = fops->owner; //4. 對字元裝置結構體變數賦值

--> cdev->ops = fops;

--> kobject_set_name(&cdev->kobj, "%s", name);

--> cdev_add(cdev, mkdev(cd->major, baseminor), count); //5. 註冊當前字元裝置到字元裝置匯流排

--> return major ? 0 : cd->major;

根據早期字元裝置註冊流程,分析得到標準字元裝置註冊方式:

1)根據標準字元裝置結構體定義結構體指標變數,用來表示當前裝置驅動。  --> struct  cdev

2)分配結構體變數空間。 -->  cdev_alloc();

3)申請裝置號。可以申請乙個主裝置號對應的多個連續次裝置號。 --> alloc_chrdev_region();

4)標準字元裝置結構體變數初始化。 --> cdev_init();

5)註冊標準字元裝置到字元裝置匯流排。 -->  cdev_add();

cdev_alloc();

函式原型:struct  cdev *cdev_alloc(void);

函式功能:在核心層分配標準字元裝置結構體變數空間

形參列表:無

返回值:

失敗:null

釋放結構體空間:void  kfree(const void* p);

alloc_chrdev_region();

函式原型:int  alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count, const char *name);

函式功能:申請乙個主裝置號及其對應的多個連續次裝置號

形參列表:

dev:指標型別的傳參。 用來接收申請得到的

起始裝置號。

baseminor:起始次裝置號

count:同時申請的連續次裝置號的個數

name:裝置號標籤(隨意)

返回值:

成功:0

失敗:負數

釋放裝置號:void  unregister_chrdev_region(dev_t from, unsigned count);

cdev_init();

函式原型:void  cdev_init(struct cdev *cdev, const struct file_operations *fops);

函式功能:對標準字元裝置結構體變數初始化(主要初始化檔案操作集合)

形參列表:

cdev:要初始化的結構體變數

fops:檔案操作集合

返回值:無

cdev_add();

函式原型:int  cdev_add(struct cdev *p, dev_t dev, unsigned count);

函式功能:註冊字元裝置驅動到字元裝置匯流排。(可以同時註冊多個裝置)

形參列表:

p:要註冊的裝置驅動對應的裝置結構體

dev:要註冊的

起始裝置號

count:要連續註冊的裝置號的個數

返回值:

成功:0

失敗:負數

登出函式:void  cdev_del(struct cdev *p);

補充:裝置號和主裝置號、次裝置號之間轉換的方式!

#define minorbits 20

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

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

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

#define mkdev(ma,mi) (((ma) << minorbits) | (mi))

Linux字元裝置驅動 經典標準字元模型

經典標準字元模型,即為linux2.6之前的早期經典標準字元模型。沒有使用乙個核心的結構體,把需要的資訊進行封裝 安裝驅動後,不會在 dev 目錄下建立裝置節點,需要使用mknod建立。乙個主裝置號只能被註冊一次,一次註冊0 255的次裝置號就被占用了。雜項裝置,每次註冊,只占用了乙個次裝置號,主裝...

linux字元裝置

字元裝置的定義 linux下有三種裝置 字元裝置 塊裝置 網路裝置等等。它們均以乙個檔案節點形式顯示在檔案系統的 dev目錄下 crw w 1 root tty 4,0 7月 11 09 11 tty0其中c代表字元裝置型別 字元裝置是指裝置無需緩衝即可直接進行讀寫的裝置,如滑鼠,鍵盤,串列埠裝置等...

Linux字元裝置驅動

linux下的裝置驅動程式被組織為一組完成不同任務的函式的集合,通過這些函式使得windows的裝置操作猶如檔案一般。在應用程式看來,硬體裝置只是乙個裝置檔案,應用程式可以象操作普通檔案一樣對硬體裝置進行操作,如open close read write 等。linux主要將裝置分為二類 字元裝置和...