LinuxÏÂPCIÉ豸Çý¶¯¿ª·¢Ïê½â ÏÂÔØ±¾ÎÄ

½âÊÍһϣº

llseek£º llseek¶ÔÓ¦×ÅÓû§¿Õ¼äÀïµÄlseek£¬ËüµÄ×÷ÓÃÊǸıäÎļþ½á¹¹ÖеIJÙ×÷λÖã¬ËµµÄÃ÷ȷһЩ¾ÍÊÇÐÞ¸Äfile->f_pos£»³É¹¦Ê±£¬Ëü·µ»ØÒ»¸öÐÂλÖã¬Ê§°Üʱ·µ»ØÒ»¸ö¸ºÊýÖµ£»

read£º readÊÇ´ÓÓ¦ÓóÌÐòµÄ½Ç¶È¿´µÄ˵·¨£¬ËùÒÔreadʵ¼ÊÉϾÍÊǰÑÊý¾Ýдµ½Óû§¿Õ¼ä£¬Èç¹û·µ»ØÒ»¸öÕýÊý£¬¾ÍÊÇʵ¼Ê¶Áµ½µÄ×Ö½ÚÊý£»¸ºÊý·µ»ØÖµ±íʾ´íÎó£»

write£ºwriteµÄ×÷ÓÃÊÇÏòÉ豸À¡ËÍÊý¾Ý£¬·µ»ØÖµ·½ÃæÓëreadÏàͬ£»

readdir£ºreaddirÖ»ÓÐÎļþϵͳ²ÅÄÜʹÓã¬ËüµÄ×÷ÓÃÊǽ«¶Áȡij¸ö×ÓĿ¼ÀïµÄÄÚÈÝ£»

poll£º pollÔÊÐíÓ¦ÓóÌÐòÏìÓ¦À´×ÔÉ豸µÄ¸ø¶¨Ê¼þ¡£ËüÔÚBSD UNIXÀïµÄ¶ÔÓ¦º¯ÊýÊÇselect, µ«Linux²»ÍƼöʹÓÃselect£¬ËùÒÔ Ó¦¸ÃÓÃpoll´úÌæËü£»

ioctl£º ËüµÄº¬ÒåÊÇI/O¿ØÖÆ£¬ËüÔÊÐíÓ¦Ðí³ÌÐòͨ¹ýioctlϵͳµ÷ÓÿØÖÆÉ豸µÄÐÐΪ»òÕß´ÓÉ豸ȡµÃÊý¾Ý£»

mmap£ºmmapʵÏÖÁËÉ豸µØÖ·¿Õ¼äµ½Óû§¿Õ¼äµÄµØÖ·µÄÓ³Éä¡£Ëü¿ÉÒÔÓÃÀ´Ìṩ¶ÔÉ豸Çý¶¯³ÌÐòµÄÄÚ²¿»º³åÇø»òÕßÍâÉèÄÚ´æ¿Õ¼ä½øÐÐÖ±½Ó·ÃÎʵŦÄÜ

Open£ºOpenÊÇÓ¦ÓóÌÐò´ò¿ªÉ豸ʱ½«Òªµ÷ÓõÄÎļþ²Ù×÷¡£ËüÊÇΨһһ¸ö¶Ô×Ö·ûÉ豸Óë¿éÉ豸¶¼ÓÐȱʡʵÏֵĺ¯Êý¡£Òò´Ë£¬Èç¹ûÄã²»ÐèÒª»ò²»ÏëÖªµÀÉ豸»áÔÚºÎʱ±»´ò¿ª£¬¾Í¿ÉÒÔ²»¶ÔÕâ¸öÎļþ²Ù×÷½øÐж¨Òå

flush£ºflushµÄ×÷ÓÃÊǰѻº³åÇøÊý¾Ý¡°³å¡±³öÈ¥¡£ÓÉÓÚ×Ö·ûÉ豸²»Ê¹Óûº³åÇø£¬ËùÒÔÕâ¸öÌõĿֻ¶Ô¿éÉ豸ÓÐÒâÒå

release:releaseÊÇÔÚÉ豸¹Ø±Õʱ½«±»µ÷ÓõÄÎļþ²Ù×÷

fsync: fsyncµÄ×÷ÓÃÊÇͬ²½ÄÚ´æÖÐÓë´ÅÅÌÉϵÄÊý¾Ý״̬£¬°ÑÊä³ö»º³åÇøÀïÉÐδдµ½´ÅÅÌÉÏÈ¥µÄÊý¾Ýд³öÈ¥¡£ËüÔÚ½áÊø²Ù×÷֮ǰÊDz»Ó¦¸Ã·µ»ØµÄ¡£Õâ¸öÌõĿҲֻÓÐÓë¿éÉ豸Óйأ»

fasync£ºfasync½«ÔÚÓ¦ÓóÌÐòͨ¹ýfcntl¸Ä±äÉ豸ÐÐΪʱµ÷Óã»

check_media_change£º check_media_change¼ì²é×Ô´ÓÉϴηÃÎÊÖ®ºó½éÖÊÊÇ·ñ¾­¹ýÁ˸ü»»¡£Òò´ËËüÖ»¶Ô´¦Àí¿É¸ü»»½éÖÊ£¨±ÈÈ磺£Ã£Ä£­£Ò£Ï£ÍºÍÈíÅÌ£©µÄ¿éÉ豸ÓÐÒâÒ壻

revalidate£ºrevalidateºÍcheck_media_changeÊÇÃÜÇÐÏà¹ØµÄ¡£Èç¹û¼ì²â³ö¸ü»»ÁËÅÌË㣬¾ÍÐèÒªµ÷ÓÃrevalidateÀ´¸üÐÂÉ豸ÄÚ²¿µÄÐÅÏ¢¡£revalidateÒ²ÊÇÖ»¶Ô¿É¸ü»»½éÖʵĿéÉ豸ÓÐÒâÒ壻

lock£ºlockʹÓû§¿ÉÒÔËø¶¨Ò»¸öÎļþ¡£ËüÒ²ÊÇÖ»¶ÔÎļþϵͳÓÐÒâÒå

ÈκÎÉ豸¶¼²»Ì«¿ÉÄÜÓõ½ÉÏÒ»½ÚËùÃèÊöµÄÄÇЩ·½·¨¡£ÄãÖ»ÐèÒª¶¨ÒåÄÇЩÄãÓõ½µÄº¯Êý£¬²»ÓõÄÈ«²¿ÖãΣգ̣̣¬µ±×Ö·ûÉ豸ע²áʱ£¬É豸µÄ file_operation½á¹¹ºÍÉ豸µÄÃû×Ö½«Ìí¼Óµ½Ò»¸öÈ«¾ÖÐÔµÄchrdevsÊý×éÀïÈ¥£¬Õâ¸öÊý×éÊÇÓÉһЩdevice_struct½á¹¹×é³ÉµÄ£¬Êý ×éµÄϱê¾ÍÊÇÉ豸µÄÖ÷±àºÅ£¬Õâ¸öÊý×é±»×Ö·ûÉ豸Çл»±í¡£device_struct½á¹¹µÄ¶¨ÒåÈçÏÂËùʾ£º

struct device_struct{

const char *name; struct file_operations *fops; },

ÕâÑù£¬Í¨¹ý²é¿´chrdev[YOUR_MAJOR]->fops,Äں˾ÍÖªµÀÈçºÎÓëÉ豸½øÐн»Ì¸ÒÔ¼°É豸¶¼Ö§³ÖÄÇЩÈë¿Úµã£»

ÏÂÃæ¾Íдһ¸öÀý×Ó£º // forward declarations for _fops

static ssize_t schar_read(struct file *file, char *buf, size_t count, loff_t *offset);

static ssize_t schar_write(struct file *file, const *buf, size_t count, loff_t *offset);

static unsigned int schar_poll (struct file *file, poll_table *wait)

static int schar_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg);

static int schar_mmap(struct file *file, struct vm_area_area_struct *vma);

static int schar_open(struct inode *inode, struct file *file); static int schar_release(struct inode *inode, struct file *file);

static struct file_operations schar_fops = {

NULL, //llseek

schar_read, schar_write, NULL, //readdir schar_poll, schar_ioctl, NULL, //mmap schar_open, NULL, //flush schar_release, NULL, //fsync NULL, //fasync NULL, //lock }

Õâ¶Î¶¨Ò壬¿ÉÒÔ¸öÈË·ç¸ñ£¬·ÅÔÚÏàÓ¦µÄµØ·½¡£ ÏÂÃæ¶¨ÒåһЩ¼ò±ã·½Ê½£º #define DEBUG

#ifndef DEBUG

#define MSG(string, args...) printk(KERN_DEBUG \ #else

#define MSG(string, args) #endif //¶¨ÒåÖ÷É豸ºÅ

#define SCHAR_MAJOR 42

//³ÌÐòµÄ×¢²á¶¨ÒåÈë¿Úµã int init_module(void) { int res;

if(schar_name ==NULL) schar_name= \

//register device with kernel

res = register_chrdev(SCHAR_MAJOR, schar_name, &schar_fops);

if(res){

MSG(\ return res; } }

//Èô×¢²áûÓдíÎó£¬Äã¾Í»áÔÚ/proc/devicesµÄ×Ö·ûÉ豸ÀïÄÜ¿´µ½Õâ¸öÉ豸Ãû³ÆÁË

ÏÂÃæÉÔ΢½²Ò»Ï£¬Ä£¿éµÄʹÓüÆÊý

ÄÚºËÐèÒª¼Ç¼¼ÓÔØµ½ÏµÍ³ÀïµÄÿһ¸öÄ£¿éµÄʹÓÃÇé¿ö£¬Èç¹û²»ÊÇÕâÑùµÄ»°£¬ÕâͳÎÞ·¨ÖªµÀÊ²Ã´Ð¶ÔØÒ»¸öÄ£¿éÊǰ²È«µÄ£¬Èç¹ûÄãÕýÔÚÍùÓ²ÅÌÖÐдÊý¾Ý£¬Í»È»È¥µôÓ²Å̵ÄÇý¶¯³ÌÐòµÄ»°£¬Ê²Ã´ºó¹û»á·¢ÉúÄØ£¿ ÎÒÏëÄã»áÖªµÀËüµÄÀ÷º¦µÄ£¡£¡£¡

ÐÞ¸ÄÄ£¿éÐèÒªÓõ½Á½¸öºêÃüÁMOD_INC_USE_COUNTºÍMOD_DEC_USE_COUNT,Ò»¸ö¼ÓÒ»£¬Ò»¸öÊǼõÒ»£»Î¬»¤Ä£¿éʹÓà ¼ÆÊýÆ÷ÊÇÓɳÌÐòÔ±À´Íê³ÉµÄ£¬¼´Òª±£Ö¤Ä£¿é²»»á±»ÒâÍâ¼ÓÔØ£¬Ò²²»ÒªÈÃÄ£¿éÔÚʹÓùý³ÌÖб»Ð¶ÔØ£¬ ÓÃMOD_IN_USEºêÃüÁî¿ÉÒԾȳöÄ£¿éµ±Ç°µÄʹÓüÆÊý£¬ µ«ÕâҲûÓÐʲôÊDZØÒªµÄ£¬ÒòΪÄÚºËÔÚ³¢ÊÔÐ¶ÔØÒ»¸öÄ£¿éʱ£¬ÏµÍ³¶¼»á¶ÔÕâ¸öÊý×Ö½øÐмì²éµÄ¡£

£Ï£Ð£Å£ÎºÍ£Ò£Å£Ì£Å£Á£Ó£Å£ºÉ豸µÄ´ò¿ªÓë¹Ø±Õ

ÏÖÔÚÄ£¿éÒѾ­±»¼ÓÔØ£¬Ëü»áÔÚϵͳÉϵȵÈÓÐÈ˽ø³ÌÀ´´ò¿ªÓëÖ®¹ØÁªµÄÉ豸¡£µ±É豸±»Ò»¸ö½ø³Ì´ò¿ªµÄʱºò£¬schar_open¾Í»á±»µ÷Óá£Ä£¿éµÄʹÓüÆÊý¾ÍÊÇÔÚÕâÀïµÃµ½Ôö¼ÓµÄ£¬ÈçÏ´úÂ룺 static int schar_open(struct inode *inode, struct file *file) {

//increment usage count MOD_INC_USE_COUNT;

//ÕâÑù¿ÉÒÔ±£Ö¤Ä£¿é²»±»ÒâÍâÐ¶ÔØ£¬»á·µ»ØÒ»¸ö¡°£­£Å£Â£Õ£Ó£Ù¡±´íÎó¡£

//´«µÝ¸øschar_openµÄfile²ÎÊýÊÇÄں˶Էµ»Ø¸øÓ¦ÓóÌÐòµÄÎļþÃèÊö·ûµÄÒ»¸öÄÚ²¿ÃèÊö¡£file½á¹¹ÀïÓйØÉ豸´ò¿ªÄ£Ê½µÄÐÅÏ¢£¬ÈçÏÂÃæ´úÂ룬²âÊÔÊÇ·ñÒÔ¶Á·½Ê½´ò¿ª if(file->f_mode & FMODE_READ){ MSG(*open for reading\\n\ ...

file½á¹¹ÀﻹÓÐÒ»¸ö¶Á²Ù×÷·¢ÉúλÖÃµÈÆäËûÐÅÏ¢¡£ÏÂÃæ¸ø³öµÄÊǸýṹÓëÎÒÃÇÕâ¸öÄ£¿éÓйصÄÏî

struct file{ ....

mode_t f_mode; loff_t f_pos; unsigned int f_flags;