linux 混雜裝置miscdevice

2021-07-12 00:25:38 字數 4808 閱讀 3581

#miscdevice混雜裝置

miscdevice混雜裝置是字元裝置的一種,它們共享乙個主裝置號(10),但次裝置號不同,所有混雜裝置形成乙個鍊錶,對裝置發給你問時核心根據次裝置號查詢到相應的miscdevice裝置。這樣做的好處,節約主裝置號,將某些裝置用鍊錶的形式鏈結在一起,最後通過查詢次裝置區分。

miscdevice混雜裝置用主裝置號無法匹配出裝置驅動,只能找到鍊錶,再通過次裝置號,才能找到裝置驅動,而一般字元裝置,通過主裝置號,就能找到裝置驅動了。

通過**,我們簡單了解一下miscdevice混雜裝置(只擷取有關內容)

include/linux/miscdevice.h:

#define misc_dynamic_minor 255

struct device;

struct miscdevice ;

extern int misc_register(struct miscdevice * misc);//混雜裝置註冊

extern int misc_deregister(struct miscdevice *misc);//混雜裝置登出

drivers/char/misc.c

static int misc_open(struct inode * inode, struct file * file) }

if (!new_fops)

} if (!new_fops)

goto fail;

} err = 0;

replace_fops(file, new_fops);

if (file->f_op->open)

fail:

mutex_unlock(&misc_mtx);

return err;

}/* 包含一組裝置驅動操作的結構體 */

static const struct file_operations misc_proc_fops = ;

/* 混雜裝置註冊 */

int misc_register(struct miscdevice * misc)

misc->minor = dynamic_minors - i - 1;

set_bit(i, misc_minors);

} else

} }dev = mkdev(misc_major, misc->minor);

/* * device_create() : 在/dev/目錄下建立裝置檔案

* 所以在混雜裝置中不需要用mknod命令顯式建立裝置檔案

* 但device_create() 依賴 /sys/class 下的檔案,因此在此之前得呼叫class_create()

*/misc->this_device = device_create(misc_class, misc->parent, dev,

misc, "%s", misc->name);

if (is_err(misc->this_device))

/** add it to the front, so that later devices can "override"

* earlier defaults

*//*

* 將成功建立的混雜裝置新增到全域性鍊錶misc_list中

*/ list_add(&misc->list, &misc_list);

out:

mutex_unlock(&misc_mtx);

return err;

}/* 混雜裝置解除安裝 */

int misc_deregister(struct miscdevice *misc)

export_symbol(misc_register);

export_symbol(misc_deregister);

static int __init misc_init(void)

subsys_initcall(misc_init);

struct file_operations : 採用物件導向的思想,將一組系統呼叫封裝到乙個結構體中。在寫裝置驅動時,將自定義的操作賦值相應的系統呼叫。當對該裝置檔案操作時,核心自動選擇相應的系統呼叫。

struct inode : 在內部表示檔案。在裝置驅動中,一般只使用dev_t i_rdev和struct cdev *i_cdev。

struct file : 表示開啟的檔案。它是由核心open時建立,並傳遞給在該檔案上進行操作的所有函式,直到最後的close函式。

各自成員請參考《linux裝置驅動程式》第三章。

接下來,比較混雜裝置和一般字元裝置

資料結構:在混雜裝置中自定義的資料結構不必包含miscdevice結構體,而一般字元裝置中自定義的資料結構得包含cdev結構體。

裝置編號: 在混雜裝置中主裝置編號恒為10,次裝置編號在呼叫misc_register()時分配。而在一般字元裝置提供了兩種分配裝置編號的方法,一是當明確知道所需要的裝置編號時,呼叫register_chrdev_region()分配次裝置號,二是當不明確主裝置號時,則採用alloc_chrdev_region()動態主裝置號。

註冊字元裝置:在混雜字元裝置中僅需呼叫misc_register()即可註冊,而一般字元裝置,則需要通過cdev_init()初始化包含struct cdev的資料結構和cdev_add()通知核心字元裝置的資訊。

自定義系統呼叫:混雜裝置中無需自定義open系統呼叫,而一般字元裝置中,則需要自定義open系統呼叫。

解除安裝裝置: 在混雜字元裝置中,僅需呼叫misc_deregister()即可,而在一般字元裝置中,需要通過cdev_del()移除字元裝置和通過unregister_chrdev_region釋放已分配的裝置號。

實際的裝置檔案:在混雜裝置中,自動建立實際的裝置檔案;解除安裝混雜裝置模組時,自動刪除實際裝置檔案,原因請看上述源**。在一般字元裝置中,這需要通過/proc/devices檔案顯式建立實際的裝置檔案;解除安裝一般字元裝置模組之後,並沒有刪除實際的裝置檔案,需顯式刪除裝置檔案。

最後另附很小miscdevice驅動測試**:

mydev.c:

#include #include #include #include #include #include #include #include #include module_license("gpl");

#define mcdev_name "mcdev"

define_mutex(mcdev_mutex);

struct struct_mcdev_buf;

/* remember requesting space for a point */

static struct struct_mcdev_buf *mcdev_buf;

ssize_t mcdev_read(struct file *filp, char __user *to_userbuf, size_t count, loff_t *ppos)

*ppos += count;

res = count;

out:

mutex_unlock(&mcdev_mutex);

return res;

}ssize_t mcdev_write(struct file *filp, const char __user *from_userbuf, size_t count, loff_t *ppos)

*ppos += count;

out:

mutex_unlock(&mcdev_mutex);

return count;

}/* .open is initialized in driver/char/misc.c */

static struct file_operations ops = ;

/* * initialization for struct miscdevice

* but we initialize three member for it.

* * minor, name, fops

*/static struct miscdevice mcdev =;

static int __init register_mcdev(void)

static void __exit deregister_mcdev(void)

module_init(register_mcdev);

module_exit(deregister_mcdev);

module_author("[email protected]");

makefile檔案如下:

all: module

ifndef kernel_dir

kernel_dir = /lib/modules/`uname -r`/build

endif

obj-m := mydev.o

.phony: module

module:

make -c $(kernel_dir) m=$(pwd) modules

.phony: clean

clean:

make -c $(kernel_dir) m=$(pwd) clean

rm *~ > /dev/null 2>&1

.phony: install

install:

sudo insmod mydev.ko

.phony: uninstall

uninstall:

sudo rmmod mydev.ko

.phony: reload

reload:

sudo rmmod mydev.ko

sudo insmod mydev.ko

linux混雜裝置驅動

在linux系統中,存在一類字元裝置,它們擁有相同的主裝置號 10 但次裝置號不同,我 們稱這類裝置為混雜裝置 miscdevice 所有的 混雜裝置形成乙個鍊錶,對裝置訪問時核心根據 次裝置號查詢到相應的混雜裝置。linux中使用struct miscdevice來描述乙個混雜裝置。struct ...

Linux核心混雜裝置驅動

1.1混雜裝置驅動特點 本質上還是一類字元裝置,在驅動軟體上,混雜裝置的主裝置號已經由核心指定主裝置號為10 各個混雜裝置個體通過次裝置號來區分 1.2linux核心描述混雜裝置的資料結構 struct miscdevice 作用 描述混雜裝置 成員 minor 混雜裝置對應的次裝置號,切記主裝置號...

Linux 混雜裝置驅動模型

混雜裝置miscdevice是字元裝置的一種,它們共享乙個主裝置號misc major 即10 但次裝置號不同,所有的miscdevice裝置形成了乙個鍊錶,對裝置訪問時核心根據次裝置號查詢對應的miscdevice裝置。這樣做的好處,節約主裝置號,將某些裝置用鍊錶的形式鏈結在一起,最後通過查詢次裝...