ºìÁªLinuxÃÅ»§
Linux°ïÖú

Ò»ÖÖ¸ßЧÂʵÄÊý¾ÝÐÅÏ¢´«Êä¼¼ÊõRelay

·¢²¼Ê±¼ä:2007-03-09 00:24:10À´Ô´:ºìÁª×÷Õß:Fanatical
¡¡¡¡RelayÒª½â¾öµÄÎÊÌâ

¡¡¡¡¶ÔÓÚÈκÎÔÚÄں˹¤×÷µÄ³ÌÐò¶øÑÔ£¬ÈçºÎ°Ñ´óÁ¿µÄµ÷ÊÔÐÅÏ¢´ÓÄں˿ռ䴫Êäµ½Óû§¿Õ¼ä¶¼ÊÇÒ»¸ö´óÂé·³£¬¶ÔÓÚÔËÐÐÖеÄÄں˸üÊÇÈç´Ë¡£ÌرðÊǶÔÓÚÄÄЩÓÃÓÚµ÷ÊÔÄÚºËÐÔÄܵŤ¾ß£¬¸üÊÇÈç´Ë¡£

¡¡¡¡¶ÔÓÚÕâÖÖ´óÁ¿Êý¾ÝÐèÒªÔÚÄÚºËÖлº´æ²¢´«Êäµ½Óû§¿Õ¼äÐèÇ󣬺ܶഫͳµÄ·½·¨¶¼Òѵ½´ïÁ˼«ÏÞ£¬ÀýÈçÄں˳ÌÐòÔ±ºÜÊìϤµÄ printk() µ÷ÓᣴËÍ⣬Èç¹û²»Í¬µÄÄÚºË×Óϵͳ¶¼¿ª·¢×Ô¼ºµÄ»º´æºÍ´«Êä´úÂ룬Ôì³ÉºÜ´óµÄ´úÂëÈßÓ࣬¶øÇÒÒ²´øÀ´Î¬»¤ÉϵÄÀ§ÄÑ¡£

¡¡¡¡ÕâЩ£¬¶¼ÒªÇ󿪷¢Ò»Ì×Äܹ»¸ßЧ¿É¿¿µØ½«Êý¾Ý´ÓÄں˿ռäת·¢µ½Óû§¿Õ¼äµÄϵͳ£¬¶øÇÒÕâ¸öϵͳӦ¸Ã¶ÀÁ¢ÓÚ¸÷¸öµ÷ÊÔ×Óϵͳ¡£

¡¡¡¡ÕâÑù¾Íµ®ÉúÁË RelayFS¡£

¡¡¡¡RelayµÄ·¢Õ¹ÀúÊ·

¡¡¡¡Relay µÄǰÉíÊÇ RelayFS£¬¼´×÷Ϊ Linux µÄÒ»¸öÐÂÐÍÎļþϵͳ¡£2003Äê3Ô£¬RelayFSµÄµÚÒ»¸ö°æ±¾µÄ´úÂë±»¿ª·¢³öÀ´£¬ÔÚ7ÔÂ14ÈÕ£¬µÚÒ»¸öÕë¶Ô2.6Äں˵İ汾Ҳ¿ªÊ¼ÌṩÏÂÔØ¡£¾­¹ý¹ã·ºµÄÊÔÓú͸Ľø£¬Ö±µ½2005Äê9Ô£¬RelayFS²Å±»¼ÓÈëmainlineÄÚºË(2.6.14)¡£Í¬Ê±£¬RelayFSÒ²±»ÒÆÖ²µ½2.4ÄÚºËÖС£ÔÚ 2006Äê2Ô£¬´Ó2.6.17¿ªÊ¼£¬RelayFS²»ÔÙ×÷Ϊµ¥¶ÀµÄÎļþϵͳ´æÔÚ£¬¶øÊdzÉΪÄں˵ÄÒ»²¿·Ö¡£ËüµÄÔ´ÂëÒ²´Ófs/Ŀ¼ÏÂ×ªÒÆµ½ kernel/relay.cÖУ¬Ãû³ÆÖÐÒ²´ÓRelayFS¸Ä³ÉÁËRelay¡£

¡¡¡¡RelayFSĿǰÒѾ­±»Ô½À´Ô½¶àµÄÄں˹¤¾ßʹÓ㬰üÀ¨Äں˵÷ÊÔ¹¤¾ßSystemTap¡¢LTT£¬ÒÔ¼°Ò»Ð©ÌØÊâµÄÎļþϵͳÀýÈçDebugFS¡£

¡¡¡¡RelayµÄ»ù±¾Ô­Àí

¡¡¡¡×ܵÄ˵À´£¬RelayÌṩÁËÒ»ÖÖ»úÖÆ£¬Ê¹µÃÄں˿ռäµÄ³ÌÐòÄܹ»Í¨¹ýÓû§¶¨ÒåµÄrelayͨµÀ(channel)½«´óÁ¿Êý¾Ý¸ßЧµÄ´«Êäµ½Óû§¿Õ¼ä¡£

¡¡¡¡Ò»¸örelayͨµÀÓÉÒ»×éºÍCPUÒ»Ò»¶ÔÓ¦µÄÄں˻º³åÇø×é³É¡£ÕâЩ»º³åÇøÓÖ±»³ÆÎªrelay»º³åÇø(buffer)£¬ÆäÖеÄÿһ¸öÔÚÓû§¿Õ¼ä¶¼ÓÃÒ»¸ö³£¹æÎļþÀ´±íʾ£¬Õâ±»½Ð×örelayÎļþ(file)¡£Äں˿ռäµÄÓû§¿ÉÒÔÀûÓÃrelayÌṩµÄAPI½Ó¿ÚÀ´Ð´ÈëÊý¾Ý£¬ÕâЩÊý¾Ý»á±»×Ô¶¯µÄдÈ뵱ǰµÄ CPU id¶ÔÓ¦µÄÄǸörelay»º³åÇø£»Í¬Ê±£¬ÕâЩ»º³åÇø´ÓÓû§¿Õ¼ä¿´À´£¬ÊÇÒ»×éÆÕͨÎļþ£¬¿ÉÒÔÖ±½ÓʹÓÃread()½øÐжÁÈ¡£¬Ò²¿ÉÒÔʹÓÃmmap()½øÐÐÓ³Éä¡£Relay²¢²»¹ØÐÄÊý¾ÝµÄ¸ñʽºÍÄÚÈÝ£¬ÕâЩÍêÈ«ÒÀÀµÓÚʹÓÃrelayµÄÓû§³ÌÐò¡£RelayµÄÄ¿µÄÊÇÌṩһ¸ö×ã¹»¼òµ¥µÄ½Ó¿Ú£¬´Ó¶øÊ¹µÃ»ù±¾²Ù×÷¾¡¿ÉÄܵĸßЧ¡£

¡¡¡¡Relay½«Êý¾ÝµÄ¶ÁºÍд·ÖÀ룬ʹµÃÍ»·¢ÐÔ´óÁ¿Êý¾ÝдÈëµÄʱºò£¬²»ÐèÒªÊÜÏÞÓÚÓû§¿Õ¼äÏà¶Ô½ÏÂýµÄ¶ÁÈ¡ËÙ¶È£¬´Ó¶ø´ó´óÌá¸ßÁËЧÂÊ¡£Relay×÷ΪдÈëºÍ¶ÁÈ¡µÄÇÅÁº£¬Ò²¾ÍÊǽ«ÄÚºËÓû§Ð´ÈëµÄÊý¾Ý»º´æ²¢×ª·¢¸øÓû§¿Õ¼äµÄ³ÌÐò¡£ÕâÖÖת·¢»úÖÆÒ²ÕýÊÇRelayÕâ¸öÃû³ÆµÄÓÉÀ´¡£

¡¡¡¡RelayµÄ»ù±¾½á¹¹ºÍµäÐͲÙ×÷

¡¡¡¡¿ÉÒÔ¿´µ½£¬ÕâÀïµÄrelayͨµÀÓÉËĸörelay»º³åÇø(kbuf0µ½kbuf3)×é³É£¬·Ö±ð¶ÔÓ¦ÓÚϵͳÖеÄcpu0µ½cpu1¡£Ã¿¸öCPUÉϵĴúÂëµ÷ÓÃrelay_write()µÄʱºò½«Êý¾ÝдÈë×Ô¼º¶ÔÓ¦µÄrelay»º³åÇøÄÚ¡£Ã¿¸örelay»º³åÇø³ÆÒ»¸örelayÎļþ£¬¼´/cpu0µ½ /cpu3¡£µ±Îļþϵͳ±»mountµ½/mnt/ÒÔºó£¬Õâ¸örelayÎļþ¾Í±»Ó³Éä³ÉÓ³Éäµ½Óû§¿Õ¼äµÄµØÖ·¿Õ¼ä¡£Ò»µ©Êý¾Ý¿ÉÓã¬Óû§³ÌÐò¾Í¿ÉÒÔ°ÑËüµÄÊý¾Ý¶Á³öÀ´Ð´Èëµ½Ó²ÅÌÉϵÄÎļþÖУ¬¼´cpu0.outµ½cpu3.out¡£

¡¡¡¡RelayµÄÖ÷ÒªAPI

¡¡¡¡Ç°ÃæÌáµ½µÄ relay_write() ¾ÍÊÇ relay API Ö®Ò»¡£³ý´ËÒÔÍ⣬Relay »¹ÌṩÁ˸ü¶àµÄ APIÀ´Ö§³ÖÓû§³ÌÐòÍêÕûµÄʹÓà relay¡£ÕâЩ API£¬Ö÷Òª°´ÕÕÃæÏòÓû§¿Õ¼äºÍÃæÏòÄں˿ռä·ÖΪÁ½´óÀ࣬ÏÂÃæÎÒÃÇÀ´·Ö±ð½øÐнéÉÜ¡£

¡¡¡¡ÃæÏòÓû§¿Õ¼äµÄ API

¡¡¡¡ÕâЩ Relay ±à³Ì½Ó¿ÚÏòÓû§¿Õ¼ä³ÌÐòÌṩÁË·ÃÎÊ relay ͨµÀ»º³åÇøÊý¾ÝµÄ»ù±¾²Ù×÷µÄÈë¿Ú£¬°üÀ¨£º

¡¡¡¡open() - ÔÊÐíÓû§´ò¿ªÒ»¸öÒѾ­´æÔÚµÄͨµÀ»º³åÇø

¡¡¡¡mmap() - ʹͨµÀ»º³åÇø±»Ó³É䵽λÓÚÓû§¿Õ¼äµÄµ÷ÓÃÕߵĵØÖ·¿Õ¼ä¡£ÒªÌرð×¢ÒâµÄÊÇ£¬ÎÒÃDz»Äܽö¶Ô¾Ö²¿ÇøÓò½øÐÐÓ³Éä¡£Ò²¾ÍÊÇ˵£¬±ØÐëÓ³ÉäÕû¸ö»º³åÇøÎļþ£¬Æä´óСÊÇ CPUµÄ¸öÊýºÍµ¥¸ö CPU »º³åÇø´óСµÄ³Ë»ý

¡¡¡¡read() - ¶ÁȡͨµÀ»º³åÇøµÄÄÚÈÝ¡£ÕâЩÊý¾ÝÒ»µ©±»¶Á³ö£¬¾ÍÒâζ×ÅËûÃDZ»Óû§¿Õ¼äµÄ³ÌÐòÏû·ÑµôÁË£¬Ò²¾Í²»Äܱ»Ö®ºóµÄ¶Á²Ù×÷¿´µ½

¡¡¡¡sendfile() - ½«Êý¾Ý´ÓͨµÀ»º³åÇø´«Êäµ½Ò»¸öÊä³öÎļþÃèÊö·û¡£ÆäÖпÉÄܵÄÌî³ä×Ö·û»á±»×Ô¶¯È¥µô£¬²»»á±»Óû§¿´µ½

¡¡¡¡poll() - Ö§³Ö POLLIN/POLLRDNORM/POLLERR Ðźš£Ã¿´Î×Ó»º³åÇøµÄ±ß½ç±»Ô½¹ýʱ£¬µÈ´ý×ŵÄÓû§¿Õ¼ä³ÌÐò»áµÃµ½Í¨Öª

¡¡¡¡close() - ½«Í¨µÀ»º³åÇøµÄÒýÓÃÊý¼õ1¡£µ±ÒýÓÃÊý¼õΪ0ʱ£¬±íÃ÷ûÓнø³Ì»òÕßÄÚºËÓû§ÐèÒª´ò¿ªËü£¬´Ó¶øÕâ¸öͨµÀ»º³åÇø±»ÊÍ·Å¡£
ÎÄÕÂÆÀÂÛ

¹²ÓÐ 1 ÌõÆÀÂÛ

  1. Fanatical ÓÚ 2007-03-09 00:24:56·¢±í:

    ¡¡¡¡ÃæÏòÄں˿ռäµÄ API

    ¡¡¡¡ÕâЩAPI½Ó¿ÚÏòλÓÚÄں˿ռäµÄÓû§ÌṩÁ˹ÜÀírelayͨµÀ¡¢Êý¾ÝдÈëµÈ¹¦ÄÜ¡£ÏÂÃæ½éÉÜÆäÖÐÖ÷ÒªµÄ²¿·Ö£¬ÍêÕûµÄAPI½Ó¿ÚÁбíÇë²Î¼ûÕâÀï¡£

    ¡¡¡¡relay_open() - ´´½¨Ò»¸örelayͨµÀ£¬°üÀ¨´´½¨Ã¿¸öCPU¶ÔÓ¦µÄrelay»º³åÇø¡£

    ¡¡¡¡relay_close() - ¹Ø±ÕÒ»¸örelayͨµÀ£¬°üÀ¨ÊÍ·ÅËùÓеÄrelay»º³åÇø£¬ÔÚ´Ë֮ǰ»áµ÷ÓÃrelay_switch()À´´¦ÀíÕâЩrelay»º³åÇøÒÔ±£Ö¤ÒѶÁÈ¡µ«ÊÇδÂúµÄÊý¾Ý²»»á¶ªÊ§

    ¡¡¡¡relay_write() - ½«Êý¾ÝдÈëµ½µ±Ç°CPU¶ÔÓ¦µÄrelay»º³åÇøÄÚ¡£ÓÉÓÚËüʹÓÃÁËlocal_irqsave()±£»¤£¬Òò´ËÒ²¿ÉÒÔÔÚÖжÏÉÏÏÂÎÄÖÐʹÓá£

    ¡¡¡¡relay_reserve() - ÔÚrelayͨµÀÖб£ÁôÒ»¿éÁ¬ÐøµÄÇøÓòÀ´Áô¸øÎ´À´µÄдÈë²Ù×÷¡£Õâͨ³£ÓÃÓÚÄÇЩϣÍûÖ±½ÓдÈëµ½relay»º³åÇøµÄÓû§¡£¿¼Âǵ½ÐÔÄÜ»òÕ߯äËüÒòËØ£¬ÕâЩÓû§²»Ï£ÍûÏȰÑÊý¾Ýдµ½Ò»¸öÁÙʱ»º³åÇøÖУ¬È»ºóÔÙͨ¹ýrelay_write()½øÐÐдÈë¡£

    ¡¡¡¡RelayµÄÀý×Ó

    ¡¡¡¡ÎÒÃÇÓÃÒ»¸ö×î¼òµ¥µÄÀý×ÓÀ´½éÉÜÔõôʹÓÃRelay¡£Õâ¸öÀý×ÓÓÉÁ½²¿·Ö×é³É£ºÒ»²¿·ÖÊÇλÓÚÄں˿ռ佫Êý¾ÝдÈërelayÎļþµÄ³ÌÐò£¬Ê¹ÓÃʱÐèÒª×÷Ϊһ¸öÄÚºËÄ£¿é±»¼ÓÔØ£»ÁíÒ»²¿·ÖÊÇλÓÚÓû§¿Õ¼ä´ÓrelayÎļþÖжÁÈ¡Êý¾ÝµÄ³ÌÐò£¬Ê¹ÓÃʱ×÷ΪÆÕͨÓû§Ì¬³ÌÐòÔËÐС£

    ¡¡¡¡Äں˿ռäµÄ³ÌÐòÖ÷Òª²Ù×÷ÊÇ£º

    ¡¡¡¡¼ÓÔØÄ£¿éʱ£¬´ò¿ªÒ»¸örelayͨµÀ£¬²¢ÇÒÍù´ò¿ªµÄrelayͨµÀÖÐдÈëÏûÏ¢£»

    ¡¡¡¡Ð¶ÔØÄ£¿éʱ£¬¹Ø±ÕrelayͨµÀ¡£

    ¡¡¡¡³ÌÐòÄÚÈÝ£º

    /*

    * hello-mod.c

    * a kernel-space client example of relayfs filesystem

    */

    #include

    #include

    static struct rchan *hello_rchan;

    int init_module(void)

    {

    const char *msg="Hello world\n";

    hello_rchan = relay_open("cpu", NULL, 8192, 2, NULL);

    if(!hello_rchan){

    printk("relay_open() failed.\n");

    return -ENOMEM;

    }

    relay_write(hello_rchan, msg, strlen(msg));

    return 0;

    }

    void cleanup_module(void)

    {

    if(hello_rchan) {

    relay_close(hello_rchan);

    hello_rchan = NULL;

    }

    return;

    }

    MODULE_LICENSE ("GPL");

    MODULE_DESCRIPTION ("Simple example of Relay");


    Óû§¿Õ¼äµÄº¯ÊýÖ÷Òª²Ù×÷ÊÇ£º


    Èç¹ûrelayfsÎļþϵͳ»¹Ã»Óб»mount£¬Ôò½«Æämountµ½Ä¿Â¼/mnt/relayÉÏ£»

    ±éÀúÿһ¸öCPU¶ÔÓ¦µÄ»º³åÎļþ

    ´ò¿ªÎļþ

    ¶ÁÈ¡ËùÓÐÎļþÄÚÈÝ

    ¹Ø±ÕÎļþ

    ×îºó£¬umountµôrelayÎļþϵͳ¡£

    ³ÌÐòÄÚÈÝ£º


    /*

    * audience.c

    * a user-space client example of relayfs filesystem

    */

    #include

    #include

    #include

    #include

    #include

    #include

    #include

    #define MAX_BUFLEN 256

    const char filename_base[]="/mnt/relay/cpu";

    // implement your own get_cputotal() before compilation

    static int get_cputotal(void);

    int main(void)

    {

    char filename[128]={0};

    char buf[MAX_BUFLEN];

    int fd, c, i, bytesread, cputotal = 0;

    if(mount("relayfs", "/mnt/relay", "relayfs", 0, NULL)

    && (errno != EBUSY)) {

    printf("mount() failed: %s\n", strerror(errno));

    return 1;

    }

    cputotal = get_cputotal();

    if(cputotal <= 0) {

    printf("invalid cputotal value: %d\n", cputotal);

    return 1;

    }

    for(i=0; i // open per-cpu file

    sprintf(filename, "%s%d", filename_base, i);

    fd = open(filename, O_RDONLY);

    if (fd < 0) {

    printf("fopen() failed: %s\n", strerror(errno));

    return 1;

    }

    // read per-cpu file

    bytesread = read(fd, buf, MAX_BUFLEN);

    while(bytesread > 0) {

    buf[bytesread] = '\0';

    puts(buf);

    bytesread = read(fd, buf, MAX_BUFLEN);

    };

    // close per-cpu file

    if(fd > 0) {

    close(fd);

    fd = 0;

    }

    }

    if(umount("/mnt/relay") && (errno != EINVAL)) {

    printf("umount() failed: %s\n", strerror(errno));

    return 1;

    }

    return 0;

    }

    ¡¡¡¡ÉÏÃæÕâ¸öÀý×Ó¸ø³öÁËʹÓÃrelayµÄÒ»¸ö×î¼òµ¥µÄÇéÐΣ¬²¢Ã»ÓÐʵ¼ÊÓô¦£¬µ«ÊÇÐÎÏóÃèÊöÁË´ÓÓû§¿Õ¼äºÍÄں˿ռäÁ½¸ö·½ÃæÊ¹ÓÃrelayµÄ»ù±¾Á÷³Ì¡£Êµ¼ÊÓ¦ÓÃÖжÔrelayµÄʹÓõ±È»Òª±ÈÕ⸴Ôӵöࡣ¸ü¶àµÄÀý×ÓÇë²Î¼ûrelayµÄÖ÷Ò³¡£