华中农业大学 学生实验报告

日期: 2019 年 12 月 20 日 成绩
课程名称 计算机操作系统 实验名称 设备驱动实验 实验类型 验证 设计
综合 创新
【实验目的】
实验目的:熟悉Linux下驱动程序设计
编译内核

实验要求:在Linux系统下,编译内核,并在该内核下完成实验;
自主设计驱动程序,完成驱动程序的安装
【实验内容】
1.编译内核
2. ubantu14.04 32位下第一个hello world驱动程序
3. ubantu14.04第二个memory驱动程序
4. ubantu14.04第三个使用文件私有数据的globalmem的设备
5. Linux设备驱动中的阻塞与非阻塞I/O
【实验环境】(含主要设计设备、器材、软件等)
Pc电脑一台
【实验步骤、过程】(含原理图、流程图、关键代码,或实验过程中的记录、数据等)
内容:
编译内核过程:

编译内核代码截图:

第一个hello world驱动程序:

  1. uname -r 查看内核版本
  2. apt-cache search linux-source
  3. sudo apt-get install linux-source-4.15.0
  4. 执行:make oldconfig
  5. 执行:make bzImage
  6. 执行:make modules 和 make modules_install

编写hello. c程序并写Makefile文件;
之后通过make指令,生成hello.ko等其他文件;
执行sudo insmod hello.ko,在lsmod即可验证模块是否已装载,最后rmmod移出模块;
通过cat /var/log/syslog | grep world来观察其输出。
注意:版本号要改
由于用到printk,相关输出信息可以cat/var/log/syslog | grep world查看。

第二个memory驱动程序
首先编写程序,根据设备号,从内核空间将数据取出,写入相应的设备空间内;
再通过程序创建主从设备,将数据写入,再通过模块功能读出,观察其输出。

  1. 到包含 Makefile 和 mydm1.c 的目录下执行 make,生成 mydm1.ko;
  2. 执行 sudo insmod mydm1.ko;
  3. 验证:lsmod | grep mydm1
  4. 需要创建一个文件(该设备文件用于和设备驱动操作) mknod /dev/fgj c 224 0 c 代表字符设备 224 为主设备号,0 为从设备号
  5. gcc test.c,然后执行:sudo ./a.out 输出如下:
    执行结果:

使用文件私有数据的globalmem的设备驱动:

Linux设备驱动中的阻塞与非阻塞I/O:
阻塞和非阻塞 I/O 是设备访问的两种不同模式,驱动程序可以灵活的支持用户空间对设备的这两种访问方式。
本例子讲述了这两者的区别 并实现 I/O 的等 待队列机制, 并进行了用户空间的验证
基本概念: 1> 阻塞操作 是指 在执行设备操作时,若不能获得资源,则挂起进程直到满足操作条件后再进行操作。被挂起的进程进入休眠,被从调度器移走,直到条件满足。
2> 非阻塞操作在不能进行设备操作时,并不挂起,它或者放弃,或者不停地查询,直到可以进行操作。非阻塞应用程序通常使用 select 系统调用查询是否可以对设备进行无阻塞的访问终会引发设备驱动中 poll 函数执行。

通过Up和down获取信号量以及释放信号量。

加入轮询方式,判断FIFO空和满。
结果截图:
指令跟上面几个类似。

【实验结果或总结】(对实验结果进行相应分析,或总结实验的心得体会,并提出实验的改进意见)
1.编译内核的时候,大致了解了编译内核的指令以及对目录树的了解。
2. uname -r 查看内核的版本号,自己采用ubantu的版本号是4.15.0
3. 编写 hello world 程序以及加载驱动的时候,module_init(hello_init); module_exit(hello_exit); 这两个是函数的入口地址和出口地址。
Makefile文件记得更给KERNELDIR := /lib/modules/3.13.0-32-generic/build的版本号包括32也需要改成自己电脑相匹配的。
4. $(MAKE) -C (KERNELDIR)M=(KERNELDIR) M=(KERNELDIR)M=(PWD) modules 这句是 Makefile 的规则:这里的KaTeX parse error: Expected 'EOF', got '&' at position 229: …vMajor,"mydm1",&̲simple_fops); …(shell uname -r)/build 则是用脚本的方法获取 uname -r 即可不用对代码进行修改,动态获取内核的版本信息。 clean: rm *.o *.ko *.mod.c *.order *.symvers 清除 这些文件。
8。需要创建一个文件(该设备文件用于和设备驱动操作) mknod /dev/fgj c 224 0 c 代表字符设备 224 为主设备号,0 为从设备号
9. 使用文件私有数据的globalmem的设备驱动 :用到了内核区的字符设备,将输入的字符存储到全局内存区域,再从用户空间中访问这个区域,获取到其中的数据。struct globalmem_dev { struct cdev cdev; //cdev 结构体 unsigned char mem[GLOBALMEM_SIZE]; //全局内存 }; globalmem 的设备结构体:包含了对应于 globalmem 字符设备的 cdev 和 使用内存 mem[GLOBALMEM_SIZE],其他与上一个实验类似。增加了一个ioctl函数:ioctl()函数接受的 MEM_CLEAR 命令,这个命令将全局内存的有效数据长度 清零,对于设备不支持的命令,ioctl()函数应该返回-EINVAL。,mknod /dev/globalmem c 354 0, echo ‘good nihao’ > /dev/globalmem, cat /dev/globalmem 即可验证输出 ,cat是读出,echo是写入。
10. Linux设备驱动中的阻塞和非阻塞驱动,理解了阻塞和非阻塞驱动的区别,引入并发信号量的控制,其他的大致相同;利用存储区的FIFO特性,实现用户对内核存储区的阻塞和非阻塞两种访问方式,可以为其提供灵活的支持。而这里的测试程序,则是向设备区的文件中写入一定量的数据,在FIFO区空时,会不断输出“can be written”,在FIFO区满后,会不断输出“can be read”,而在FIFO去不空不满时,则会交替输出。运行时由于会出现设备被占用的情况,需要更改设备号。但自己写入数据的时候,并没有出现read.
11.通过这次实验体会到了用户态和内核态编译的差异,初步掌握了设备驱动的基本原理,对于阻塞和非阻塞,异步方式有了初步的了解,这对于自己的学习有很大帮助。

操作系统设备驱动实验实验报告相关推荐

  1. 【吃灰板子捡起来】字符设备驱动开发实验

    字符设备驱动开发实验 一.驱动框架 二.Makefile 三.测试程序 四.过程总结 该实验与正点原子教程一致,先将该实验视频过一遍,然后根据文档进行实验. 一.驱动框架 (1)注册驱动 //incl ...

  2. 【吃灰板子捡起来】新字符设备驱动开发实验

    新字符设备驱动开发实验 一.设备号 二.字符设备 三.设备节点 四.驱动源码 五.总结 一.设备号 定义:/fs/char_dev.c #include <linux/fs.h>/*** ...

  3. 【正点原子MP157连载】第二十章 字符设备驱动开发-摘自【正点原子】STM32MP1嵌入式Linux驱动开发指南V1.7

    1)实验平台:正点原子STM32MP157开发板 2)购买链接:https://item.taobao.com/item.htm?&id=629270721801 3)全套实验源码+手册+视频 ...

  4. 02_字符设备驱动开发

    目录 1 字符设备驱动简介 2 字符设备驱动开发步骤 2.1 驱动模块的加载和卸载 2.2 字符设备注册与注销 2.3 实现设备的具体操作函数 2.4 添加 LICENSE 和作者信息 3 Linux ...

  5. 基于Cortex-A7架构的嵌入式linux ARM驱动开发<1>——字符设备驱动开发

    一.什么是字符设备 字符设备是 Linux 驱动中最基本的一类设备驱动,字符设备就是一个一个字节,按照字节流进行读写操作的设备,读写数据是分先后顺序的.比如我们最常见的点灯.按键.IIC.SPI, L ...

  6. platform 设备驱动实验

    目录 Linux 驱动的分离与分层 驱动的分隔与分离 驱动的分层 platform 平台驱动模型简介 platform 总线 platform 驱动 platform 设备 硬件原理图分析 试验程序编 ...

  7. Linux platform 设备驱动实验-基于正点原子IMX6ULL开发板

    我们以前的设备驱动都非常的简单,都是对IO进行最简单的读写操作.像I2C. SPI.LCD 这些复杂外设的驱动就不能这么去写了,Linux 系统要考虑到驱动的可重用性,因此提出了驱动的分离与分层这样的 ...

  8. 新字符设备驱动实验(自动分配设备号、自动创建应用层设备节点、新字符设备注册到内核的结构体)

    目录 自动分配和释放设备号 示例代码 新的字符设备注册到内核方法 字符设备结构体(前面的设备号也放进来) cdev_init结构体初始化函数 cdev_add 添加到linux内核 cdev_del内 ...

  9. 操作系统第6次实验报告:使用信号

    操作系统第6次实验报告:使用信号 一.实验目的 通过编程进一步了解信号. 二.实验内容 在服务器上用Vim编写程序,完成以下两个作业: 作业1:发送SIGTERM结束子进程 int kill(pid_ ...

  10. Linux驱动——platform设备驱动实验

    文章目录 1. 驱动的分离和分层 1.1 驱动的分离 1.3 驱动的分层 2. 实验程序编写 2.1 leddevice.c编写 2.2 leddriver.c编写 3. 测试 4. 总结 1. 驱动 ...

最新文章

  1. IJCAI 2021 | 医学AI新坑:心电全景图及其生成网络
  2. 面向对象设计原则-Principles and Patterns读书笔记三
  3. 无法嵌入互操作类型 请改用适用的接口_西门子COMOS软件开发定制学习7-嵌入谷歌浏览器内核...
  4. oracle x ksppi,求 x$ksppi 和x$ksppcv 得详细解释
  5. Security+ 学习笔记19 密码学应用
  6. java同步和互斥程序说明(一)
  7. VS2010:把项目由WIN32改为x64
  8. 酷q插件开发Java_酷Q做一个随机二次元图片插件
  9. android平板生产力工具,重塑应用生态,让安卓平板成为生产力工具:华为MatePad Pro体验...
  10. 消息系统——极光推送http://docs.jiguang.cn/
  11. 等级保护测评策略建议整改措施
  12. OCR文字识别 少数民族文字识别 国外文字识别
  13. ISIS-广播网络DIS更新LSDB
  14. 深入java集合-HashMap
  15. 鼎捷APS助力茶花家居实现智能高效生产排程
  16. 常用的华为路由器命令
  17. (UE4 4.27)自定义PrimitiveComponent
  18. Qt开发的开源项目DBA技术介绍
  19. TCP/IP(十一)TCP滑动窗口和拥塞控制
  20. 写一个程序输入一个国家的国家名,输出该国的首都名。

热门文章

  1. 【Android智能硬件开发】【009】安卓读写GPIO
  2. 通信原理 | 信道的概念和实际信道
  3. 【蓝桥杯历年题】2020蓝桥杯A组省赛第二场(10.17)【含蓝桥杯官网提交地址】
  4. linux学习—— CentOS命令行版下创建KVM虚拟机(VM)并添加SR-IOV的虚拟网卡(VF)
  5. vb.net 教程 6-1 进程 Process类初探
  6. html显示链接音乐,歌曲链接怎么填_HTML中如何链接本地音乐
  7. 5101是多大的电阻_贴片电阻1206-5101(5.1K) 1206
  8. Landsat卫星MSS/TM/ETM数据(转自ESRI社区)(二)
  9. HP ProLiant DL380 G6内存错误导致WHEA-Logger 47报警的解决
  10. WPF 登录界面跳转代码