강좌 & 팁
글 수 2,412
2011.09.19 18:45:09 (*.119.104.169)
42315
안녕하세요^^ 호서대학교 석사(과정) 이우영 입니다.
오늘은 소소하게 비가 내리내요.
빗소리를 들으면서 시작해 보겠습니다.
오늘도 저번에 이어서 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/ <- 쫌더 빨리 보고 싶으신분은 여기로 오세요~