2017-2018-1 20155327 实验四 外设驱动程序设计

题目一

学习资源中全课中的“hqyj.嵌入式Linux应用程序开发标准教程.pdf”中的第十一章
提交康奈尔笔记的照片(可以多张)

题目二

在Ubuntu完成资源中全课中的“hqyj.嵌入式Linux应用程序开发标准教程.pdf”中的第十一章的test试验
提交编译,加载模块,卸载模块,测试运行的截图(要多张,全屏,体现学号信息)

实验过程

  • 驱动程序代码:
#include <linux/module.h>
#include <linux/init.h>
#include <linux/fs.h>
#include <linux/kernel.h>
#include <linux/slab.h>
#include <linux/types.h>
#include <linux/errno.h>
#include <linux/cdev.h>
#include <asm/uaccess.h>
#define     TEST_DEVICE_NAME    "test_dev"
#define        BUFF_SZ                1024/*全局变量*/
static struct cdev test_dev;
unsigned int major =0;
static char *data = NULL;/*读函数*/
static ssize_t test_read(struct file *file,
char *buf, size_t count, loff_t *f_pos)
{int len;if (count < 0 ){return -EINVAL;}len = strlen(data);count = (len > count)?count:len;if (copy_to_user(buf, data, count)) /* 将内核缓冲的数据拷贝到用户空间*/{return -EFAULT;}return count;
}/*写函数*/
static ssize_t test_write(struct file *file, const char *buffer,
size_t count, loff_t *f_pos)
{if(count < 0){return -EINVAL;}memset(data, 0, BUFF_SZ);count = (BUFF_SZ > count)?count:BUFF_SZ;if (copy_from_user(data, buffer, count)) /* 将用户缓冲的数据复制到内核空间*/{return -EFAULT;}return count;
}/*打开函数*/
static int test_open(struct inode *inode, struct file *file)
{printk("This is open operation\n");/* 分配并初始化缓冲区*/data = (char*)kmalloc(sizeof(char) * BUFF_SZ, GFP_KERNEL);if (!data){return -ENOMEM;}memset(data, 0, BUFF_SZ); return 0;
}/*关闭函数*/
static int test_release(struct inode *inode,struct file *file){printk("This is release operation\n");if (data){kfree(data); /* 释放缓冲区*/data = NULL; /* 防止出现野指针 */}return 0;
}/* 创建、初始化字符设备,并且注册到系统*/
static void test_setup_cdev(struct cdev *dev, int minor,struct file_operations *fops)
{int err, devno = MKDEV(major, minor);cdev_init(dev, fops);dev->owner = THIS_MODULE;dev->ops = fops;err = cdev_add (dev, devno, 1);if (err){printk (KERN_NOTICE "Error %d adding test %d", err, minor);}
}/* 虚拟设备的file_operations结构 */
static struct file_operations test_fops =
{.owner   = THIS_MODULE,.read    = test_read,.write   = test_write,.open    = test_open,.release = test_release,
};/*模块注册入口*/
int init_module(void)
{int result;dev_t dev = MKDEV(major, 0);if (major){/* 静态注册一个设备,设备号先前指定好,并设定设备名,用cat /proc/devices来查看 */result = register_chrdev_region(dev, 1, TEST_DEVICE_NAME);}else {result = alloc_chrdev_region(&dev, 0, 1, TEST_DEVICE_NAME);}if (result < 0) {printk(KERN_WARNING "Test device: unable to get major %d\n", major);return result;}test_setup_cdev(&test_dev, 0, &test_fops);printk("The major of the test device is %d\n", major);return 0;
}/*卸载模块*/
void cleanup_module(void)
{cdev_del(&test_dev);unregister_chrdev_region(MKDEV(major, 0), 1);printk("Test device uninstalled\n");
}
  • 测试代码:
 /* test.c */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
#define TEST_DEVICE_FILENAME        "/dev/test_dev"        /* 设备文件名*/
#define BUFF_SZ 1024                /* 缓冲大小 */int main()
{int fd, nwrite, nread;char buff[BUFF_SZ];        /*缓冲区*//* 打开设备文件 */fd = open(TEST_DEVICE_FILENAME, O_RDWR);if (fd < 0){perror("open");exit(1);}do{printf("Input some words to kernel(enter 'quit' to exit):");memset(buff, 0, BUFF_SZ);if (fgets(buff, BUFF_SZ, stdin) == NULL){perror("fgets");break;}buff[strlen(buff) - 1] = '\0';if (write(fd, buff, strlen(buff)) < 0) /* 向设备写入数据 */{perror("write");break;}if (read(fd, buff, BUFF_SZ) < 0)        /* 从设备读取数据 */{perror("read");break;}else{printf("The read string is from kernel:%s\n", buff);}} while(strncmp(buff, "quit", 4));close(fd);exit(0);}

实验截图

实验中遇到的问题及解决方法

  • 实验时遇到权限不够时输入sudo来以管理员身份运行

转载于:https://www.cnblogs.com/l97----/p/7967948.html

2017-2018-1 20155327 实验四 外设驱动程序设计相关推荐

  1. 2018-2019-1 20165318 20165322 20165326 实验四 外设驱动程序设计

    实验四 外设驱动程序设计 实验内容 任务一 任务二 问题及解决方法 参考链接 实验内容 任务一 学习资源中全课中的"hqyj.嵌入式Linux应用程序开发标准教程.pdf"中的第十 ...

  2. 2018-2019-1 20165211 实验四 外设驱动程序设计

    2018-2019-1 20165211 实验四 外设驱动程序设计 任务一 1.实验要求 学习资源中全课中的"hqyj.嵌入式Linux应用程序开发标准教程.pdf"中的第十一章 ...

  3. 2017-2018-1 20155301 实验四 外设驱动程序设计

    2017-2018-1 20155301 实验四 外设驱动程序设计 任务一 实验要求 1)学习资源中全课中的"hqyj.嵌入式Linux应用程序开发标准教程.pdf"中的第十一章 ...

  4. 2017-2018-1 20155321 20155330 《信息安全系统设计基础》实验四——外设驱动程序设计...

    2017-2018-1 20155321 20155330 <信息安全系统设计基础>实验四--外设驱动程序设计 任务一 学习资源中全课中的"hqyj.嵌入式Linux应用程序开发 ...

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

    http://www.cnblogs.com/pigeondandelion/p/6138275.html 转载于:https://www.cnblogs.com/HZW20145322/p/6139 ...

  6. 2018-2019-1 20165231 实验四 外设驱动程序设计

    博客链接:https://www.cnblogs.com/heyanda/p/10054680.html 转载于:https://www.cnblogs.com/Yhooyon/p/10056173. ...

  7. 2018-2019 20165204 20165216 20165220 实验四 外设驱动程序设计

    小组成员博客链接:https://www.cnblogs.com/brs6666/p/10033001.html 转载于:https://www.cnblogs.com/jph596299009/p/ ...

  8. 信息安全系统设计基础实验四:外设驱动程序设计 20145222黄亚奇 20145213祁玮

    北京电子科技学院(BESTI) 实 验 报 告 封 面 课程:信息安全系统设计基础 班级:1452 姓名: 黄亚奇 祁玮 学号: 20145222 20145213 成绩: 指导教师:娄嘉鹏 实验日期 ...

  9. 2019-2020-1 20175227张雪莹《信息安全系统设计基础》实验四 《外设驱动程序设计》

    2019-2020-1 20175227张雪莹<信息安全系统设计基础> 实验四 <外设驱动程序设计> 实验报告封面 课程:信息安全系统设计基础 班级:1752班 姓名:张雪莹 ...

最新文章

  1. 详细介绍!Linux 上几种常用的文件传输方式
  2. Codeforces Round #630 (Div. 2) A~D【思维,数论,字符串,位运算】
  3. P1435 回文字串(DP)
  4. 撞库攻击:一场需要用户参与的持久战
  5. 【DIY】热水器升级加装远程wifi控制功能,esp8266远程红外控制热水器启动,新增自动定时烧水断电需求整理...
  6. 读书笔记 effective c++ Item 16 成对使用new和delete时要用相同的形式
  7. linux之用xargs删除这个目录下面后缀为txt的文件(包括子目录)
  8. 人人商城生成app教程_人人商城APP打包教程(APICLOUD版)
  9. phpstudy apache无法启动_phpstudy和wamp哪个好
  10. 2、使用Spring框架能带来哪些好处
  11. mybatis-generator一些注意点 2021-04-21
  12. (一二四)给类对象赋值、以及类对象的返回值
  13. 数组/指针,字符数组/字符串/指向字符的指针
  14. 安徽合肥一共享单车堆放点发生火灾
  15. 桂林老兵php,桂林老兵的SQLSERVER高级注入技巧
  16. linux字体美化包,linux字体美化
  17. 【UE·蓝图底层篇】一文搞懂NativeClass、GeneratedClass、BlueprintClass、ParentClass
  18. 家校在线app 页面
  19. 【点云3D目标检测】跑通CIA-SSD过程中的一些报错集锦
  20. Java配置环境变量教程,Java配置环境变量的作用

热门文章

  1. 登录环境故障的原理及解决办法? -bash-4.1$ -bash-4.1$
  2. Git基础教程(二)
  3. winpcap 发送数据包
  4. SQL语法练习 - 使用WITH AS提高性能简化嵌套SQL
  5. 转载:MFC 获得各类指针、句柄的方法
  6. jsonp获取服务器数据的方式
  7. http://www.linux.gov.cn
  8. linux非root安装go,linux – go install总是使用GOROOT / bin而不是GOPATH
  9. Leetcode 373. 查找和最小的K对数字 解题思路及C++实现
  10. Activity中加载器的总结