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

LinuxϵͳµÄ¸ßЧÊý¾Ý´«Êä¼¼ÊõRelay

·¢²¼Ê±¼ä:2007-01-01 00:27:58À´Ô´:ºìÁª×÷Õß:williamEXE
¡¡¡¡Relay ÊÇÒ»ÖÖ´Ó Linux Äں˵½Óû§¿Õ¼äµÄ¸ßЧÊý¾Ý´«Êä¼¼Êõ¡£Í¨¹ýÓû§¶¨ÒåµÄ relay ͨµÀ£¬Äں˿ռäµÄ³ÌÐòÄܹ»¸ßЧ¡¢¿É¿¿¡¢±ã½ÝµØ½«Êý¾Ý´«Êäµ½Óû§¿Õ¼ä¡£Relay ÌرðÊÊÓÃÓÚÄں˿ռäÓдóÁ¿Êý¾ÝÐèÒª´«Êäµ½Óû§¿Õ¼äµÄÇéÐΣ¬Ä¿Ç°ÒѾ­¹ã·ºÓ¦ÓÃÔÚÄں˵÷ÊÔ¹¤¾ßÈç SystemTapÖС£±¾ÎĽéÉÜÁË Relay µÄÀúÊ·ºÍÔ­Àí£¬²¢ÇÒÓÃÒ»¸ö¼òµ¥µÄʵÀý½éÉÜÁË Relay µÄ¾ßÌåÓ÷¨¡£

¡¡¡¡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»º³åÇø(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£¬Ö÷Òª°´ÕÕÃæÏòÓû§¿Õ¼äºÍÃæÏòÄں˿ռä·ÖΪÁ½´óÀ࣬ÏÂÃæÎÒÃÇÀ´·Ö±ð½øÐнéÉÜ¡£
ÎÄÕÂÆÀÂÛ

¹²ÓÐ 2 ÌõÆÀÂÛ

  1. kemyliu ÓÚ 2007-01-16 09:07:01·¢±í:

    :0L :0L :0L

  2. williamEXE ÓÚ 2007-01-01 00:29:09·¢±í:

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

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

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

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

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

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

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

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

    ¡¡¡¡ÃæÏòÄں˿ռäµÄ 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µÄʹÓõ±È»Òª±ÈÕ⸴Ôӵöࡣ