안녕하세요^^ 호서대학교 석사(과정) 이우영 입니다.


오늘은 소소하게 비가 내리내요.


빗소리를 들으면서 시작해 보겠습니다.



 

오늘도 저번에 이어서 mem 디바이스 드라이버를 알아보겠습니다.


저번 시간에 chr_dev_init 에서 register_chrdev(MEM_MAJOR,"mem",&memory_fops) 해 주었습니다.


memory_fops는 아래와 같이 open만 들록 되어 있습니다.


 948static const struct file_operations memory_fops = {
 949        .open           = memory_open,  /* just a selector for the real open */
 950};


memoty_open 은 아래와 같이 구성 되어 있습니다.


 891static int memory_open(struct inode * inode, struct file * filp)
 892{
 893        int ret = 0;
 894
 895        lock_kernel();
 896        switch (iminor(inode)) {
 897                case 1:
 898                        filp->f_op = &mem_fops;
 899                        filp->f_mapping->backing_dev_info =
 900                                &directly_mappable_cdev_bdi;
 901                        break;
 902#ifdef CONFIG_DEVKMEM
 903                case 2:
 904                        filp->f_op = &kmem_fops;
 905                        filp->f_mapping->backing_dev_info =
 906                                &directly_mappable_cdev_bdi;
 907                        break;
 908#endif
 909                case 3:
 910                        filp->f_op = &null_fops;
 911                        break;
 912#ifdef CONFIG_DEVPORT
 913                case 4:
 914                        filp->f_op = &port_fops;
 915                        break;
 916#endif
 917                case 5:
 918                        filp->f_mapping->backing_dev_info = &zero_bdi;
 919                        filp->f_op = &zero_fops;
 920                        break;
 921                case 7:
 922                        filp->f_op = &full_fops;
 923                        break;
 924                case 8:
 925                        filp->f_op = &random_fops;
 926                        break;
 927                case 9:
 928                        filp->f_op = &urandom_fops;
 929                        break;
 930                case 11:
 931                        filp->f_op = &kmsg_fops;
 932                        break;
 933#ifdef CONFIG_CRASH_DUMP
 934                case 12:
 935                        filp->f_op = &oldmem_fops;
 936                        break;
 937#endif
 938                default:
 939                        unlock_kernel();
 940                        return -ENXIO;
 941        }
 942        if (filp->f_op && filp->f_op->open)
 943                ret = filp->f_op->open(inode,filp);
 944        unlock_kernel();
 945        return ret;
 946}

보면 조금 틍이하게 되어 있죠? 마이너 번호에 따라 동작하게 하기위한 과정의 일부라고 보여집니다.

우선 lock_kernel(); 을 호출하여 락을 겁니다.

iminor(inode) 함수를 통해서 파일을 open한 디바이스의 마이너 번호를 얻어 옵니다.

그리고 그에 따른 처리를 switch 문으로 해줍니다.

예를 들어 case 1:은 mem 에 관한 디바이스 드라이버 입니다. 

 898                        filp->f_op = &mem_fops;

위를 통해 memory_fops 를 mem_fops로 변경한다. 그럼 다음부터는 mem_fops로 동작한다.

mem_fops 는 다음과 같이 등록 되어 있다.

 802static const struct file_operations mem_fops = {
 803        .llseek         = memory_lseek,
 804        .read           = read_mem,
 805        .write          = write_mem,
 806        .mmap           = mmap_mem,
 807        .open           = open_mem,
 808        .get_unmapped_area = get_unmapped_area_mem,
 809};

이런 식으로 각 마이너 번호별로 file_operations 을 새로 등록 해준다.


마지막에는 unlock_kernel(); 함수를 호출하여 락을 풀어 준다.





오늘까지는 공통으로 사용되는 부분에 대해서 알아 보았습니다.


다음시간부터는 마이너 번호다 동작 방법에 대해서 알아 보도록 하겠습니다.


그럼 다음 시간에 만나요~


http://ms-osek.org/ <- 쫌더 빨리 보고 싶으신분은 여기로 오세요~