· KLDP.org · KLDP.net · KLDP Wiki · KLDP BBS ·
Linux Device Driver Self Study

¸ñÂ÷

1 ¸ñÀû
2 Self Study Memo
2.1 2006-03-18
2.2 2006-03-23
2.2.1 2Àå. ¸®´ª½º Ä¿³Î°ú µð¹ÙÀ̽º µå¶óÀ̹ö
2.2.1.1 Ä¿³Î¿¡ ´ëÇÑ °³°ýÀûÀÎ ¼³¸í
2.2.1.2 µð¹ÙÀ̽º µå¶óÀ̹ö
2.2.2 3Àå. µð¹ÙÀ̽º ÆÄÀϰú Àú¼öÁØ ÆÄÀÏ ÀÔÃâ·Â
2.2.2.1 µð¹ÙÀ̽º ÆÄÀϰú ÆÄÀÏ ÀÔÃâ·Â ÇÔ¼ö
2.2.2.2 Àú¼öÁØ ÆÄÀÏ ÀÔÃâ·Â ÇÔ¼ö
2.2.2.3 µð¹ÙÀ̽º ÆÄÀÏ °ü·Ã ÇÔ¼ö
2.2.2.4 Àú¼öÁØ ÆÄÀÏ ÀÔÃâ·Â ÇÔ¼öÀÇ »ç¿ë ¿¹Á¦
2.2.2.4.1 port.c
2.2.2.4.2 lp.c
2.2.2.4.3 mknod ¸í·É°ú Àú¼öÁØ ÆÄÀÏ ÀÔÃâ·Â ÇÔ¼ö Á¤¸®
2.2.3 4Àå. °£´ÜÇÑ ¸ðµâ Å×½ºÆ®
2.2.3.1 ¸ðµâ
2.2.3.2 ¸ðµâ ¼Ò½º Çü½Ä
2.2.3.3 ¸ðµâ ¸Å°³º¯¼ö ÁöÁ¤
2.2.3.4 Ä¿³Î ¸Þ½ÃÁö Ãâ·Â
2.3 2006-03-25
2.4 2006-04-06
2.4.1 5Àå. ¸Þ¸ð¸® ÇÒ´ç°ú ÇØÁ¦
2.4.1.1 º¯¼ö
2.4.1.2 µ¿Àû ¸Þ¸ð¸®
2.4.1.3 ¸Þ¸ð¸® Ç®
2.4.2 6Àå. µð¹ÙÀ̽ºÀÇ µî·Ï°ú ÇØÁ¦
2.4.2.1 µð¹ÙÀ̽º µå¶óÀ̹ö Á¦¾î ¹æ½Ä
2.4.2.2 struct file_operations
2.4.2.3 ¹®ÀÚ µð¹ÙÀ̽º µå¶óÀ̹öÀÇ µî·Ï°ú ÇØÁ¦ ¹× ±¸¼º
2.4.3 7Àå. µð¹ÙÀ̽º µå¶óÀ̹öÀÇ ÃʱâÈ­¿Í Á¾·á
2.4.3.1 ÃʱâÈ­¿Í Á¾·áó¸®
2.4.3.2 ¸ðµâ »ç¿ë Ƚ¼ö °ü¸®
2.4.3.3 I/O ¿µ¿ªÀÇ °æÀï ó¸® ÇÔ¼ö
2.4.4 Check Point
2.4.4.1 Makefile
2.4.4.2 kmalloc() test
2.4.4.3 volatile test
2.4.4.4 read(), write(), llseek() ±¸Çö
3 °Ô½ÃÆÇ

1 ¸ñÀû

ÀÌ ¹®¼­´Â À¯¿µÃ¢´ÔÀÇ ¸®´ª½º µð¹ÙÀ̽º µå¶óÀ̹ö¶õ Ã¥À» Åä´ë·Î Á¦°¡ °øºÎÇÑ °á°ú¸¦ Á¤¸®ÇÑ ¹®¼­ÀÔ´Ï´Ù. Ã¥ÀÇ ¿ä¾àº¸´Ù´Â °¢ À庰 Á¦°¡ ¹è¿ì°í ´À³¤Á¡À» Á¤¸®ÇÏ´Â µ¥ ÃÊÁ¡À» µÑ °ÍÀÔ´Ï´Ù.

2 Self Study Memo

2.1 2006-03-18

  • Ä¿³Î¼Ò½º Áغñ
  • Å×½ºÆ® Ŷ Á¦ÀÛ

2.2 2006-03-23

2.2.1 2Àå. ¸®´ª½º Ä¿³Î°ú µð¹ÙÀ̽º µå¶óÀ̹ö

2.2.1.1 Ä¿³Î¿¡ ´ëÇÑ °³°ýÀûÀÎ ¼³¸í

  • Ä¿³Î ¼Ò½ºÀÇ ±¸Á¶
    • Documentation/
    • arch/ : ¾ÆÅ°ÅØÃ³¿Í ¹ÐÁ¢ÇÑ ¼Ò½ºµé À§Ä¡
    • include/asm : ½Éº¼¸¯ ¸µÅ©, ¾ÆÅ°ÅØÃ³ Ư¼º¿¡ ¸Â´Â
    • include/linux : Ç¥ÁØ ¸®´ª½º Ä¿³Î°ú °ü·ÃµÈ Çì´õÆÄÀÏ

  • Ä¿³Î ¼Ò½º Ž»ö¹æ¹ý
    • http/lxr.linux.no Ä¿³Î ¼Ò½º¸¦ À¥ºê¶ó¿ìÀú·Î º¸¿©ÁØ´Ù
    • grep»ç¿ë
      • »ç¿ë¹ý: grep 션 ... ÆÐÅÏ 일 ...
      • greb readb * -r : ÇϺΠµð·ºÅ丮¸¦ ¸ðµÎ ´ã»öÇÏ¿© readb¶ó´Â ¹®ÀÚ¿­ °Ë»ö
      • greb readb * -r | greb include : readb °Ë»ö°á°ú¿¡¼­ include°¡ Æ÷ÇÔµÈ °Íµé¸¸.
      • À§¿Í °°ÀÌ grebÀ» ¿©·¯°³ °ãÃľ²¸é À¯¿ë

  • 2.2.1.2 µð¹ÙÀ̽º µå¶óÀ̹ö

    • Ä¿³Î¿¡ ÀÚ¿ø ó¸® ¿äû - ½Ã½ºÅÛ È£Ãâ(½Ã½ºÅÛÄÝ, ¼ÒÇÁÆ®¿þ¾î ÀÎÅÍ·´Æ®), µð¹ÙÀ̽º µå¶óÀ̹ö(ÆÄÀÏ ÀÔÃâ·Â °³³ä)
    • ¸ð±Ö°ú µð¹ÙÀ̽º ÆÄÀÏ
      • ¸ðµâ : ´Ù¾Æºñ½º µå¶óÀ̹ö¸¦ Ä¿³Î ¼Ò½º¿¡¼­ ºÐ¸®½ÃŲ °Í?
      • µð¹ÙÀ̽º ÆÄÀÏ : ½Ã½ºÅÛ¿¡ ÀÖ´Â ¸ðµç ÀÚ¿øÀ» ÆÄÀÏ Çü½ÄÀ¸·Î Ç¥Çö
        • /dev/¿¡ À§Ä¡
        • ½Ã½ºÅÛ ¶Ç´Â Çϵå¿þ¾î Á¤º¸¸¦ Á¦°ø
          • µð¹ÙÀ̽º ŸÀÔ : ¹®ÀÚ or ºí·Ï
          • ÁÖ ¹øÈ£(Major) : ÀÀ¿ë ÇÁ·Î±×·¥°ú µð¹ÙÀ̽º µå¶óÀ̹ö »çÀÌÀÇ ¿¬°á °í¸®
          • ºÎ ¹øÈ£(Minor) : ½ÇÁúÀûÀÎ µð¹ÙÀ̽º <<== ÁÖ ¹øÈ£¿Í ºÎ ¹øÈ£ÀÇ Â÷À̰¡ ¹«¾ùÀΰ¡?
    • µð¹ÙÀ̽º µå¶óÀ̹öÀÇ Á¾·ù
      • ¹®ÀÚ : ÀÓÀÇÀÇ ±æÀ̸¦ °®´Â ¹®ÀÚ¿­, ÀÀ¿ë ÇÁ·Î±×·¥¿¡¼­, ¹öÆÛ¾ø´Â
      • ºí·° : ÀÏÁ¤ Å©±âÀÇ ¹öÆÛ¸¦ ÅëÇØ µ¥ÀÌÅ͸¦ ó¸®, Ä¿³Î ³»ºÎÀÇ ÆÄÀÏ ½Ã½ºÅÛ¿¡¼­ °ü¸®
      • ³×Æ®¿öÅ© : ³×Æ®¿öÅ© Ãþ°ú ¿¬°áµÈ µð¹ÙÀ̽º µå¶óÀ̹ö
    • ÅëÇÕÇü µð¹ÙÀ̽º µå¶óÀ̹ö(Ä¿³Î 2.6ºÎÅÍ)
      • device : ½ÇÁ¦ Á¸ÀçÇÏ´Â Çϵå¿þ¾î
      • driver : µð¹ÙÀ̽º¸¦ Á¦¾îÇÏ´Â ¼ÒÇÁÆ®¿þ¾î
      • bus : Çϵå¿þ¾î°¡ ¿¬°áµÈ ¹ö½º¸¦ ÀÇ¹Ì <<==¹ö½ºµµ µð¹ÙÀ̽º ¶ó°í ÇÒ ¼ö ÀÖ³ª?
      • class : Çϵå¿þ¾îÀÇ Á¾·ù
      • interface : ³í¸®ÀûÀÎ ÀÎÅÍÆäÀ̽º
    • Kconfig <-- ÁýÁß Å½±¸ ÇÊ¿ä
      • ÀÌ ¼³Á¤ÆÄÀÏ ¾È¿¡ µð¹ÙÀ̽º°¡ ¼³Á¤µÇ¾î ÀÖÀ¸¸é Ä¿³ÎÀÇ ÄÄÆÄÀÏ ¿É¼Ç¿¡ ÇØ´ç µð¹ÙÀ̽º°¡ ³ªÅ¸³ª°Ô µÈ´Ù???


    2.2.2 3Àå. µð¹ÙÀ̽º ÆÄÀϰú Àú¼öÁØ ÆÄÀÏ ÀÔÃâ·Â


    2.2.2.1 µð¹ÙÀ̽º ÆÄÀϰú ÆÄÀÏ ÀÔÃâ·Â ÇÔ¼ö

    • mknod 바이스 파일명 바이스 파일형 번호 번호
    • µð¹ÙÀ̽º ÆÄÀÏ¿¡´Â fopen°ú °°Àº ½ºÆ®¸² ÆÄÀÏ ÀÔÃâ·Â ÇÔ¼ö¸¦ »ç¿ëÇÏ¸é ¾ÈµÈ´Ù.

    2.2.2.2 Àú¼öÁØ ÆÄÀÏ ÀÔÃâ·Â ÇÔ¼ö



    2.2.2.3 µð¹ÙÀ̽º ÆÄÀÏ °ü·Ã ÇÔ¼ö

    • mknod
      #include <sys/types.h>
      #include <sys/stat.h>
      #include <fcntl.h>
      #include <unistd.h>
      
      int mknod(const char* pathname, mode_t mode, dev_t dev);
      
      
      • S_IFCHR(¹®ÀÚ), S_IFBLK(ºí·Ï)
      • S_IRWXU : »ç¿ëÀÚ¿¡ Àбâ, ¾²±â
      • S_IRWXG : ±×·ì¿¡ Àбâ, ¾²±â
      • dev : ÁÖ¹øÈ£¿Í ºÎ¹øÈ£ ÁöÁ¤ --> (240<<8) | 1
    • perror() : ½ÇÆÐ ÀÌÀ¯¿¡ ´ëÇÑ error ¹øÈ£¸¦ ÇØ¼®ÇÏ¿© ¹®ÀÚ¿­·Î Ç¥Çö


    2.2.2.4 Àú¼öÁØ ÆÄÀÏ ÀÔÃâ·Â ÇÔ¼öÀÇ »ç¿ë ¿¹Á¦

    2.2.2.4.1 port.c
    /*
     * Test /dev/port device file.
     * Output data to print port that is located 0x378
     * It connected 8-LED.
     */
    
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    #include <unistd.h>
    
    int main(int argc, char **argv)
    {
      int fd;       // File Descripter
      int lp;       // Loop Counter
    
      unsigned char buff[1];                        // Buffer for write
    
      fd = open("/dev/port", O_RDWR);       // open /dev/port in read & write mode
      if(fd < 0)                                            // open error, fd must be unsigned.
      {
            perror("/dev/port open error");
      }
    
      while(1)      // Infinite loop. It must be terminated manually.
      {
            for(lp = 0; lp < 8; lp++)       // loop 8th times.
            {
              lseek(fd, 0x378, SEEK_SET);   // Define file pointer is 0x378 that is parallel port.
              buff[0] = (0x01 << lp);               // shift lp times. LED will be shifted.
              write(fd, buff, 1);                   // Out to print port.
    
              sleep(1);             // delay some time. Maybe 1 second?
            }
      }
    
      close(fd);
    
      return 0;
    }
    

    2.2.2.4.2 lp.c
    /*
     * test ioctl() by using /dev/lp0.
     * /dev/lp0 can control printer port. It is used to check printer status.
     * 13 Pin -> LP_PSELECD
     * 12 Pin -> LP_POUTPA
     * 10 Pin -> LP_PACK
     * If button is pushed, they are connected to ground.
     * So logic value is change to zero.
     */
    
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    #include <unistd.h>
    
    #include <linux/lp.h>
    
    int main(int argc, char **argv)
    {
            int fd;                 // file descripter.
            int prnstate;   // save state of print port.
            int lp;                 // loop counter.
    
            fd = open("/dev/lp0", O_RDWR | O_NDELAY);       // open read & write & no_delay.
            if(fd < 0)
            {
                    perror("open error");
                    exit(1);
            }
    
            while(1)
            {
                    ioctl(fd, LPGETSTATUS, &prnstate);              // load print status to prnstate.
                    /* To get status of printer, 
                     * We define parameter of ioctl() is LPGETSTATUS. */
    
                    if((prnstate & LP_PSELECD) == 0)                // LP_PSELECD is 13 Pin. It is connected GND.
                            printf("LP_PSELECK\n");
    
                    else if((prnstate & LP_POUTPA) == 0)
                            printf("LP_POUTPA\n");
    
                    else if((prnstate & LP_PACK) == 0)
                            printf("LP_PACK\n");
    
                    else
                            printf("ON\n");
                    usleep(50000);
            }
    
            close(fd);
    
            return 0;
    }
    
    2.2.2.4.3 mknod ¸í·É°ú Àú¼öÁØ ÆÄÀÏ ÀÔÃâ·Â ÇÔ¼ö Á¤¸®

    2.2.3 4Àå. °£´ÜÇÑ ¸ðµâ Å×½ºÆ®

    2.2.3.1 ¸ðµâ

    • ¾î¶² ±â´ÉÀ» ±¸ÇöÇÏ´Â Ä¿³Î ºÎºÐÀ» ÀǹÌÇϸç ELF Çü½ÄÀÇ °´Ã¼ ÆÄÀÏ
    • Hello worldÇÁ·Î±×·¥ ¹®Á¦ ¹ß»ý.. Ã¥¿¡¼­´Â Ä¿³Î ¹öÀüÀÌ 2.6.4Àε¥ ºñÇØ Áö±Ý »ç¿ëÁßÀÎ Ä¿³ÎÀº 2.6.14.7À̶ó ¹öÀüÀÌ Æ²·Á¼­ Àΰ¡ ÇßÁö¸¸ °á±¹. ¿ÀŸ·Î ¹àÇôÁü.
    • Makefile¿¡¼­ ogj-m := test.c¶ó°í ÇØ³ù¾úÀ½.. --;;;
    • ¸ðµâ µ¿Àû ¸µÅ© °³³ä
      • ½Éº¼ Å×ÀÌºí¿¡ ¿ÜºÎ ÂüÁ¶°¡ °¡´ÉÇÑ ÇÔ¼öÀÇ ½Éº¼°ú ÁÖ¼Ò°¡ µî·ÏµÇ¾îÀÖÀ½.
      • ¸ðµâÀÌ Ä¿³Î¿¡ ÀûÀçµÉ¶§ Ä¿³Î³»ÀÇ ½Éº¼ Å×À̺íÀ» ÂüÁ¶Çϰí ÁÖ¼Ò¸¦ ¾ò´Â´Ù.
      • ¸ðµâ¿¡ ¿ÜºÎ ÂüÁ¶µÈ ½Éº¼ ¼±¾ðÀº °´Ã¼¿Í Å×À̺íÀ» ÀÌ¿ëÇØ °ü¸® <== ¹«½¼ ¸»
      • ¸ðµâÀÇ ¿ÜºÎ ÂüÁ¶°¡ ¼±¾ðµÈ ½Éº¼µéÀ» Ä¿³Î ³»ÀÇ ½Éº¼ Å×ÀÌºí¿¡ µî·Ï
        • ¸ðµâÀÇ ¿ÜºÎ ÂüÁ¶ ½Éº¼ÀÌ ¸ðÁö?
      • ¸ðµâ Äڵ忡¼­ ¼±¾ðµÇÁö ¾Ê¾Ò´ø ÁÖ¼Ò¸¦ ¸ðµÎ ¼±¾ðÇϸé Ä¿³Î¿¡ µî·ÏµÈ´Ù.
    • Ä¿³Î¿¡¼­ »ç¿ëÇÏ´Â ½Éº¼ Å×À̺íÀº cat /proc/ksyms
    • ¸ðµâ À¯Æ¿¸®Æ¼
      • insmod
      • rmmod
      • lsmod
      • depmod
      • modprobe
    • ¸ðµâÀûÀç °úÁ¤ -- 'ÀÌÇØ°¡ ¾È°¨. Á¦°Å °úÁ¤µµ ¸¶Âù°¡Áö''

    2.2.3.2 ¸ðµâ ¼Ò½º Çü½Ä

    • Çì´õÆÄÀÏ
    #include <linux/init.h>
    #include <linux/module.h>
    #include <linux/kernel.h>
    
    • ¸ðµâ °ü·Ã ÇÔ¼ö Ç¥±â¹ý
    module_init(hello_init); // »ç¿ëÀÚ°¡ ÀÓÀÇ·Î ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù.
    module_exit(hello_exit);
    

    2.2.3.3 ¸ðµâ ¸Å°³º¯¼ö ÁöÁ¤

    • µð¹ÙÀ̽º µå¶óÀ̹ö¿Í °°Àº ÃʱⰪ Áß¿¡¼­ ¿ÜºÎ¿¡¼­ º¯°æÇÒ ¼ö ÀÖ´Â °ÍÀ» ¸ðµâ ¸Å°³º¯¼ö
    • ¼³Á¤°ªÀ» ±×¶§ ±×¶§ ´Ù¸£°Ô ÇØ ÁÙ¶§ »ç¿ëÇұ..
    #define <linux/moduelparam.h>
    
    static int onevalue = 1;
    static char *twostring = NULL;
    
    module_param(onevalue, int, 0);
    module_param(twosrting, charp, 0);
    
    • module_param(º¯¼ö¸í, º¯¼ö ŸÀÔ, Á¢±Ù ¼Ó¼º)

    2.2.3.4 Ä¿³Î ¸Þ½ÃÁö Ãâ·Â

    • printk(·Î±×·¹º§, "¸ÞÁö½Ã");
    • µðÆúÆ®´Â 4
    • Ä¿³Î ¸Þ½ÃÁö´Â ¹Ù·Î ÄַܼΠÃâ·ÂµÇÁö ¾Ê°í ¿øÇü Å¥ÇüÅ·Π·Î±×¹öÆÛ¿¡ ÀúÀåµÈ´Ù.
    • dmesg¸¦ »ç¿ëÇϸé Ä¿³Î ¸Þ½ÃÁö¸¦ º¼ ¼ö ÀÖ´Ù.
    • cat /proc/kmsg ´Â ¸Þ½ÃÁö ¹Ù·Î¹Ù·Î Ãâ·Â°¡´ÉÇϰÔ.

    2.3 2006-03-25

    • FA Linux ½Ã¹Ì³ª Âü¼®Çß¾ú½À´Ï´Ù. À½... Á¦°¡ Ãʺ¸¶ó ¼¼¹Ì³ª ³»¿ëÀÌ Àß ÀÌÇØ´Â µÇÁö ¾Ê¾ÒÁö¸¸.. ±×·¡µµ Âü ½Å±âÇÑ °æÇèÀ̾ú³×¿ä. À¯¿µÃ¢´Ô ¿ª½Ã Á¦ »ý°¢´ë·Î ±²ÀåÈù Æ÷½º¸¦ dz±â½Ã´øµ¥¿ä..

    2.4 2006-04-06

    • ¿¡ÈÞ~ ÀÌ·¸°Ô ³¯Â¥°¡ ¶Ò¶Ò ¶³¾îÁö´Â°É º¸´Ï Á¦°¡ »ý°¢Çصµ Âü ÇѽÉÇϳ׿ä.. »¡¸® ¿­½ÉÈ÷ ÇØ¾ß Çϴµ¥.

    2.4.1 5Àå. ¸Þ¸ð¸® ÇÒ´ç°ú ÇØÁ¦

    2.4.1.1 º¯¼ö

    • Àü¿ª & Áö¿ª º¯¼ö : °¡±ÞÀû Áö¿ªº¯¼ö¸¦ »ç¿ëÇÏ°í µð¹ÙÀ̽º µå¶óÀ̹ö°¡ Ä¿³Î¿¡ ÀûÀçµÇ°í ÇØÁ¦µÇ´Â ½ÃÁ¡±îÁö À¯ÁöÇÒ·Á¸é Àü¿ªº¯¼ö·Î ÁöÁ¤
    • static Ű¿öµå¸¦ »ç¿ëÇÏÀÚ : ÇØ´ç ¼Ò½º¿¡¼­¸¸ ÂüÁ¶
    • int ¹®Á¦ : cpu ¸¶´Ù ´Ù¸£´Ï È®ÀÎ, Ä¿³Î¿¡¼­ Á¦°øµÇ´Â °Í »ç¿ë?
    • ±¸Á¶Ã¼´Â packed¸¦ »ç¿ë ½ÇÁ¦ Å©±â·Î ¼±¾ð
    • include/linux/byteorder, #include <asm/byteorder.h>
    • volatile
      • Çϵå¿þ¾î ¼ÂÆÃ½Ã ÄÄÆÄÀÏ·¯°¡ ÀÚµ¿À¸·Î ÃÖÀûÈ­¸¦ ÇÏ°Ô ÇÏ¸é ¾ÈµÈ´Ù
      • ¹Ýµå½Ã ¸Þ¸ð¸®¿¡ Á¢±ÙÇÏ¿© ó¸®ÇÏ¿©¾ß.
      • ¿¹Á¦ÀÛ¼º ÇØº¼°Í

    2.4.1.2 µ¿Àû ¸Þ¸ð¸®

    • kmalloc(), kfree()
    • vmalloc(), vfree()
    • __get_free_pages(), free_pages()

    2.4.1.3 ¸Þ¸ð¸® Ç®

    • »çÀü¿¡ ¿¹ÃøµÇ´Â ÃÖ¼ÒÇÑÀÇ ¸Þ¸ð¸®¸¦ ¹Ì¸® ÇÒ´çÇϰí, °ü¸®ÇÏ´Â ¹æ½Ä?
    • Àý´ë ÇÒ´çÀÌ ½ÇÆÐÇÏÁö ¾ÊÀ½.

    2.4.2 6Àå. µð¹ÙÀ̽ºÀÇ µî·Ï°ú ÇØÁ¦

    2.4.2.1 µð¹ÙÀ̽º µå¶óÀ̹ö Á¦¾î ¹æ½Ä

    • ÀÀ¿ë ÇÁ·Î±×·¥ÀÌ Çϵå¿þ¾î¸¦ Á¦¾îÇϱâ À§Çؼ­´Â Àú¼öÁØ ÆÄÀÏ ÀÔÃâ·Â ÇÔ¼ö¸¦ »ç¿ë µð¹ÙÀ̽º ÆÄÀÏ¿¡ Á¢±ÙÇÏ¸é ±×¿¡ ÇØ´çµÇ´Â µð¹ÙÀ̽º µå¶óÀ̹ö¿¡ Á¦¾î ÇÔ¼öµéÀÌ È£ÃâÀÌ µÇ¾î¼­ Çϵå¿þ¾î¸¦ ´Ù·ç°Ô µÈ´Ù.
    • ¹®ÀÚ, ºí·Ï, ³×Æ®¿öÅ©
    • ¹®ÀÚ µð¹ÙÀ̽º µå¶óÀ̹ö´Â Àú¼öÁØ ÆÄÀÏ ÀÔÃâ·Â¿¡ ´ëÀÀÇÏ´Â Çϵå¿þ¾î¸¦ ´Ù·ç´Â Ä¿³Î ÇÔ¼öÀÇ ÁýÇÕ


    2.4.2.2 struct file_operations

    • ÆÄÀÏ ÀÔÃâ·Â ÇÔ¼ö¿¡ ÇØ´çÇÏ´Â ÇÔ¼öµéÀ» µî·Ï½ÃŰ´Â ±¸Á¶Ã¼

    2.4.2.3 ¹®ÀÚ µð¹ÙÀ̽º µå¶óÀ̹öÀÇ µî·Ï°ú ÇØÁ¦ ¹× ±¸¼º


    2.4.3 7Àå. µð¹ÙÀ̽º µå¶óÀ̹öÀÇ ÃʱâÈ­¿Í Á¾·á

    2.4.3.1 ÃʱâÈ­¿Í Á¾·áó¸®

    • µð¹ÙÀ̽º µå¶óÀ̹ö¿¡ ¸ðµâ ÃʱâÈ­ ½ÃÁ¡, µð¹ÙÀ̽º¸¦ ¿©´Â ½ÃÁ¡, ¸ðµâ Á¦°Å ½ÃÁ¡, µð¹ÙÀ̽º¸¦ ´Ý´Â ½ÃÁ¡
      • insmod ¸í·É : module_init - ¸ðµâ ÀûÀç °úÁ¤
      • open()ÇÔ¼ö : file_operations.open - µð¹ÙÀ̽º ÆÄÀÏÀ» ¿©´Â °úÁ¤
      • close()ÇÔ¼ö : file_operations.release - µð¹ÙÀ̽º ÆÄÀÏÀ» ´Ý´Â °úÁ¤
      • rmmod ¸í·É : module_exit - ¸ðµâ Á¦°Å °úÁ¤

    2.4.3.2 ¸ðµâ »ç¿ë Ƚ¼ö °ü¸®

    2.4.3.3 I/O ¿µ¿ªÀÇ °æÀï ó¸® ÇÔ¼ö

    2.4.4 Check Point

    2.4.4.1 Makefile

    obj-m   := test.o
    
    KDIR    := /lib/modules/$(shell uname -r)/build
    PWD     := $(shell pwd)
    
    default:
        $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
    
    test:
        echo $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
    
    • À§ÀÇ MakefileÀº ±âº»ÀûÀÎ Makefile°ú´Â ´Þ¸® source, object, compilerµîÀÇ ¼³Á¤ÀÌ ¾ø´Ù. °ú¿¬ ÀÌ°Ç ¾î¶»°Ô µ¿ÀÛÀ» ÇÏ´Â °ÍÀϱî?

    • uname -r : ÇöÀç Ä¿³Î ¹öÀüÀÌ Ã߷µȴÙ.
    • /lib/modules/$(shell uname -r)/build : kernel source°¡ ÀÖ´Ù. °¢ ¹öÀü´ëÀÇ kernel ¼Ò½º¿¡ ´ëÇÑ ½Éº¼¸¯ ¸µÅ©ÀÌ´Ù.
    • $(MAKE) : ±×³É make
    • -C : man make·Î È®Àΰá°ú ÀÛ¾÷µð·ºÅ丮¸¦ ¹Ù²Ù´Â ¿É¼ÇÀÌ´Ù. Áï -C /path Çϸé ÇØ´ç path¿¡ ÀÖ´Â MakefileÀ» ½ÇÇà½Ã۴µ¥ ¿©±â¼­´Â Ä¿³Î ¼Ò½º¸¦ ÀÛ¾÷µð·ºÅ丮·Î ¼³Á¤ÇÑ´Ù. SUBDIRSÀº ÇöÀç ÄÄÆÄÀÏÇÒ ¼Ò½º°¡ ÀÖ´Â µð·ºÅ丮¸¦ Ä¿³Î¼Ò½º¿¡ ÀÖ´Â Makefile¿¡ ³Ñ°ÜÁÖ´Â ¿ªÈ°À» ÇÑ´Ù.
    • °á±¹ Ä¿³Î¼Ò½º³»ÀÇ MakefileÀ» »ç¿ëÇØ¼­ ÇöÀç µð·ºÅ丮¿¡ À§Ä¡ÇÑ ¼Ò½º¸¦ make moduleÀ» ÇÏ´Â °ÍÀÌ´Ù.
    • ¹°·Ð ÀÌ·¸°Ô °£´ÜÇÑ ±¸Á¶´Â ¾Æ´Ñ°Í °°Áö¸¸ ÀÏ´Ü ÇöÀç·Î¼­´Â ¿©±âÁ¤µµ±îÁö ÆÄ¾ÇÀ» ÇÏ¿´´Ù.
    • make module½Ã SUBDIRS°¡ ¼³Á¤ÀÌ µÇ¾î ÀÖÀ¸¸é ÀÏ¹Ý Ä¿³Î ÄÄÆÄÀϽà ¼öÇàµÇ´Â make modules°¡ ¾Æ´Ñ ÇöÀç »ç¿ëÀÚ°¡ ÀÛ¼ºÇÑ ¼Ò½º(SUBDIRS¿¡ À§Ä¡ÇÑ)¸¸ ¸ðµâ·Î ÄÄÆÄÀÏÀ» ¼öÇàÇÏ´Â °Í °°´Ù.
    • ¿ª½Ã ¸®´ª½º´Â ½É¿À. ÀÌ·±½ÄÀ¸·Î ¿¬µ¿ÀÌ µÇ³ª´Ï ´ë´Ü~~

    2.4.4.2 kmalloc() test

    • °ú¿¬ kmalloc()À¸·Î ¸Þ¸ð¸® ÇÒ´ç ¹ÞÀ¸¸é /proc/meminfo¿¡ ¸Þ¸ð¸® Á¤º¸°¡ ±× ¸¸Å­ º¯ÇÒ °ÍÀΰ¡?
    • meminfo¿¡ ¾î´À ºÎºÐÀÌ º¯ÇÏ´Â °ÍÀÎÁö ãÀÚ!!
    • ½Ã½ºÅÛ ºÎÆ®½Ã Ä¿³ÎÀº Ä¿³Î ·çƾµéÀÌ ÇÊ¿ä·Î ÇÒ ¸¸Å­À» ¿¹»óÇÏ¿© ¹Ì¸® free_page_list·Î ÃʱâÈ­½ÃÄÑ µÎ°í Ä¿³Î ·çƾÀÌ kmalloc()À» È£ÃâÇϸé kmalloc()·çƾÀº free_page_list¿¡¼­ ¿ä±¸ÇÑ ¸¸Å­À» ÇÒ´çÇØ ÁÖ´Â °ÍÀÌ´Ù. ¹Ì¸® ÇÒ´çÇØ µÎ´Â Å©±â´Â ½Ã½ºÅÛÀÇ ¹°¸®¸Þ·Î¸®¿¡ ºñ·ÊÇÑ´Ù.
    • /usr/src/linux/include/linux/mm.h¿¡¼­ È®ÀÎ!
    • ¿ä±¸µÈ ¾çÀ» ±×·¡µµ ÇÒ´çÇÏ´Â °ÍÀÌ ¾Æ´Ï¶ó ´ÜÆíÈ­¸¦ ¸·±âÀ§ÇØ N¹ÙÀÌÆ®¸¦ ¿ä±¸Çϸé 2^X¹ÙÀÌÆ®¸¦ ÇÒ´ç : 1000¹ÙÀÌÆ®¸¦ ¿ä±¸Çϸé 1025¹ÙÀÌÆ® ÀÌ·±½Ä
    • PAGE_SIZE*32Å©±â¾¿ 100°³ ÇÒ´çÇØÇÑ °á°ú = ÃÑ 13107200Byte, ¾à 13MB, ÀÌÁ¤µµÀÇ ¾çÀÌ º¯ÇѺκÐÀº?
    ÇÒ´çÀü ÇÒ´çÈÄ
    Total 256264 256264
    MemFree 120572 107648
    Buffers 9040 9072
    Cached 71152 71208
    Active 77080 77144
    Inactive 41608 41636
    LowFree 120572 107648
    Dirty 108 180
    Slab 12920 25720
    • À§ÀÇ °á°ú¸¦ º¸¸é MemFree, LowFree,SlabµîÀÌ 13MB¾¿ º¯ÇÑ °ÍÀ» º¼¼ö ÀÖ´Ù. °¢°¢ÀÇ Àǹ̸¦ ´õ Á¤È®ÇÏ°Ô ÆÄ¾ÇÇÒ Çʿ䰡 ÀÖÀ» °Í °°´Ù.
    • Ãß°¡Á¶»ç ÇÊ¿ä'


    2.4.4.3 volatile test

    • volatileÀ» ÇßÀ» ¶§¶û ¾È ÇßÀ» ¶§¶û ¾î¼Àºí¸® ÄÚµåÀÇ º¯È­ È®ÀÎ!

    2.4.4.4 read(), write(), llseek() ±¸Çö

    • ½ÇÁ¦·Î µ¿ÀÛÇÏ´Â °Í ó·³ º¸ÀÌ´Â ¿¹Á¦ ÄÚµå ÀÛ¼ºÇغ¸±â..





    3 °Ô½ÃÆÇ


    captcha
    À̸§:



    sponsored by andamiro
    sponsored by cdnetworks
    sponsored by HP

    Valid XHTML 1.0! Valid CSS! powered by MoniWiki
    last modified 2006-04-28 04:54:19
    Processing time 0.1411 sec