LinuxÇý¶¯Ö®ioctl
ÔÚÓû§¿Õ¼ä£¬Ê¹ÓÃioctlϵͳµ÷ÓÃÀ´¿ØÖÆÉ豸£¬ÔÐÍÈçÏ£º
int ioctl(int fd, unsigned long cmd, ...);
µÚÈý¸ö²ÎÊý²»±íʾһ¸ö±äÊýÄ¿µÄ²ÎÊý£¬¶øÊÇÒ»¸öÀàÐÍ¿ÉÑ¡µÄ²ÎÊý¡£µÚÈý¸ö²ÎÊýÒÀÀµÓÚ¿ØÖÆÃüÁһЩÃüÁî²»ÓòÎÊý£¬Ò»Ð©ÓÃÒ»¸öÕûÊýÖµ£¬Ò»Ð©Ê¹ÓÃÖ¸Õë
1¡¢ioctlº¯Êý¶¨ÒåÃüÁî
ÔÚ±àдioctl´úÂë֮ǰ£¬Ê×ÏÈÐèÒª¶¨ÒåÃüÁΪÁË·ÀÖ¹¶Ô´íÎóµÄÉ豸ʹÓÃÕýÈ·µÄÃüÁÃüÁîºÅÓ¦¸ÃÔÚϵͳ·¶Î§ÄÚÊÂΨһµÄ
ioctlÃüÁî±àÂë±»»®·ÖΪ¼¸¸ö¶Î£¬include/asm/ioctl.hÖж¨ÒåÁËÕâЩ×ֶΣºÀàÐÍ£¨»ÃÊý£©£¬»ùÊý£¬´«ËÍ·½Ïò£¬²ÎÊý´óСµÈ¡£Documentation/ioctl-number.txtÎļþÖÐÂÞÁÐÁËÔÙÄÚºËÖÐÒѾʹÓÃÁ˵ĻÃÊý¡£
¶¨ÒåioctlÃüÁîµÄÕýÈ··½·¨ÊÇʹÓÃ4¸öλ¶Î£¬Õâ¸öÁбíÖнéÉܵķûºÅ¶¨ÒåÔÚ<linux/ioctl.h>ÖУº
Type£º
»ÃÊý£¨ÀàÐÍ£©£º±íÃ÷ÄĸöÉ豸µÄÃüÁÔڲο¼ÁËioctl-number.txtÖ®ºóÑ¡³ö£¬8λ¿í¡£
Number£º
ÐòºÅ£¬±íÃ÷É豸ÃüÁîÖеĵڼ¸¸ö£¬8λ¿í
ÄÚºËÌṩÁËÏÂÁкêÀ´°ïÖú¶¨ÒåÃüÁîºÅ£¬ÈçÏÂ
_IO(type, nr)£ºÃ»ÓвÎÊýµÄÃüÁî
_IOR(type, nr, datatype)£º´ÓÇý¶¯ÖжÁÊý¾Ý
_IOW(type, nr, datatype)£ºÐ´Êý¾Ýµ½Çý¶¯
_IOWR(type, nr, datatype)£ºË«Ïò´«ËÍ£¬typeºÍnumber×÷Ϊ²ÎÊý±»´«µÝ
2¡¢ioctlº¯ÊýµÄʵÏÖ
·ÖÈý¸ö¼¼Êõ»·½Ú£º
1¡¢·µ»ØÖµ
ioctlº¯ÊýµÄʵÏÖͨ³£ÊǸù¾ÝÃüÁîÖ´ÐеÄÒ»¸öswitchÓï¾ä¡£µ«Êǵ±ÃüÁî²»ÄÜÆ¥ÅäÈκÎÒ»¸öÉ豸ËùÖ§³ÖµÄÃüÁîʱ£¬Í¨³£·µ»Ø-EINVAL£¨“·Ç·¨²ÎÊý”£©
2¡¢²ÎÊýʹÓÃ
Èç¹ûÊÇÒ»¸öÕûÊý£¬¿ÉÒÔÖ±½ÓʹÓá£Èç¹ûÊÇÖ¸Õ룬ÎÒÃDZØÐëÈ·±£Õâ¸öÓû§µØÖ·ÊÇÓÐЧµÄ£¬Òò´ËʹÓÃǰÐè½øÐÐÕýÈ·µÄ¼ì²é
ʹÓÃint access_ok(int type, const void *addr, unsigned long size)À´¼ì²éÒ»¸öÖ¸ÕëµØÖ·ÊÇ·ñ¿ÉÒÔ·ÃÎÊ
µÚÒ»¸ö²ÎÊýÊÇVERIFY_READ»òÕßÊÇVERIFY_WRITE£¬ÓÃÀ´±íÃ÷¶ÁÓû§Äڴ滹ÊÇдÓû§ÄÚ´æ¡£addr²ÎÊýʱҪ²Ù×÷µÄÓû§ÄÚ´æµØÖ·£¬sizeÊDzÙ×÷µÄ³¤¶È¡£Èç¹ûioctlÐèÒª´ÓÓû§¿Õ¼ä¶ÁÒ»¸öÕûÊý£¬ÄÇôsize = sizeof(int)¡£Èç¹ûÐèҪͬʱ¶ÁºÍд£¬ÔòʹÓÃVERIFY_WRITE¡£
access_ok·µ»ØÒ»¸ö²¼¶ûÖµ£º1Êdzɹ¦£¨´æÈ¡Ã»ÎÊÌ⣩ºÍ0ÊÇʧ°Ü£¨´æÈ¡ÓÐÎÊÌ⣩£¬Èç¹û¸Ãº¯Êý·µ»ØÊ§°Ü£¬ÔòioctlÓ¦µ±·µ»Ø-EFAULT£¬È磺
if(_IOC_DIR(cmd) & _IOC_READ)// Ϊʲô_IOC_READ¶ÔÓ¦VERIFY_WRITE£¿£¿£¿
err = !access_ok(VERIFY_WRITE, (void __user *)arg, _IOC_SIZE(cmd));
else if(_IOC_DIR(cmd) & _IOC_WRITE)
err = ! access_ok(VERI
Ïà¹ØÎĵµ£º
ÒÔ i2c-mpc.c Çý¶¯Ä£¿éΪÀý
fsl_i2c_init -> of_register_platform_driver -> of_register_driver -> driver_register -> bus_add_driver -> driver_attach
-> bus_for_each_dev -> __driver_attach -> driver_probe_device -> really_probe -> drv->probe(dev); ......
LinuxÄÚ´æ¹ÜÀí(ÉÏ)
ÕªÒª£º±¾ÕÂÊ×ÏÈÒÔÓ¦ÓóÌÐò¿ª·¢ÕߵĽǶÈÉóÊÓLinuxµÄ½ø³ÌÄÚ´æ¹ÜÀí£¬ÔÚ´Ë»ù´¡ÉÏÖð²½ÉîÈëµ½ÄÚºËÖÐÌÖÂÛϵͳÎïÀíÄÚ´æ¹ÜÀíºÍÄÚºËÄÚ´æµØÊ¹Ó÷½·¨¡£Á¦Çó´ÓÍâ×ÔÄÚ¡¢Ë®µ½Çþ³ÉµØÒýµ¼ÍøÓÑ·ÖÎöLinuxµØÄÚ´æ¹ÜÀíÓëʹÓá£ÔÚ±¾ÕÂ×îºóÎÒÃǸø³öÒ»¸öÄÚ´æÓ³ÉäµØÊµÀý£¬°ïÖúÍøÓÑÃÇÀí½âÄÚºËÄÚ´æ¹ÜÀíÓëÓû§ÄÚ´æ¹ÜÀíÖ®¼äµØ¹ØÏµ£¬Ï£Í ......
ÕªÒª:±¾Õ½«Ïò¶ÁÕßÒÀ´Î½âÊÍÖжϸÅÄ½âÎöLinuxÖеÄÖжÏʵÏÖ»úÀíÒÔ¼°LinuxÏÂÖжÏÈçºÎ±»Ê¹Óá£×÷ΪʵÀýÎÒÃǵÚÒ»½«Ïò¡¶i386Ìåϵ½á¹¹¡·Ò»ÕÂÖдòÔìµÄϵͳ¼ÓÈëÒ»¸öʱÖÓÖжϣ»µÚ¶þ½«Îª´ó¼Ò×¢½âRTCÖжϣ¬Ï£Íûͨ¹ýÕâÁ½¸öʵÀý¿ÉÒÔ°ïÖú¶ÁÕßÕÆÎÕÖжÏÏà¹ØµÄ¸ÅÄʵÏֺͱà³Ì·½·¨¡£
ÖжÏÊÇʲô
ÖжϵĺºÓï½âÊÍÊǰëÖм䷢Éú×è¸ô¡¢Í£¶Ù»ò ......
1¡¢Èí¼þ°²×°
Ð¶ÔØ£¬·Ö¼¸ÖÖÇé¿ö£º
A£º
RPM°ü£¬ÕâÖÖÈí¼þ°ü¾ÍÏñwindowsµÄEXE°²×°
ÎļþÒ»Ñù£¬¸÷ÖÖÎļþÒѾ±àÒëºÃ£¬²¢´òÁ˰ü£¬ÄĸöÎļþ¸Ã·Åµ½ÄĸöÎļþ¼Ð£¬¶¼Ö¸¶¨ºÃÁË£¬°²×°
·Ç³£·½±ã£¬ÔÚͼÐνçÃæÀïÄãÖ»ÐèҪ˫»÷¾ÍÄÜ×Ô¶¯°²×°
¡£
==ÈçºÎÐ¶ÔØ:
1¡¢´ò¿ªÒ»¸öSHELLÖÕ¶Ë
2¡¢ÒòΪLinux
ϵÄÈí¼þÃû¶¼°üÀ¨°æ±¾ºÅ£¬ËùÒÔÐ¶ÔØÇ°×îºÃ ......
Author-------Dansen-----xzd2734@163.com
wait_queue_head_t wait_q;
Ê×ÏÈ¿´¿´
wait_queue_head_tÕâ¸öµÈ´ý¶ÓÁеĽṹ
ÔÚwait.hÖж¨ÒåÁËÕâ¸ö½á¹¹
typedef struct
__wait_queue_head wait_queue_head_t;
struct __wait_queue_head {
wq_lock_t
lock;
struct list_head task_list;
};
# define wq_ ......