• 20145209&20145309信息安全系统设计基础实验报告 (4)


    实验步骤

    阅读和理解源代码

    • demo_read,demo_write 函数完成驱动的读写接口功能,do_write 函数实现将用户写入的数据逆序排列,通过读取函数读取转换后的数据。这里只是演示接口的实现过程和内核驱动对用户的数据的处理。

    • 代码:

      #define DEVICE_NAME  "demo"
      static ssize_t demo_write(struct file *filp,const char * buffer, size_t count)
      { 
      char drv_buf[];
      copy_from_user(drv_buf , buffer, count);
      …
      }
      static ssize_t demo_read(struct file *filp,char *buffer,size_t count,loff_t *ppos)
      {
      char drv_buf[];
      copy_to_user(buffer, drv_buf,count);
      ….
      }
      static int demo_ioctl(struct inode *inode, struct file *file,unsigned int cmd, unsigned long arg)
      {
      }
      static int demo_open(struct inode *inode, struct file *file)
      {
      }
      static int demo_release(struct inode *inode, struct file *filp)
      {
      MOD_DEC_USE_COUNT;
      DPRINTK("device release
      ");
      return 0;
      }
      static struct file_operations demo_fops = {
      owner:  THIS_MODULE,
      write:demo_write, 
      read: demo_read, 
      ioctl: demo_ioctl,
      open: demo_open,
      release:demo_release,
      };
      #ifdef CONFIG_DEVFS_FS
      static devfs_handle_t devfs_demo_dir, devfs_demoraw;
      #endif
      static int __init demo_init(void)
      {
      int result;
      #ifdef CONFIG_DEVFS_FS
      devfs_demo_dir = devfs_mk_dir(NULL, "demo", NULL);
      devfs_demoraw = devfs_register(devfs_demo_dir, "0", DEVFS_FL_DEFAULT,
      demo_Major, demo_MINOR, S_IFCHR | S_IRUSR | S_IWUSR,&demo_fops, NULL);
      #else
      SET_MODULE_OWNER(&demo_fops);
      result = register_chrdev(demo_Major, "scullc", &demo_fops);
      if (result < 0) return result;
      if (demo_Major == 0) demo_Major = result; /* dynamic */
      #endif
      printk(DEVICE_NAME " initialized
      ");
      return 0;
      }
      static void __exit demo_exit(void)
      {
      unregister_chrdev(demo_major, "demo");
      kfree(demo_devices);
      printk(DEVICE_NAME " unloaded
      ");
      }
      module_init(demo_init);
      module_exit(demo_exit);

    Open方法

    • Open方法提供给驱动程序初始化设备的能力,从而为以后的设备操作做好准备,此外open操作一般还会递增使用计数,用以防止文件关闭前模块被卸载出内核。 •递增使用计数
    • 检查特定设备错误。
    • 如果设备是首次打开,则对其进行初始化。
    • 识别次设备号,如有必要修改 f_op 指针。
    • 分配并填写 filp->private_data 中的数据。

    编译驱动模块及测试程序

    • 在 Makefile 中有两种编译方法,可以在本机上使用gcc 也可以使用交叉编译器进行编译,我们组采用交叉编译器进行编译。

    测试驱动程序

    • 如果使用 gcc 编译的话,需要通过下面的命令来建立设备节点,如果使用交叉编译器的话,不需要建立设备节点。

    修改makefile

    make编译

    实验结果

    make错误,需要创建一个bin文件夹

  • 相关阅读:
    CodeForces 1294B Collecting Packages(排序+贪心)
    计算系数(组合数)
    垒骰子(矩阵快速幂)
    蒜头君倒水(矩阵快速幂)
    Buy Tickets POJ
    Billboard HDU
    树状数组求逆序对 附HDU1394
    codeforces 1304D Shortest and Longest LIS
    codeforces 1301C Ayoub's function
    Codeforces 1301B Motarack's Birthday(二分)
  • 原文地址:https://www.cnblogs.com/zym0728/p/6132246.html
Copyright © 2020-2023  润新知