没有合适的资源?快使用搜索试试~ 我知道了~
操作系统课程设计报告设计自己的驱动程序-学位论文.doc
0 下载量 177 浏览量
2023-06-28
04:08:49
上传
评论
收藏 391KB DOC 举报
温馨提示
试读
23页
操作系统课程设计报告设计自己的驱动程序-学位论文.doc
资源推荐
资源详情
资源评论
江苏大学计算机学院课程设计报告
江苏大学计算机学院
课程设计报告
课程名称 设计自己的驱动程序
实验学期 2015 至 2016 学年,第 1 学期
学生姓名
专业班级 计算机 1301
学 号
指导教师 毛启容
开 课 系 操作系统
操作系统课程组制
江苏大学计算机学院课程设计报告
《操作系统》课程设计报告
课程设计题目:
设计自己的驱动程序
设计时间:
2016.01.05~2016.01.13
一、 课程设计目的与要求
目的:编写一个模块化的字符设备驱动程序,手工加载到 linux 内核中,并用 cp
等命令或编写用户程序检测设备驱动程序。
要求:1. 编写一个简单的字符设备驱动程序,该字符设备包括打开、读、写、
注册、注销与释放六个基本操作。
2. 编写一个测试程序,测试字符设备驱动程序的正确性。
3. 要求在实验报告中列出 Linux 内核的版本与内核模块加载过程。
4.设备的安装:需要将编写的设备驱动程序以模块的方式加载进内核。
5.设备的实用:通过 cp,dd 等命令、输入输出重定向或者编写用户程序来
测试所设计的驱动程序。
6.使用 C 或者 C++编程实现。
二、 课程设计内容
设计和实现一个虚拟命名管道(FIFO)的字符设备。写一个模块化的字符设
备驱动程序
三、 课程设计设备与环境
Linux(虚拟机)环境
四、 设计正文
1.系统分析
江苏大学计算机学院课程设计报告
系统调用是操作系统内核和应用程序之间的接口,设备驱动程序是操作系统
内核和机器硬件之间的接口。设备驱动程序为应用程序屏蔽了硬件的细节,这样
在应用程序看来,硬件设备只是一个设备文件,应用程序可以象操作普通文件一
样对硬件设备进行操作。设备驱动程序是内核的一部分,它完成以下的功能:
虚拟设备的注册与注销(指在内核的注册与注销);
虚拟设备的打开与释放;
虚拟设备的读写操作。
字符设备提供给应用程序的是一个流控制接口,主要包括 open()、release
()、read()、write()。在系统中添加一个字符设备驱动程序,实际上就是给上述
操作添加对应的代码。对于字符设备和块设备,Linux 内核对这些操作进行了统
一的抽象,把它们定义在结构体 file_operations 中
2.系统设计
2.1 模块设计
2.2 数据结构说明
字符设备驱动主要应用了三种数据结构:
①file_operations 结构:File_operations 结构体中的成员函数是字符驱动设
备的主体内容,这些函数实际会在应用程序进行 linux 的 open()、release()、
read()、write()等系统调用时最终被调用。
②file 结构,主要用于与文件系统对应的设备驱动程序。代表一个打开的文
件,它由内核在 open 时创建,并传递给在该文件上进行操作的所有函数,直到
碰到最后的 close 函数。在文件的所有实例都被关闭之后,内核会释放这个数据
结构;
③inode 结构,提供了关于特殊设备文件/dev/myDevice 的信息。
各个结构的定义如下:
字符设备驱动
写
操
作
读
操
作
打
开
设
备
释
放
设
备
注
册
设
备
注
销
设
备
江苏大学计算机学院课程设计报告
(1)file_operations 结构:
struct file_operations pStruct = {
open:my_open,
release:my_release,
read:my_read,
write:my_write, };
(2)file 结构:
读:static ssize_t my_read(struct file *file, char __user *user, size_t
t, loff_t *f);
写:static ssize_t my_write(struct file *file, const char __user *user,
size_t t, loff_t *f);
Seek 文件定位:staticloff_tmy_llseek(struct file *filp, loff_t offse
t, int whence)
(3)inode 结构:
打开:static int my_open(struct inode *inode, struct file *file);
释放:static int my_release(struct inode *inode, struct file *file);
/* 注册模块 */
int init_module() {
int ret;
/* 函数中第一个参数是告诉系统,新注册的设备的主设备号由系统分配,
* 第二个参数是新设备注册时的设备名字,
* 第三个参数是指向 file_operations 的指针,
* 当用设备号为 0 创建时,系统一个可以用的设备号创建模块 */
ret = register_chrdev(0, devName, &pStruct);
if (ret < 0) {
江苏大学计算机学院课程设计报告
printk("regist failure!\n");
return -1; }
else {
printk("the device has been registered!\n");
device_num = ret;
printk("<1>the virtual device's major number %d.\n", device_
num);
printk("<1>Or you can see it by using\n");
printk("<1>------more /proc/devices-------\n");
printk("<1>To talk to the driver,create a dev file with\n");
printk("<1>------'mknod /dev/myDevice c %d 0'-------\n", de
vice_num);
printk("<1>Use \"rmmode\" to remove the module\n");
return 0; } }
/* 注销模块,函数名很特殊 */
void cleanup_module() {
unregister_chrdev(device_num, devName);
printk("unregister it success!\n"); }
static int my_open(struct inode *inode, struct file *file) {
if (mutex)
return -EBUSY;
mutex = 1;//上锁
printk("<1>main device : %d\n", MAJOR(inode->i_rdev));
printk("<1>slave device : %d\n", MINOR(inode->i_rdev));
剩余22页未读,继续阅读
资源评论
Mmnnnbb123
- 粉丝: 692
- 资源: 8万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- NVIDIA驱动、CUDA和Pytorch及其依赖
- html动态爱心代码一(附源码)
- c40539bc-071a-486c-9d52-9d0c18d62dac 4.html
- 基于物理的非视域成像(NLOS)算法,利用了nerf+python源码+文档说明
- yuluer知更鸟.7z(1).001
- python课程设计-基于tensorflow实现的图文生成程序,数据集flickr30k-images+源代码+文档说明+截图
- python作业-基于Flickr30k数据集实现图像文本跨模态搜索python源码+数据集+测试界面+项目说明(高分课程设计)
- 基于Qt实现医院信息管理系统c++源码+文档说明+数据库(期末大作业)
- 基于python实现的医院信息管理系统完整源码+sql数据库+详细注释(高分课程设计)
- 基于python的眼底图像视杯视盘分割项目源码+文档说明+截图演示+详细注释(高分课程设计)
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功