panda.jpg 


안녕하세요 판다 이우영입니다.


오늘은 저번주에 설명했던 것을 직접 만들어 보도록 하겠습니다.


그럼 먼저 복습!


1. 복습!!



저번 시간에는 proc_mkdir, create_proc_entry, remove_proc_entry 에 대해서 알아 보았습니다.


먼저 proc_mkdir 는 proc 폴더를 만드러 주는 함수입니다.


create_proc_entry 는 proc 파일을 만드러 줍니다.


remove_proc_entry는 proc 파일이나 폴더를 제거 합니다.


각 동작은 오늘 테스트 해볼 겁니다.


함수들 원형은  fs/proc/generic.c에 있으니 확인해 보세요.


그럼 하나씩 만들어 보겠습니다.


2. proc 파일 생성과 삭제 테스트




오늘 만들어 볼 프로그램은 저번시간에 설면한 대로 proc 폴더를 만들고, 그안에 또 폴더를 만들겁니다.


그리고 proc 파일을 만들어 보고 아까 만들어둔 proc 폴더에도 proc 파일을 만듭니다.


마지막으로 만든 proc 파일과 폴더를 제거해 보겠습니다.


별다른 동작없이 확인하기위해 타이머 인터럽트를 통해 10초 마다 순차적으로 동작하도록 만들어 보겠습니다.


#include <linux/module.h>

#include <linux/kernel.h>

#include <linux/version.h>

#include <linux/init.h>

#include <linux/fs.h>

#include <linux/sched.h>

#include <linux/interrupt.h>

#include <linux/wait.h>

#include <linux/ioport.h>

#include <linux/slab.h>  

#include <linux/poll.h>  

#include <linux/proc_fs.h>

#include <linux/workqueue.h>

#include <asm/system.h>  

#include <asm/uaccess.h>

#include <asm/ioctl.h>

#include <asm/unistd.h>

#include <asm/io.h>

#include <asm/irq.h>

#include <asm/gpio.h>

#include <linux/irq.h>

#include <linux/time.h>                   

#include <linux/timer.h>   

#include <asm/mach/arch.h>

#include <plat/gpio-cfg.h> 

#include <linux/proc_fs.h>

 

#define INT_DEV_NAME                  "proc_dev"

 

#define TIME_STEP                     10*HZ             //타이머 속도 지금 시스템은 1000

 

#define LED_GPIO_DATA_REGISTER        0x7F008184     //LED 물리 주소

#define LED_ON                        (7<<2)

 

#define PAGE_SIZES                    0x1000

 

volatile u32                          *led_data;

u32                                   irq;

 

struct proc_dir_entry *top_proc_dir      = NULL;

struct proc_dir_entry *bottom_proc_dir   = NULL;

struct proc_dir_entry *proc_file         = NULL;

struct proc_dir_entry *proc_file2        = NULL;

 

typedef struct                                        //타이머를 등록하면서 넘겨줄 데이터

{                                        //이런식도 가능한 것을 보여주고 있습니다.

        struct timer_list      timer;                 // 변수는 필수

        unsigned long          count;

        u8                     flag;

} __attribute__ ((packed)) KERNEL_TIMER_MANAGER;     

 

KERNEL_TIMER_MANAGER                *ptrmng = NULL;  

void kerneltimer_timeover(unsigned long arg);         //등록한 타이머가 동작할 호출하는 함수

 

void kerneltimer_registertimer(KERNEL_TIMER_MANAGER *pdata, unsigned long timeover)

{

        init_timer(&(pdata->timer));

        pdata->timer.expires   = get_jiffies_64( ) + timeover; //타이머가 동작할 시간 입력

        pdata->timer.data      = (unsigned long) pdata;        //함수에 넘겨줄 데이터

        pdata->timer.function  = kerneltimer_timeover;         //동작할 함수 등록

        add_timer(&(pdata->timer));             //타이머 등록

}

 

void kerneltimer_timeover(unsigned long arg)

{

        KERNEL_TIMER_MANAGER *pdata = NULL;

 

        if(arg)

        {

               pdata = (KERNEL_TIMER_MANAGER *) arg;

 

               *led_data = ~(*led_data);                        //LED 제어

               printk("timer!!\n");

               switch(pdata->count)

            {

            case 0:

            printk("creat topdir!!\n");

            top_proc_dir = proc_mkdir("topdir", 0);

            pdata->count++;

            kerneltimer_registertimer(pdata, TIME_STEP);

            break;

            case 1:

            printk("creat bottomdir!!\n");

            bottom_proc_dir = proc_mkdir("bottomdir",  top_proc_dir );

            pdata->count++;

            kerneltimer_registertimer(pdata, TIME_STEP);

            break;

            case 2:

            printk("creat testfile!!\n");

            proc_file = create_proc_entry("testfile", S_IFREG | S_IRWXU, 0);

            pdata->count++;

             kerneltimer_registertimer(pdata, TIME_STEP);

            break;

            case 3:

            printk("creat testfile2!!\n");

            proc_file2 = create_proc_entry("testfile2", S_IFREG | S_IRWXU, top_proc_dir);

            pdata->count++;

            kerneltimer_registertimer(pdata, TIME_STEP);

            break;

            case 4:

            printk("remove proc files!!\n");

            remove_proc_entry("testfile", 0);

            remove_proc_entry("testfile2", top_proc_dir);

             remove_proc_entry("bottomdir", top_proc_dir);

            remove_proc_entry("topdir", 0);

            break;

            }

 

//               kerneltimer_registertimer(pdata, TIME_STEP);     //타이머를 다시 등록해준다.

        }

}

 

 

int proc_init() {

        printk("proc_dev_init!\n");

 

        led_data = ioremap(LED_GPIO_DATA_REGISTER, PAGE_SIZES);

 

        *led_data = LED_ON;

     

        ptrmng = kmalloc(sizeof(KERNEL_TIMER_MANAGER), GFP_KERNEL);

        if(ptrmng == NULL) return -ENOMEM;

 

        memset(ptrmng, 0, sizeof(KERNEL_TIMER_MANAGER));        //0으로 초기화

 

        ptrmng->count  = 0;

        ptrmng->flag = 0;

 

        kerneltimer_registertimer(ptrmng, TIME_STEP);           //타이머 등록

 

        return 0;

}

 

void proc_exit() {

        printk("proc_dev_exit!\n");

 

        if(ptrmng != NULL)

        {

               del_timer(&(ptrmng->timer));

               kfree(ptrmng);

        }

 

        iounmap( led_data );

}

 

module_init(proc_init);

module_exit(proc_exit);

 

MODULE_LICENSE("Dual BSD/GPL"); 


소스 코드는 타겟보드를 이용하여 디바이스 드라이버를 배워보자!(12) - 타이머 인터럽트(2) 를 가져와서 만들었습니다.


다음은 결과를 복사한 모습입니다.


[root@falinux ~]$ ./nfsmnt                                                                                                                         

                        >> 192.168.10.29

[root@falinux ~]$ insmod /mnt/nfs/woo/proc_dev.ko 

proc_dev_init!

[root@falinux ~]$ ls /proc/

1             139           devices       loadavg       sys

1000          2             diskstats     locks         sysvipc

102           3             driver        meminfo       timer_list

1022          4             execdomains   misc          tty

1032          5             filesystems   modules       uid_stat

1037          819           fs            mounts        uptime

1039          857           interrupts    mtd           version

104           863           iomem         net           vmallocinfo

109           buddyinfo     ioports       pagetypeinfo  vmstat

1116          bus           irq           partitions    wakelocks

12            cmdline       kallsyms      self          yaffs

134           cpu           kmsg          slabinfo      yaffs_debug

136           cpuinfo       kpagecount    stat          zoneinfo

138           crypto        kpageflags    swaps

[root@falinux ~]$ timer!!

creat topdir!!


[root@falinux ~]$ ls /proc/

1             139           devices       loadavg       sys

1000          2             diskstats     locks         sysvipc

102           3             driver        meminfo       timer_list

1022          4             execdomains   misc          topdir

1032          5             filesystems   modules       tty

1037          819           fs            mounts        uid_stat

1039          857           interrupts    mtd           uptime

104           863           iomem         net           version

109           buddyinfo     ioports       pagetypeinfo  vmallocinfo

1117          bus           irq           partitions    vmstat

12            cmdline       kallsyms      self          wakelocks

134           cpu           kmsg          slabinfo      yaffs

136           cpuinfo       kpagecount    stat          yaffs_debug

138           crypto        kpageflags    swaps         zoneinfo

[root@falinux ~]$ timer!!

creat bottomdir!!

[root@falinux ~]$ ls /proc/topdir/

bottomdir

[root@falinux ~]$ timer!!

creat testfile!!

[root@falinux ~]$ ls /proc        

1             2             driver        misc          topdir

1000          3             execdomains   modules       tty

102           4             filesystems   mounts        uid_stat

1022          5             fs            mtd           uptime

1032          819           interrupts    net           version

1037          857           iomem         pagetypeinfo  vmallocinfo

1039          863           ioports       partitions    vmstat

104           buddyinfo     irq           self          wakelocks

109           bus           kallsyms      slabinfo      yaffs

1120          cmdline       kmsg          stat          yaffs_debug

12            cpu           kpagecount    swaps         zoneinfo

134           cpuinfo       kpageflags    sys

136           crypto        loadavg       sysvipc

138           devices       locks         testfile

139           diskstats     meminfo       timer_list

[root@falinux ~]$ timer!!

creat testfile2!!


[root@falinux ~]$ ls /proc/topdir/

bottomdir  testfile2

[root@falinux ~]$ timer!!

remove proc files!!


[root@falinux ~]$ ls /proc

1             139           devices       loadavg       sys

1000          2             diskstats     locks         sysvipc

102           3             driver        meminfo       timer_list

1022          4             execdomains   misc          tty

1032          5             filesystems   modules       uid_stat

1037          819           fs            mounts        uptime

1039          857           interrupts    mtd           version

104           863           iomem         net           vmallocinfo

109           buddyinfo     ioports       pagetypeinfo  vmstat

1122          bus           irq           partitions    wakelocks

12            cmdline       kallsyms      self          yaffs

134           cpu           kmsg          slabinfo      yaffs_debug

136           cpuinfo       kpagecount    stat          zoneinfo

138           crypto        kpageflags    swaps

[root@falinux ~]$ rmmod proc_dev

proc_dev_exit!

[root@falinux ~]$  


저번 시간에 설명 한것과 같이 나오는 모습을 보실 수 있습니다.


그럼 오늘도 여기까지!!


다음시간에는 read와 write를 해보도록 하겠습니다.


다음시간에 만나요~