· 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
Today is a good day to bribe a high ranking public official.


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.0133 sec