实验目的
- 编写最简单的字符驱动程序
- 实现简单的读写功能,并列出常用格式的
Makefile
以及驱动的加载和卸载脚本 - 熟悉字符设备驱动的整个编写流程
实验内容及步骤
任务一
- 任务详情
- 学习资源中全课中的“hqyj.嵌入式Linux应用程序开发标准教程.pdf”中的第十一章
- 提交康奈尔笔记的照片(可以多张)
- 笔记
任务二
- 任务详情
- 在Ubuntu完成资源中全课中的“hqyj.嵌入式Linux应用程序开发标准教程.pdf”中的第十一章的test试验
- 提交编译,加载模块,卸载模块,测试运行的截图(要多张,全屏,体现学号信息)
- 实验步骤
- 在VMware虚拟机中创建文件夹
- 将第十一章中关于字符设备的
test
实验中代码:test_drv.c
、test.c
、Makefile
、test_drv_load
、test_drv_unload
敲入并保存在文件夹内 - 代码链接如下
要注意在
Makefile
中命令换行要用Tab
键进行缩进
- 实验结果及截图
- 编译并加载驱动模块
- 编译:
make clean;make
- 给脚本文件增加可执行权限:
chmod +x ./test_drv_load
- 以管理员身份运行加载脚本:
sudo ./test_drv_load
- 编译:
- 编译并运行测试程序
- 编译:
gcc -o test test.c
- 给文件增加可执行权限:
chmod +x ./test
- 以管理员身份运行:
sudo ./test
- 根据提示输入信息
- 编译:
- 卸载驱动程序
- 给脚本文件增加可执行权限:
chmod +x ./test_drv_unload
- 以管理员身份运行加载脚本:
sudo ./test_drv_unload
- 给脚本文件增加可执行权限:
- 通过
dmesg
命令查看内核打印的信息$ dmesg|tail –n 10 …… The major of the test device is 250 This is open operation This is release operation Test device uninstalled
- 编译并加载驱动模块
实验过程中遇到的问题及解决办法
- 在进行对驱动模块的编译时出现
解决办法:经过查阅才知道忽略了
Makefile
的语法规定:Makefile
中的任何命令之前都必须要有一个tab缩进,否则make就会报错。
- 运行load脚本出现错误
insmod: error inserting './test_drv.ko': -1 File exists
解决办法:该错误翻译为
InSimd:插入“./TestEdRv.Ko”的错误:存在1个文件
,将虚拟机重新启动
- 在运行结束后再一次编译运行load输入
sudo ./test_drv_unload
后出错
解决办法:重启虚拟机再次运行脚本
- 运行
test
时出现open:No such device or address
解决办法:这是虚拟机未连接网络的情况,先将打开VM虚拟机-设置-网络适配器连接方式改为NAT模式,在按照Ubuntu 网络连接显示“设备未托管”解决办法设置即可联网运行
test
- 运行load脚本提示无效的组
解决办法:这说明在load脚本中的
group="david"
david不是当前虚拟机的组用户,可通过cat /etc/passwd
查看所有的用户信息,cat /etc/group
查看所有组信息`,然后将脚本中的组名改成系统中有的组名即可
- 进行卸载驱动程序时提示错误
暂时未找到解决办法。。
参考资料