Chinaunix首页 | 论坛 | 博客
  • 博客访问: 95599
  • 博文数量: 16
  • 博客积分: 359
  • 博客等级: 一等列兵
  • 技术积分: 279
  • 用 户 组: 普通用户
  • 注册时间: 2012-03-24 22:08
文章分类
文章存档

2014年(3)

2012年(13)

我的朋友

分类: LINUX

2012-03-25 12:29:51

2012年3月25日  Sunday
 
1、内核版本号2.6.33.20
 
2、内存映射中mmap()的参数传递
 
3、驱动模块源文件proc_dev.c

点击(此处)折叠或打开

  1. #include <linux/init.h>
  2. #include <linux/kernel.h>
  3. #include <linux/module.h>

  4. #include <linux/fs.h>
  5. #include <linux/errno.h>
  6. #include <linux/types.h>
  7. #include <linux/fcntl.h>

  8. #include <linux/vmalloc.h>
  9. #include <asm/uaccess.h>
  10. #include <asm/io.h>

  11. #include <asm/page.h>
  12. #include <linux/mm.h>

  13. #define MMAPCALL_DEV_NAME "mmapcall"
  14. #define MMAPCALL_DEV_MAJOR 240

  15. int mmapcall_open(struct inode *inode,struct file *filp)
  16. {
  17.     return 0;
  18. }

  19. int mmapcall_release(struct inode *inode,struct file *filp)
  20. {
  21.     return 0;
  22. }

  23. int mmapcall_mmap(struct file *filp,struct vm_area_struct *vma)
  24. {
  25.     printk("vm_pgoff [%08X]\n",vma->vm_pgoff<<PAGE_SHIFT);
  26.     printk("vm_start [%08X]\n",vma->vm_start);
  27.     printk("vm_end [%08X]\n",vma->vm_end);
  28.     printk("vm_flags [%08X]\n",vma->vm_flags);
  29.     
  30.     return -EAGAIN;
  31. }

  32. struct file_operations mmapcall_fops={
  33.     .owner=THIS_MODULE,
  34.     .open=mmapcall_open,
  35.     .release=mmapcall_release,
  36.     .mmap=mmapcall_mmap,
  37. };

  38. int mmapcall_init(void)
  39. {
  40.     int result;
  41.     
  42.     result=register_chrdev(MMAPCALL_DEV_MAJOR,MMAPCALL_DEV_NAME,&mmapcall_fops);
  43.     
  44.     if(result<0){
  45.         return result;
  46.     }    
  47.     return 0;
  48. }

  49. void mmapcall_exit(void)
  50. {
  51.     unregister_chrdev(MMAPCALL_DEV_MAJOR,MMAPCALL_DEV_NAME);
  52. }

  53. module_init(mmapcall_init);
  54. module_exit(mmapcall_exit);

  55. MODULE_LICENSE("Dual BSD/GPL");

4、Makefile

点击(此处)折叠或打开

  1. obj-m += mmapcall_dev.o

  2. CURRENT_PATH := $(shell pwd)

  3. LINUX_KERNEL := $(shell uname -r)

  4. LINUX_KERNEL_PATH := /usr/src/linux-$(LINUX_KERNEL)

  5. all:
  6.     make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) modules
  7. clean:
  8.     #make -C $(LINUX_KERNEL_PAHT) M=$(CURRENT_PATH) clean
  9.     rm *.mod.*
  10.     rm *.order
  11.     rm *.o
  12.     rm *.symvers

5、应用程序源文件call_dev.c

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <sys/types.h>
  3. #include <sys/stat.h>
  4. #include <sys/ioctl.h>
  5. #include <fcntl.h>
  6. #include <unistd.h>
  7. #include <sys/mman.h>

  8. #define DEVICE_FILENAME "/dev/mmapcall"

  9. #define MMAP_SIZE 0x1000

  10. int main()
  11. {
  12.     int dev;
  13.     int loop;
  14.     char *ptrdata;
  15.     
  16.     dev=open(DEVICE_FILENAME,O_RDWR|O_NDELAY);
  17.     
  18.     if(dev>=0){
  19.         ptrdata=(char*)mmap(0x12345000,
  20.                 MMAP_SIZE,
  21.                 PROT_READ|PROT_WRITE,
  22.                 MAP_SHARED,
  23.                 dev,
  24.                 0x87654000);
  25.         munmap(ptrdata,MMAP_SIZE);
  26.         
  27.         close(dev);
  28.     }
  29.     return 0;
  30.     
  31. }

6、实施方法及运行结果

点击(此处)折叠或打开

  1. ~/mmap_params# mknod /dev/mmapcall c 240 0
  2. ~/mmap_params# ls -la /dev/mmapcall | grep mmapcall
  3. crw-r--r-- 1 root root 240, 0 2012-03-25 12:38 /dev/mmapcall
  4. ~/mmap_params# make
  5. ~/mmap_params# gcc mmapcall_app.c -o mmapcall_app
  6. ~/mmap_params# insmod mmapcall_dev.ko
  7. ~/mmap_params# ./mmapcall_app
  8. ~/mmap_params# dmesg
  9. [ 8354.352485] vm_pgoff [87654000]
  10. [ 8354.352497] vm_start [12345000]
  11. [ 8354.352500] vm_end [12346000]
  12. [ 8354.352502] vm_flags [000000FB]

7、移除模块及设备文件

  1. ~/mmap_params# rm /dev/mmapcall
  2. ~/mmap_params# rmmod mmapcall_dev

阅读(1628) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~