LDD读书笔记第六章-高级字符驱动程序操作(一)

ioctl

ioctl是用于控制设备的公共接口,设备除了需要处理读取写入之外还需要一些相关控制信息。这些控制信息就是由ioctl调用来完成
用户空间的ioctl原型为

1
int ioctl(int fd,unsigned long cmd,...);

后面的“…“表示函数的参数个数是可变的(如printf)。
内核空间的ioctl原型

1
2
int (*ioctl)(struct inode *inode,struct file *filp.
		unsigned int cmd,unsigned long arg);

cmd 为指令编号,后面讲述。
arg 为参数。可以是整数也可以是指针,但是内核会以unsigned long形式传送导函数里。
[阅读全文] »

LDD读书笔记第三章-字符设备驱动程序(二)

Scull中的设备注册

scull_dev结构:

1
2
3
4
5
6
7
8
9
struct scull_dev {
	struct scull_qset *data;  /* Pointer to first quantum set */
	int quantum;              /* the current quantum size */
	int qset;                 /* the current array size */
	unsigned long size;       /* amount of data stored here */
	unsigned int access_key;  /* used by sculluid and scullpriv */
	struct semaphore sem;     /* mutual exclusion semaphore     */
	struct cdev cdev;	  /* Char device structure		*/
};

[阅读全文] »

LDD读书笔记第三章-字符设备驱动程序(一)

设备号

一、简介

字符设备由在 /dev目录中使用 ls -l 使用来分辨,第一列为c是字符设备d为块设备。
一般同一类设备使用相同的设备号。而同种类型的不同设备用次设备号来表示。
列如对于磁盘:

1
2
3
4
5
brw-rw----  1 root disk    8,   0  714 08:15 sda
brw-rw----  1 root disk    8,   1  714 08:15 sda1
brw-rw----  1 root disk    8,   2  714 08:15 sda2
brw-rw----  1 root disk    8,   3  714 08:15 sda3
brw-rw----  1 root disk    8,   4  714 08:15 sda4

第一列的b表示是块设备,他们的主设备号8表示SCSI disk devices  次设备的 0~4 表示不同的分区。对于硬盘从设备号0~15 为第一块硬盘也就是sda, 16~31为第二块硬盘 sdb以此类推。详细状况查看linux设备号分配表。
Linux 设备分配清单

二、设备号的内部表达

内核使用dev_t 类型表达设备号。 在2.6.0版本中dev_t是32位数,其中12位表示主设备号20位表示从设备号。但是为了兼容性 应该使用相应的宏来操作设备号。

[阅读全文] »