zoukankan      html  css  js  c++  java
  • 20145325 《信息安全系统设计基础》实验四 外设驱动程序设计(添加代码分析)

    20145324 20145325 《信息安全系统设计基础》实验四 外设驱动程序设计

    实验封面

    课程:信息安全系统设计基础 班级: 1453

    姓名:王嘉澜 张梓靖 学号:20145324 20145325

    成绩: 指导教师:娄嘉鹏 实验日期:2016.11.17

    实验密级: 预习程度: 实验时间:10:10-12:30

    仪器组次: 必修/选修:必修 实验序号:4

    实验名称: 外设驱动程序设计

    实验目的与要求:
    1.正确连接ARM ,设置好环境
    2.理解驱动程序的一般设计方法

    实验仪器名称 数量 型号
    pc机 1 XP
    arm机 1 UP-TECH
    虚拟机 1 REDHAT

    实验过程

    1. 按实验一的环境配置方法将环境配置好

    2. 通过文件共享,将要测试的代码共享到虚拟机里

    3. 修改 makefile 为

    4. 在/usr/src 下建立一个 linux 连接

    5. 建立设备节点

    6. 运行程序进行测试

    实验代码分析

    1. 实验的完整代码(demo.c)
    #ifndef __KERNEL__
    # define __KERNEL__
    #endif
    #ifndef MODULE
    # define MODULE
    #endif
    #include <linux/config.h>
    #include <linux/module.h>
    #include <linux/devfs_fs_kernel.h>
    #include <linux/init.h>
    #include <linux/kernel.h> /* printk() */
    #include <linux/slab.h> /* kmalloc() */
    #include <linux/fs.h> /* everything... */
    #include <linux/errno.h> /* error codes */
    #include <linux/types.h> /* size_t */
    #include <linux/proc_fs.h>
    #include <linux/fcntl.h> /* O_ACCMODE */
    #include <linux/poll.h> /* COPY_TO_USER */
    #include <asm/system.h> /* cli(), *_flags */
    #define DEVICE_NAME  "demo"
    #define demo_MAJOR 254
    #define demo_MINOR 0
    static int MAX_BUF_LEN=1024;
    static char drv_buf[1024];
    static int WRI_LENGTH=0;
    /*********************************************************************/
    /*逆序排列缓冲区数据*/
    static void do_write()
    {
    int i;
    int len = WRI_LENGTH;
    char tmp;
    for(i = 0; i < (len>>1); i++,len--){
    tmp = drv_buf[len-1];
    drv_buf[len-1] = drv_buf[i];
    drv_buf[i] = tmp;
    }
    }
    /*********************************************************************/
    static ssize_t demo_write(struct file *filp,const char *buffer, size_t count) //完成驱动的写接口
    {
    if(count > MAX_BUF_LEN)count = MAX_BUF_LEN;
    copy_from_user(drv_buf , buffer, count);
    WRI_LENGTH = count;
    printk("user write data to driver
    ");
    do_write();
    return count;
    }
    /*********************************************************************/
    static ssize_t demo_read(struct file *filp, char *buffer, size_t count, loff_t *ppos)  //完成驱动的读接口
    {
    if(count > MAX_BUF_LEN)
    count=MAX_BUF_LEN;
    copy_to_user(buffer, drv_buf,count);
    printk("user read data from driver
    ");
    return count;
    }
    /*********************************************************************/
    static int demo_ioctl(struct inode *inode, struct file *file,  //演示ioctl调用接口的实现过程
    unsigned int cmd, unsigned long arg)
    {
    switch(cmd){
    case 1:printk("runing command 1 
    ");break;
    case 2:printk("runing command 2 
    ");break;
    default:
    printk("error cmd number
    ");break;
    }
    return 0;
    }
    /*********************************************************************/
    static int demo_open(struct inode *inode, struct file *file) //打开设备
    {
    sprintf(drv_buf,"device open sucess!
    ");
    printk("device open sucess!
    ");
    return 0;
    }
    /*********************************************************************/
    static int demo_release(struct inode *inode, struct file *filp) //关闭设备
    {
    MOD_DEC_USE_COUNT;
    printk("device release
    ");
    return 0;
    }
    /*********************************************************************/
    static struct file_operations demo_fops = {  //设置file_operations结构
    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)  //初始化
    {
    #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
    int result;
    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);
    
    1. 除了原有的 demo_read 、demo_write 、do_write 函数,新添加了一个小任务函数 do_read,该函数作用是将从设备中读取到的数据进行数据逆序排列,再通过读取函数读取转换后的数据:
    • 添加的do_read()函数:
    static void do_read()
    {
    int i;
    int len = WRI_LENGTH_R;
    char tmp;
    for(i = 0; i < (len>>1); i++,len--){
    tmp = buffer[len-1];
    buffer[len-1] = buffer[i];
    buffer[i] = tmp;
    }
    }
    
    • 相应的对demo_read函数的修改:
    static int WRI_LENGTH_R=0;
    static ssize_t demo_read(struct file *filp, char *buffer, size_t count, loff_t *ppos)
    {
    if(count > MAX_BUF_LEN)
    count=MAX_BUF_LEN;
    copy_to_user(buffer, drv_buf,count);
    WRI_LENGTH_R = count;
    printk("user read data from driver
    ");
    do_read();
    return count;
    }
    

    实验问题及解决

    1. make不成功
    • 发现没有插入驱动模块 demo.o
    1. 运行程序不成功
    • 还没有建立设备节点。建立以后就可以正常运行了

    实验体会

    makkefile中需要修改的地方的含义:KERNELDIR表示内核源代码路径,INCLUDEDIR表示配置文件,#CROSS_COMPILE表示编译适合编译的主机运行的二进制文件。通过这次实验,我们知道了在运行外设驱动程序时,要插入驱动模块 demo.o,要在/usr/src 下建立一个 linux 连接,如果是使用交叉编译器,不需要建立设备节点等等。

  • 相关阅读:
    leetcode——448.找到所有数组中消失的数字
    leetcode——268.缺失数字
    leetcode——680.验证回文字符串2
    leetcode——125.验证回文串
    leetcode——217.存在重复元素
    leetcode——189.旋转数组
    02-04 线性回归
    02-03 感知机对偶形式(鸢尾花分类)
    02-02 感知机原始形式(鸢尾花分类)
    02-01 感知机
  • 原文地址:https://www.cnblogs.com/zzjzzjzzj/p/6235635.html
Copyright © 2011-2022 走看看