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

Contents

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
Username:

ID
Password
Join
Deprive a mirror of its silver and even the Czar won't see his face.


sponsored by andamiro
sponsored by cdnetworks
sponsored by HP

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