020 註冊字元類裝置

2021-09-27 12:53:10 字數 4608 閱讀 1967

1、位置:原始碼目錄下 include/linux/slab.h

2、函式原型

/**

* kzalloc - allocate memory. the memory is set to zero.

* @size: how many bytes of memory are required.

* @flags: the type of memory to allocate (see kmalloc).

*/static inline void *kzalloc(size_t size, gfp_t flags)

3、引數size:申請的記憶體大小(最大128k)

flags:gfp_kernel,代表優先權,記憶體不夠可以延遲分配

4、功能

分配連續的虛擬位址,用於小記憶體分配。

5、記憶體空間釋放函式

void kfree(const void *);
1、位置:原始碼目錄下的 include/linux/cdev.h2、字元類裝置初始化cdev_init函式原型

struct cdev ;
void cdev_init(struct cdev *, const struct file_operations *);
3、引數struct cdev *: cdev字元裝置檔案結構體

const struct file_operations *:file_operations結構體

註冊裝置本質是向linux裝置檔案中新增資料,這些資料需要初始化。

4、字元裝置註冊函式 cdev_add()函式原型

int cdev_add(struct cdev *, dev_t, unsigned);
5、引數struct cdev *:cdev字元裝置檔案結構體

dev_t: 裝置號

unsigned: 裝置範圍大小

6、功能: 向系統註冊裝置,也就是向linux系統新增資料

7、解除安裝字元裝置函式cdev_del()函式原型

void cdev_del(struct cdev *);
1、register_cdev.c

/*包含初始化巨集定義的標頭檔案,**中的module_init和module_exit在此檔案中*/

#include

/*包含初始化載入模組的標頭檔案,**中的module_license在此標頭檔案中*/

#include

/*定義module_param module_param_array的標頭檔案*/

#include

/*定義module_param module_param_array中perm的標頭檔案*/

#include

/*三個字元裝置函式*/

#include

/*mkdev轉換裝置號資料型別的巨集定義*/

#include

/*定義字元裝置的結構體*/

#include

/*分配記憶體空間函式標頭檔案*/

#include

#define device_name "ascdev"

#define device_minor_num 2

#define dev_major 0

#define dev_minor 0

#define regdev_size 3000

module_license

("dual bsd/gpl");

/*宣告是開源的,沒有核心版本限制*/

module_author

("skyfall");

/*宣告作者*/

int numdev_major = dev_major;

int numdev_minor = dev_minor;

/*輸入主裝置號*/

module_param

(numdev_major,

int,s_irusr)

;/*輸入次裝置號*/

module_param

(numdev_minor,

int,s_irusr)

;struct reg_dev

;struct reg_dev *my_devices;

struct file_operations my_fops =

;/*裝置註冊到系統*/

static

void

reg_init_cdev

(struct reg_dev *dev,

int index)

else

}static

int __init scdev_init

(void

)else

if(ret <0)

my_devices =

kmalloc

(device_minor_num *

sizeof

(struct reg_dev)

,gfp_kernel);if

(!my_devices)

memset

(my_devices,

0,device_minor_num *

sizeof

(struct reg_dev));

/*裝置初始化*/

for(i =

0; i < device_minor_num; i++

)printk

(kern_emerg "scdev_init!\n");

/*列印資訊,kern_emerg表示緊急資訊*/

return0;

fail:

/*登出裝置號*/

unregister_chrdev_region

(mkdev

(numdev_major,numdev_minor)

,device_minor_num)

;printk

(kern_emerg "kmalloc is fail!\n");

return ret;

}static

void __exit scdev_exit

(void

)unregister_chrdev_region

(mkdev

(numdev_major,numdev_minor)

,device_minor_num)

;return;}

module_init

(scdev_init)

;/*初始化函式*/

module_exit

(scdev_exit)

;/*解除安裝函式*/

2、makefile檔案

#!/bin/bash

$(warning kernelrelease =

$(kernelrelease)

)ifeq (

$(kernelrelease)

,)#核心的原始碼路徑, ?= 條件賦值, uname -r 得到核心版本號

kerneldir ?= /home/mint/itop/linux_3.0

# := 立即賦值, 得到當前的絕對路徑

pwd :=

$(shell pwd

)# -c 切換工作路徑, $(make) = make

modules:

$(make)

-c $(kerneldir)

m=$(pwd)

modules

clean:

rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions module* modules*

.phony: modules clean

else

# 生成模組

obj-m := register_cdev.o

endif

3、編譯成驅動檔案4、載入驅動

5、解除安裝驅動

字元裝置的註冊

核心中每個字元裝置都對應乙個 cdev 結構的變數,下面是它的定義 struct cdev 乙個 cdev 一般它有兩種定義初始化方式 靜態的和動態的。靜態記憶體定義初始化 struct cdev my cdev cdev init my cdev,fops my cdev.owner this m...

字元裝置的註冊

前面提到,核心內部使用struct cdev結構來表示字元裝置。在核心呼叫裝置的操作之前,必須分配並註冊乙個或者多個上述結構。在 linux cdev.h 中定義了這個結構以及與其相關的一些輔助函式。如果需要動態的初始化,應該編寫如下 struct cdev my cdev cdev alloc m...

裝置驅動開發實驗教程(9) 註冊字元類裝置號

前面學習的雜項裝置,主裝置號已經固定為 10,這裡介紹申請標準的字元類裝置號,包括主裝置號以及次裝置號。字元類裝置號分為靜態申請和動態申請,靜態申請就是主裝置號是程式設計師手動分配,動態申請是系統給分配。字元裝置函式在檔案 include linux fs.h 中。核心提供了三個函式來註冊一組字元裝...