강좌 & 팁
안녕하세요 판다 이우영입니다.
오늘은 저번주에 설명했던 것을 직접 만들어 보도록 하겠습니다.
그럼 먼저 복습!
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를 해보도록 하겠습니다.
다음시간에 만나요~