Ò׽ؽØÍ¼Èí¼þ¡¢µ¥Îļþ¡¢Ãâ°²×°¡¢´¿ÂÌÉ«¡¢½ö160KB
ÈÈÃűêÇ©£º c c# c++ asp asp.net linux php jsp java vb Python Ruby mysql sql access Sqlite sqlserver delphi javascript Oracle ajax wap mssql html css flash flex dreamweaver xml
 ×îÐÂÎÄÕ : linux

LinuxÉ豸Çý¶¯¿ª·¢Ïê½â ±Ê¼Ç4 LinuxÄÚºËÄ£¿é

modprobeÃüÁî±ÈinsmodÃüÁîÇ¿´ó£¬ËüÔÚ¼ÓÔØÄ³Ä£¿éʱ»áͬʱ¼ÓÔØ¸ÃÄ£¿éËùÒÀÀµµÄÆäËûÄ£¿é¡£Ê¹ÓÃmodprobeÃüÁî¼ÓÔØµÄÄ£¿éÈôÒÔ“modprobe –r filename”µÄ·½Ê½Ð¶Ôؽ«Í¬Ê±Ð¶ÔØÆäÒÀÀµµÄÄ£¿é¡£
printk´òÓ¡µ½var/log/messages
2.6ÄÚºËÖÐÒѼÓÔØµÄÐÅÏ¢Ò²´æÔÚÓÚ/sys/moduleĿ¼Ï£¬¼ÓÔØhello.koºó£¬ÄÚºËÖн«°üº¬/sys/module/helloĿ¼£¬¸ÃĿ¼ÓÖ°üº¬Ò»¸örefcntÎļþºÍÒ»¸ösectionsĿ¼
/proc/kallsymsÎļþ¶ÔÓ¦×ÅÄں˷ûºÅ±í£¬Ëü¼Ç¼ÁË·ûºÅÒÔ¼°·ûºÅËùÔÚµÄÄÚ´æµØÖ·
#include<linux/init.h>
#include<linux/module.h>
 
MODULE_LICENSE("Dual BSD/GPL");
 
int add_integar(int a, int b)
{
    return a+b;
}
 
int sub_integar(int a, int b)
{
    return a-b;
}
 
EXPORT_SYMBOL(add_integar);
EXPORT_SYMBOL(sub_integar);
 
±àÒëºó½«Ä£¿é²åÈ룬¿ÉÒÔ´Ó/pro/kallsymsÎļþÖÐÕÒ³öadd_integar¡¢sub_integarÏà¹ØÐÅÏ¢
cat /pro/kallsyms |grep integar
 
try_module_get()Óëmodule_put()µÄÒýÈëÓëʹÓÃÓëLinux2.6ÄÚºËϵÄÉ豸ģÐÍÃÜÇÐÏà¹Ø¡£2.6ÄÚºËΪ²»Í¬ÀàÐ͵ÄÉ豸¶¨ÒåÁËstruct ......

LinuxÉ豸Çý¶¯¿ª·¢Ïê½â ±Ê¼Ç5 LinuxÎļþÓëÉ豸ϵͳ

Ó¦ÓóÌÐòºÍVFSÖ®¼äµÄ½Ó¿ÚÊÇϵͳµ÷Ó㬶øVFSÓë´ÅÅÌÎļþϵͳÒÔ¼°ÆÕͨÉ豸֮¼äµÄ½Ó¿ÚÊÇfile_operations½á¹¹Ìå³ÉÔ±º¯Êý¡£ÓÉÓÚ×Ö·ûÉ豸µÄÉϲãûÓдÅÅÌÎļþϵͳ£¬ËùÒÔ×Ö·ûÉ豸µÄfile_operations³ÉÔ±º¯ÊýÖ±½ÓÓÉÉ豸Çý¶¯ÌṩÁË£¬file_operationsÕýÊÇ×Ö·ûÉ豸Çý¶¯µÄºËÐÄ£¬Èçͼ£º
 
¶ø¶Ô¿éÉ豸À´Ëµ£¬ext2¡¢fat¡¢jffs2µÈÎļþϵͳÖлáʵÏÖÕë¶ÔVFSµÄfile_operations³ÉÔ±º¯Êý£¬É豸Çý¶¯²ã½«¿´²»µ½file_operationsµÄ´æÔÚ¡£´ÅÅÌÎļþϵͳºÍÉ豸Çý¶¯»á½«¶Ô´ÅÅÌÉÏÎļþµÄ·ÃÎÊ×îÖÕת»»³É¶Ô´ÅÅÌÉÏÖùÃæºÍÉÈÇøµÄ·ÃÎÊ
ÔÚÉ豸Çý¶¯³ÌÐòµÄÉè¼ÆÖУ¬Ò»°ã¶øÑÔ£¬»á¹ØÐĽṹÌåfileºÍinodeÕâ¸öÁ½¸ö½á¹¹Ìå
Ò»¸öfile½á¹¹ÌåʵÀý¶ÔÓ¦Ò»¸ö´ò¿ªµÄÎļþ£¬file½á¹¹ÌåÖеÄf_mode£¨Îļþ¶Áдģʽ£©¡¢f_flags£¨±êÖ¾£©¶¼ÊÇÉ豸Çý¶¯¹ØÐĵ쬶øË½ÓÐÊý¾ÝÖ¸Õëprivate_dataÔÚÉ豸Çý¶¯Öб»¹ã·ºÓ¦Ó㬴ó¶àÖ¸ÏòÉ豸Çý¶¯×Ô¶¨ÒåÓÃÓÚÃèÊöÉ豸µÄ½á¹¹Ìå
inode°üº¬Îļþ·ÃÎÊȨÏÞ¡¢ÊôÖ÷¡¢×é¡¢´óС¡¢Éú³Éʱ¼ä¡¢·ÃÎÊʱ¼ä¡¢×îºóÐÞ¸Äʱ¼äµÈÐÅÏ¢¡£ÊÇLinux¹ÜÀíÎļþϵͳµÄ×î»ù±¾µ¥Î»£¬Ò²ÊÇÎļþϵͳÁ¬½ÓÈκÎ×ÓĿ¼¡¢ÎļþµÄÇÅÁº¡£
ÆäÖеÄi_rdev×ֶεĸß12λΪÊÇÖ÷É豸ºÅ£¬ºó20λΪ´ÎÉ豸ºÅ
Devfs£¨É豸Îļþϵͳ£©Óŵ㣺
1¡¢¿ÉÒÔͨ¹ý³ÌÐòÔÚÉè ......

LinuxÉ豸Çý¶¯¿ª·¢Ïê½â ±Ê¼Ç6 ×Ö·ûÉ豸Çý¶¯

ʹÓÃÏÂÁкé¿ÉÒÔͨ¹ýÖ÷É豸ºÅºÍ´ÎÉ豸ºÅÉú³Édev_t
MKDEV(int major, int mainor)
Èç¹û¸´ÖƵÄÄÚ´æÊǼòµ¥ÀàÐÍ£¬Èçchar¡¢int¡¢longµÈ£¬Ôò¿ÉÒÔʹÓüòµ¥µÄput_user()ºÍget_user()
Linuxϵͳ½¨ÒéÒÔÈçͼ·½Ê½¶¨ÒåioctlÃüÁîÂë
 
ÃüÁËÂëµÄÉ豸ÀàÐÍ×Ö¶ÎΪһ¸ö“»ÃÊý”£¬¿ÉÒÔÊÇ0-0xffÖ®¼äµÄÖµ£¬ÄÚºËÖеÄioctl-number.txt¸ø³öÁËÒ»Ð©ÍÆ¼öµÄºÍÒѾ­Ê¹ÓÃÁ˵ē»ÃÊý”£¬ÐÂÉ豸Çý¶¯¶¨Òå“»ÃÊý”µÄʱºòÒª±ÜÃâÓëÆä·¢Éú³åÍ»¡£
ÃüÁîÂëµÄ·½Ïò×Ö¶ÎΪ2룬¸Ã×ֶαíʾÊý¾Ý´«Ë͵ķ½Ïò£¬¿ÉÄܵÄÖµÊÇ_IOC_NONE£¨ÎÞÊý¾Ý´«Ê䣩¡¢_IOC_READ£¨¶Á£©¡¢_IOC_WRITE£¨Ð´£©ºÍ_IOC_READ|_IOC_WRITE£¨Ë«Ïò£©¡£Êý¾Ý´«Ë͵ķ½ÏòÊÇ´ÓÓ¦ÓóÌÐòµÄ½Ç¶ÈÀ´¿´µÄ
ÃüÁîÂëµÄÊý¾Ý³¤¶È×ֶαíÊ¾Éæ¼°µÄÓû§Êý¾ÝµÄ´óС£¬Õâ¸ö³ÉÔ±µÄ³¤¶Èͨ³£ÒÀÀµÓÚÌåϵ½á¹¹£¬Í¨³£ÊÇ13λ»òÕß14λ
Äں˻¹¶¨ÒåÁË_IO()¡¢_IOR()¡¢_IOW()ºÍ_IOWR()ÕâËĸöºêÀ´¸¨ÖúÉú³ÉÃüÁî
ÄÚºËÖÐÔ¤¶¨ÒåÁËһЩio¿ØÖÆÃüÁÈç¹ûijÉ豸Çý¶¯Öаüº¬ÁËÓëÔ¤¶¨ÒåÃüÁîÒ»ÑùµÄÃüÁÕâЩÃüÁî»á±»µ±×öÔ¤¶¨ÒåÃüÁî±»Äں˴¦Àí¶ø²»ÊDZ»É豸Çý¶¯´¦Àí£¬Ô¤¶¨ÒåÃüÁîÓÐÈçÏÂ4ÖÖ£º
FIOCLEX FIONCLEX FIOQSIZE FIONBIO p142
dev = container_of(inode->i_cde ......

LinuxÉ豸Çý¶¯¿ª·¢Ïê½â ±Ê¼Ç7 ²¢·¢¿ØÖÆ


ÖÐ¶ÏÆÁ±ÎµÄʹÓ÷½·¨£º
local_irq_disable() //¹ØÖжÏ
local_irq_enable() //¿ªÖжÏ
ÕâÁ½¸öº¯Êý¶¼Ö»ÄܽûÖ¹ºÍʹÄܱ¾cpuÄÚµÄÖжϣ¬Òò´Ë£¬²¢²»Äܽâ¾öSMP¶àcpuÒý·¢µÄ¾ºÌ¬¡£Òò´Ë£¬µ¥¶ÀʹÓÃÖÐ¶ÏÆÁ±Îͨ³£²»ÊÇÒ»ÖÖÖµµÃÍÆ¼öµÄ±ÜÃ⾺̬µÄ·½·¨£¬ËüÊÊÒËÓë×ÔÐýËøÁªºÏʹÓÃ
ÁíÍ⣬local_irq_save(flags)³ýÁ˽øÐнûÖ¹ÖжϲÙ×÷ÒÔÍ⣬»¹±£´æÄ¿Ç°cpuµÄÖжÏλÐÅÏ¢£¬local_irq_restore(flags)Ïà·´
Èç¹ûÖ»Ïë½ûÖ¹Öжϵĵװ벿£¬Ó¦¸ÃʹÓÃlocal_bh_disable()£¬Ïà·´local_bh_enable()
ÕûÐÍÔ­×Ó²Ù×÷
1¡¢ÉèÖÃÔ­×Ó±äÁ¿µÄÖµ
void atomic_set(atomic_t *v, int i); //ÉèÖÃÔ­×Ó±äÁ¿µÄֵΪi
atomic_t v = ATOMIC_INIT(0); //¶¨ÒåÔ­×Ó±äÁ¿v²¢³õʼ»¯Îª0
……
×ÔÐýËø£ºÎªÁË»ñµÃÒ»¸ö×ÔÐýËø£¬ÔÚijcpuÉÏÔËÐеĴúÂëÊ×ÏÈÐèÒªÖ´ÐÐÒ»¸öÔ­×Ó²Ù×÷£¬¸Ã²Ù×÷²âÊÔ²¢ÉèÖã¨test-and-set£©Ä³¸öÄÚ´æ±äÁ¿£¬ÓÉÓÚËüÊÇÔ­×Ó²Ù×÷£¬ËùÒÔÔڸòÙ×÷Íê³É֮ǰÆäËûÖ´Ðе¥Ôª²»¿ÉÄÜ·ÃÎÊÕâ¸öÄÚ´æ±äÁ¿¡£Èç¹û²âÊÔ½á¹û±íÃ÷ÒѾ­¿ÕÏУ¬Ôò³ÌÐò»ñµÃÕâ¸ö×ÔÐýËø²¢¼ÌÐøÖ´ÐУ»Èç¹û±»Õ¼Ó㬳ÌÐò½«ÔÚÒ»¸öСµÄÑ­»·ÄÚÖØ¸´Õâ¸ö“test-and-set”²Ù×÷£¬¼´½øÐÐËùνµÄ“×ÔÐý”¡£Ò»°ãÕâÑùʹÓÃ×ÔÐýËø£º
spinlock_t lock; //¶ ......

LinuxÏÂselectºÍpollµÄÓ÷¨

select()º¯ÊýµÄ×÷ÓÃ
    ϵͳµ÷ÓÃselectºÍpollµÄºó¶ËʵÏÖ£¬ÓÃÕâÁ½¸öϵͳµ÷ÓÃÀ´²éѯÉ豸ÊÇ·ñ¿É¶Áд£¬»òÊÇ·ñ´¦ÓÚijÖÖ״̬¡£Èç¹ûpollΪ¿Õ£¬ÔòÇý¶¯É豸»á±»ÈÏΪ¼´¿É¶ÁÓÖ¿Éд£¬·µ»ØÖµÊÇÒ»¸ö״̬ÑÚÂë
ÈçºÎʹÓÃselect()º¯Êý?
    select()º¯ÊýµÄ½Ó¿ÚÖ÷ÒªÊǽ¨Á¢ÔÚÒ»ÖÖ½Ð'fd_set'ÀàÐ͵Ļù´¡ÉÏ¡£Ëü('fd_set') ÊÇÒ»×éÎļþÃèÊö·û(fd)µÄ¼¯ºÏ¡£ÓÉÓÚfd_setÀàÐ͵ij¤¶ÈÔÚ²»Í¬Æ½Ì¨Éϲ»Í¬£¬Òò´ËÓ¦¸ÃÓÃÒ»×é±ê×¼µÄºê¶¨ÒåÀ´´¦Àí´ËÀà±äÁ¿£º
    fd_set set;
    FD_ZERO(&set);      
    FD_SET(fd, &set);   
    FD_CLR(fd, &set);   
    FD_ISSET(fd, &set); 
     
ÔÚ¹ýÈ¥£¬Ò»¸öfd_setͨ³£Ö»Äܰüº¬ÉÙÓÚµÈÓÚ32¸öÎļþÃèÊö·û£¬ÒòΪfd_setÆäʵֻÓÃÁËÒ»¸öintµÄ±ÈÌØÊ¸Á¿À´ÊµÏÖ£¬ÔÚ´ó¶àÊýÇé¿öÏ£¬¼ì²é fd_setÄܰüÀ¨ÈÎÒâÖµµÄÎļþÃèÊö·ûÊÇϵͳµÄÔðÈΣ¬µ«È·¶¨ÄãµÄfd_setµ½µ×ÄܷŶàÉÙÓÐʱÄãÓ¦¸Ã¼ì²é/Ð޸ĺêFD_SETSIZEµÄÖµ¡£*Õâ¸öÖµÊÇϵͳÏà¹ØµÄ*£¬Í¬Ê±¼ì²éÄãµÄϵͳÖе ......

LinuxÉ豸Çý¶¯¿ª·¢Ïê½â ±Ê¼Ç9 Ò첽֪ͨÓëÒì²½I/O


Ò첽֪ͨ£ºÒ»µ©É豸¾ÍÐ÷£¬ÔòÖ÷¶¯Í¨ÖªÓ¦ÓóÌÐò£¬ÕâÑùÓ¦ÓóÌÐò¸ù±¾²»ÐèÒª²éѯÉ豸״̬£¬ÕâÒ»µã·Ç³£ÀàËÆÓÚÓ²¼þÉϵēÖжϔµÄ¸ÅÄ±È½Ï׼ȷµÄ³ÆÎ½ÊÇ“ÐźÅÇý¶¯µÄÒì²½I/O
 
//Æô¶¯ÐźÅÇý¶¯»úÖÆ
signal(SIGIO, input_handler);//ÈÃinput_handler()´¦ÀíSIGIOÐźÅ
fcntl(fd, F_SETOWN, getpid());//ÉèÖñ¾½ø³ÌΪSTDIN_FILENOÎļþµÄÓµÓÐÕߣ¬ÈÃÄÚºËÖªµÀ½«Ðźŷ¢¸ø±¾½ø³Ì
oflags = fcntl(fd, F_GETFL);//ÏÂÃæÁ½¾ä£ºÉèÖÃFASYNC±êÖ¾£¬Æô¶¯Ò첽֪ͨ±êÖ¾
fcntl(fd, F_SETFL, oflags | FASYNC); 
É豸Çý¶¯ÖÐÒ첽֪ͨ±à³Ì±È½Ï¼òµ¥£¬Ö÷ÒªÓõ½Ò»ÏîÊý¾Ý½á¹¹ºÍÁ½¸öº¯Êý
Êý¾Ý½á¹¹£º
struct xxx_dev
{
Struct cdev cdev;
……
Struct fasync_struct *async_queue;
}
 
 
Int fasync_helper(int fd, struct file *filp, int mode, struct fasync_struct **fa);
 
Void kill_fasync(struct fasync_struct **fa, int sig, int band);
 
static int globalfifo_fasync(int fd, struct file *filp, int mode)
{
    struct globalfifo_dev *dev = filp->private_data;
    retur ......
×ܼǼÊý:5772; ×ÜÒ³Êý:962; ÿҳ6 Ìõ; Ê×Ò³ ÉÏÒ»Ò³ [128] [129] [130] [131] 132 [133] [134] [135] [136] [137]  ÏÂÒ»Ò³ βҳ
© 2009 ej38.com All Rights Reserved. ¹ØÓÚE½¡ÍøÁªÏµÎÒÃÇ | Õ¾µãµØÍ¼ | ¸ÓICP±¸09004571ºÅ