linux Íø¿¨Çý¶¯
Tg3 Gbit NIC Driver Analysis
Ôڴ˽ö½öÌÖÂÛÍøÂçÉ豸Çý¶¯µÄÒ»°ãд·¨£¬ÓйØÓ²¼þ²¿·ÖµÄÏà¹Ø´úÂëÓÉÓÚÓ²¼þ¹æ¸ñ²»Í¬£¬ÓèÒÔÊ¡ÂÔ¡£ÓÐʲôµØ·½´íÎ󣬻ò²¹³ä£¬»¶Ó´ó¼ÒÌá³ö¡£
1, Çý¶¯Ä£¿éµÄ¼ÓÔØºÍÐ¶ÔØ
Èç¹ûÍøÂçÉ豸£¨°üÀ¨wireless£©ÊÇPCI¹æ·¶µÄ£¬ÔòÏÈÊÇÏòÄÚºË×¢²á¸ÃPCIÉ豸(pci_register_driver)£¬È»ºóÓÉpci_driverÊý¾Ý½á¹¹ÖеÄprobeº¯ÊýÖ¸ÕëËùÖ¸ÏòµÄÕì²âº¯ÊýÀ´³õʼ»¯¸ÃPCIÉ豸£¬²¢ÇÒͬʱע²áºÍ³õʼ»¯¸ÃÍøÂçÉ豸¡£
Èç¹ûÍøÂçÉ豸£¨°üÀ¨wireless£©ÊÇPCMCIA¹æ·¶µÄ£¬ÔòÏÈÊÇÏòÄÚºË×¢²á¸ÃPCMCIAÉ豸(register_pccard_driver)£¬È»ºódriver_info_tÊý¾Ý½á¹¹ÖеÄattachº¯ÊýÖ¸ÕëËùÖ¸ÏòµÄÕì²âº¯ÊýÀ´³õʼ»¯¸ÃPCMCIAÉ豸£¬²¢ÇÒͬʱע²áºÍ³õʼ»¯¸ÃÍøÂçÉ豸¡£
static int __init tg3_init(void)
{
//ÏÈ×¢²á³ÉPCIÉ豸£¬²¢³õʼ»¯£¬Èç¹ûÊÇÆäËûµÄESIA£¬PCMCIA£¬ÓÃÆäËûº¯Êý
return pci_module_init(&tg3_driver);
}
static void __exit tg3_cleanup(void)
{
pci_unregister_driver(&tg3_driver);//×¢ÏúPCIÉ豸
}
module_init(tg3_init); //Çý¶¯Ä£¿éµÄ¼ÓÔØ
module_exit(tg3_cleanup); //Çý¶¯Ä£¿éµÄÐ¶ÔØ
ÉêÃ÷ΪPCIÉ豸£º
static struct pci_driver tg3_driver = {
.name = DRV_MODULE_NAME,
.id_table = tg3_pci_tbl, //´ËÇý¶¯ËùÖ§³ÖµÄÍø¿¨ÏµÁУ¬vendor_id, device_id
.probe = tg3_init_one, //³õʼ»¯ÍøÂçÉ豸µÄ»Øµ÷º¯Êý
.remove = __devexit_p(tg3_remove_one), //×¢ÏúÍøÂçÉ豸µÄ»Øµ÷º¯Êý
.suspend = tg3_suspend, //É豸¹ÒÆðº¯Êý
.resume = tg3_resume //É豸»Ö¸´º¯Êý
};
2£¬PCIÉ豸̽²âº¯Êýprobe£¬³õʼ»¯ÍøÂçÉ豸
static int __devinit tg3_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
{
//³õʼ»¯É豸£¬Ê¹I/O£¬memory¿ÉÓ㬻½ÐÑÉ豸
pci_enable_device(pdev);
//ÉêÇëÄÚ´æ¿Õ¼ä£¬ÅäÖÃÍø¿¨µÄI/O£¬memory×ÊÔ´
pci_request_regions(pdev, DRV_MODULE_NAME);
pci_set_master(pdev);
//ÉèÖÃDMAÊôÐÔ
pci_set_dma_mask(pdev, (u64) 0xffffffffffffffff);
//Íø¿¨ I/O,memory×ÊÔ´µÄÆôʼµØÖ·
tg3reg_base = pci_resource_start(pdev, 0);
//Íø¿¨I/O,memory×ÊÔ´µÄ´óС
tg3reg_len = pci_resource_len(pdev, 0);
//·ÖÅä²¢ÉèÖÃÍøÂçÉ豸
dev = alloc_etherdev(sizeof(*tp));
//ÉêÃ÷ΪÄÚºËÉ豸ģ¿é
SET_MODULE_OWNER(dev);
//³õʼ»¯Ë½ÓнṹÖеĸ÷³ÉÔ±Öµ
tp = dev->priv
Ïà¹ØÎĵµ£º
linuxµÄѹËõ/½âѹËõÃüÁî(tar,gzipµÈ)¼°Ê¾Àý
2008-08-18 15:43
tarÃüÁî
[root@linux ~]# tar [-cxtzjvfpPN] ÎļþÓëĿ¼ ....
²ÎÊý£º
-c £º½¨Á¢Ò»¸öѹËõÎļþµÄ²ÎÊýÖ¸Áî(create µÄÒâ˼)£»
-x £º½â¿ªÒ»¸öѹËõÎļþµÄ²ÎÊýÖ¸Á
-t £º²é¿´ tarfile ÀïÃæµÄÎļþ£¡
ÌØ±ð×¢Ò⣬ÔÚ²ÎÊýµÄÏ´ïÖУ¬ c/x/t ½öÄÜ´æÔÚÒ»¸ö£¡²»¿ÉÍ¬Ê ......
linuxµÄÈȲå°ÎÊÇGreg Kroah-Hartmanά»¤£¬ËùÒÔÕâÊÇÆª¾µäÎÄÕ¡£Èç¹ûÄãÓÐUSB»òÕßPCIÉ豸Çý¶¯¿ª·¢»ù´¡£¬Ò»¶Á¾Í¿ÉÒÔÀí½â¡£
Hot-pluggable devices have been created to solve a number of user needs. On laptop computers, PCMCIA devices were designed to allow the user to swap cards while the computer was sti ......
PCI: bus0: Fast back to back transfers disabled
PCI: Configured XX as a PCI slave with 128MB PCI memory
PCI: Each Region size is 16384KB
PCI: Reserved memory from 0x10080000 to 0x15080000 for DMA and mapped to 0x12000000
¡¡¡¡É豸µÄ³õʼ»¯ init()--->do_basic_init()--->pci_init()£¬³õÊ ......
SambaÊÇÒ»¸öÍøÂç·þÎñÆ÷£¬ÓÃÓÚLinuxºÍWindows¹²ÏíÎļþÖ®Óã»Samba ¼´¿ÉÒÔÓÃÓÚWindowsºÍLinuxÖ®¼äµÄ¹²ÏíÎļþ£¬Ò²Ò»ÑùÓÃÓÚLinuxºÍLinuxÖ®¼äµÄ¹²ÏíÎļþ£»²»¹ý¶ÔÓÚLinuxºÍLinuxÖ®¼ä¹²ÏíÎļþÓиüºÃµÄÍøÂçÎļþϵͳNFS£¨NFSÒ²ÊÇÐèÒª¼ÜÉè·þÎñÆ÷µÄ£©¡£Samba¿ÉÒÔ¶¨Î»ÎªÒ»Ì×¹¦Äܼ«ÎªÇ¿´óµÄÎļþ·þÎñÆ÷Èí¼þ£¬ËùÎ ......
Á´±íµÄɾ³ý
83/*
84 * Delete a list entry by making the prev/next entries
85 * point to each other.
86 *
87 * This is only for internal list manipulation where we know
88 * the prev/next entries already!
89 */
90static inline void __list_del(struct list_head * prev, struct list_head * next)
......