最新要闻
- 天天微动态丨汽车厂商要登月!现代联手科研机构开发探月机器人
- 当前播报:俄罗斯开发者拿到钱了 显卡超频神器Afterburner恢复更新:等了1年半
- 环球热消息:斯柯达研发新EA211系列发动机:全新帕萨特、速派等50车搭载
- 人类最强火箭!SpaceX星舰今晚重新发射:目前系统一切正常
- 天天热议:宝马MINI的冰淇淋只配老外吃:高管刚表示BMW家在中国
- “零工市场”为灵活就业“添翼续航”
- “4.5%”彰显中国经济的韧性和活力
- “中国车企加速迈向电动化,将国际老牌车企甩在身后”
- 通讯!估值1000亿 消息称国产内存厂商寻求IPO上市:4年前量产首款DDR4芯片
- 张颂文用小米13 Ultra拍照!网友建议加上水印
- 【天天时快讯】巴西总统认为电子游戏是垃圾 让年轻人学会暴力杀戮
- 长达10年维护落幕:微软提醒Office 2013已停止支持
- 当前速看:郑渊洁称维权生活像吃苍蝇:21年只成功37个商标 还有673个没成
- 联想刘军:今年将是大客户市场的 “大年”
- 浑厚悠扬!三号楼的钟声……
- 每日热议!房玄龄杜如晦被谁重用_房玄龄杜如晦
广告
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
天天讯息:ubuntu编译字符设备
前言
创建一个简单的字符设备驱动程序。
(资料图片)
本文命令的运行基本上都需要root权限,使用root账号,或者在命令前面加上sudo。
如果你使用ssh远程连接的服务器进行代码编写。那么不要在root用户下创建文件或者文件夹。这会导致你ssh连接vscode编写代码的权限问题。可以在普通用户创建好所有的文件,然后编写。
代码
驱动程序
hello_driver.c
#include #include #include #include #include #include #include #include #include dev_t hello_devid;struct cdev hello_cdev;int hello_major = 0;int hello_minor; uint8_t kernel_buffer[1024] = {0};static struct class *hello_class; static int hello_world_open(struct inode * inode, struct file * file){printk("hello_world_open\r\n");return 0;} static int hello_world_release (struct inode * inode, struct file * file){printk("hello_world_release\r\n");return 0;} static ssize_t hello_world_read (struct file * file, char __user * buffer, size_t size, loff_t * ppos){printk("hello_world_read size:%ld\r\n",size);copy_to_user(buffer,kernel_buffer,size);return size;} static ssize_t hello_world_write(struct file * file, const char __user * buffer, size_t size, loff_t *ppos){printk("hello_world_write size:%ld\r\n",size);copy_from_user(kernel_buffer,buffer,size);return size;} static const struct file_operations hello_world_fops = {.owner= THIS_MODULE,.open= hello_world_open,.release = hello_world_release,.read= hello_world_read,.write= hello_world_write,}; static int __init hello_driver_init(void){int ret;printk("hello_driver_init\r\n"); alloc_chrdev_region(&hello_devid, 0, 1, "hello");hello_major = MAJOR(hello_devid);hello_minor = MINOR(hello_devid);printk("hello driver major=%d,minor=%d\r\n",hello_major, hello_minor); hello_cdev.owner = THIS_MODULE;cdev_init(&hello_cdev, &hello_world_fops);cdev_add(&hello_cdev, hello_devid, 1);hello_class = class_create(THIS_MODULE,"hello_class"); device_create(hello_class,NULL,hello_devid,NULL,"hello"); /* /dev/hello */ return 0;} static void __exit hello_driver_cleanup(void){printk("hello_driver_cleanup\r\n");cdev_del(&hello_cdev);unregister_chrdev_region(hello_devid, 1);device_destroy(hello_class,hello_devid);class_destroy(hello_class);} module_init(hello_driver_init);module_exit(hello_driver_cleanup);MODULE_LICENSE("GPL");
Makefile文件
KERNELDIR := /lib/modules/$(shell uname -r)/buildCURRENT_PATH := $(shell pwd)obj-m := hello_driver.oKBUILD_CFLAGS += -Wno-unused-result -Wno-unused-variablebuild: kernel_modules kernel_modules:$(MAKE) ${CFLAGS} -C $(KERNELDIR) M=$(CURRENT_PATH) modules$(CROSS_COMPILE)gcc -o test_app test_app.cclean:$(MAKE) -C $(KERNELDIR) M=$(CURRENT_PATH) cleanrm -rf test_app
测试程序
test_app.c
#include #include #include #include #include #include #include #include uint8_t buffer[512] = {0}; int main(int argc, char *argv[]){int fd;int ret;fd = open(argv[1], O_RDWR); if(!fd) { printf("everthing is error\n"); } if(!strcmp("read",argv[2])){printf("read data from kernel\r\n");ret = read(fd,buffer,sizeof(buffer));printf("ret len:%d data:%s\r\n",ret,buffer);} if(!strcmp("write",argv[2])){printf("write data to kernel %s len:%ld\r\n",argv[3],strlen(argv[3]));ret = write(fd,argv[3],strlen(argv[3]));printf("ret len:%d\r\n",ret);} close(fd); }
编译
执行make命令编译
root@ubuntu:/home/dong/workspace/drivercode# makemake -C /lib/modules/5.19.0-38-generic/build M=/home/dong/workspace/drivercode modulesmake[1]: Entering directory "/usr/src/linux-headers-5.19.0-38-generic"warning: the compiler differs from the one used to build the kernel The kernel was built by: x86_64-linux-gnu-gcc (Ubuntu 11.3.0-1ubuntu1~22.04) 11.3.0 You are using: gcc (Ubuntu 11.3.0-1ubuntu1~22.04) 11.3.0 CC [M] /home/dong/workspace/drivercode/hello_driver.o MODPOST /home/dong/workspace/drivercode/Module.symvers CC [M] /home/dong/workspace/drivercode/hello_driver.mod.o LD [M] /home/dong/workspace/drivercode/hello_driver.ko BTF [M] /home/dong/workspace/drivercode/hello_driver.koSkipping BTF generation for /home/dong/workspace/drivercode/hello_driver.ko due to unavailability of vmlinuxmake[1]: Leaving directory "/usr/src/linux-headers-5.19.0-38-generic"gcc -o test_app test_app.c
会生成hello_driver.ko文件和test_app
加载模块
insmod hello_driver.ko
卸载模块
rmmod hello_driver
查看模块
lsmod |grep hello_driver
运行测试
创建设备文件
这个文件不是随便创造的,会分配设备号,如果不使用分配的设备号创建会出现读写错误。
每一次加载或者卸载模块都会有dmesg信息。
使用dmesg -c清除信息。加载模块,使用dmesg查看模块信息。
root@ubuntu:/home/dong/workspace/drivercode# dmesg[164284.337396] hello_driver_init[164284.337399] hello driver major=238,minor=0
我的设备主设备号就是238,从设备号是0
创建设备文件命令
mknod /dev/hello c 238 0
测试
读 : ./test_app /dev/hello read
写: ./test_app /dev/hello write 需要写入的内容
关键词:
天天讯息:ubuntu编译字符设备
今日热门!咨询chatGPT关于c#脚本的方案,全文无任何修改。
天天通讯!GIS在电力管理中的应用
央行:我国不存在长期通缩或通胀的基础
观焦点:新华社权威快报|5G基站超264万个 我国数字化基础不断夯实
天天微动态丨汽车厂商要登月!现代联手科研机构开发探月机器人
当前播报:俄罗斯开发者拿到钱了 显卡超频神器Afterburner恢复更新:等了1年半
环球热消息:斯柯达研发新EA211系列发动机:全新帕萨特、速派等50车搭载
人类最强火箭!SpaceX星舰今晚重新发射:目前系统一切正常
天天热议:宝马MINI的冰淇淋只配老外吃:高管刚表示BMW家在中国
“零工市场”为灵活就业“添翼续航”
“4.5%”彰显中国经济的韧性和活力
“中国车企加速迈向电动化,将国际老牌车企甩在身后”
环球新动态:IDEA编译Spring源码教程
微资讯!使用etcd实现Master的选举功能
Rust 知识积累(6)
当前快播:【Jmeter】Request1输出作为Request2输入-后置处理器
世界热文:详解数据结构中栈的定义和操作
通讯!估值1000亿 消息称国产内存厂商寻求IPO上市:4年前量产首款DDR4芯片
张颂文用小米13 Ultra拍照!网友建议加上水印
【天天时快讯】巴西总统认为电子游戏是垃圾 让年轻人学会暴力杀戮
长达10年维护落幕:微软提醒Office 2013已停止支持
当前速看:郑渊洁称维权生活像吃苍蝇:21年只成功37个商标 还有673个没成
联想刘军:今年将是大客户市场的 “大年”
浑厚悠扬!三号楼的钟声……
每日热议!房玄龄杜如晦被谁重用_房玄龄杜如晦
全球快资讯:springboot 中使用 RabbitMQ 配置使用优先级队列
查看Unity3D中默认的变量名与按键的映射
时隔6年后,我又回到博客园了
环球看点!更新整理了一大波热门免费可用的API大全
微动态丨ChatGPT闲谈——火出圈的为什么是 OpenAI?
新消息丨微软苏菲要换代了!Surface Pro 10/Go 4新品曝光:外形/配置大变
【环球报资讯】最新研究:黄河上游区域性干旱能“算来”
这个火车站客流暴增,原因竟是……
全球信息:雪莲子的功效与副作用 雪莲子的功效与作用及食用方法
世界播报:真我11系列拍摄样张首秀:长焦恐怖 可见月亮纹理
【热闻】没人比我更懂外星人?马斯克:如果找到外星人 我立马发推
环球热资讯!ZV-E10同款传感器:索尼FX10视频机即将发布
环球快资讯:熊孩子躲袋子里玩误被司机碾压 路人合力抬车救援:网友吐槽家长心大
环球速看:一大众轿车高速路恶意别车!S形行驶10公里:官方已介入调查
每日焦点!诺诚健华宣布奥布替尼成为中国首个且唯一获批针对边缘区淋巴瘤的BTK抑制剂
田园变游园
中国联通跌5.6% 民生证券在其年内高点推荐
全球简讯:再获殊荣!华为云GaussDB喜提“科技进步一等奖”
当前最新:开发者必读!常用的二维码生成器 API 推荐
第六章 面向对象编程
当前短讯!【备忘录设计模式详解】C/Java/JS/Go/Python/TS不同语言实现
全球讯息:JavaScript 九九乘法表
每日快看:墨水人_墨水
即时:今日描写冬季的古诗名句_描写冬季的古诗
仙剑系列首款开放世界游戏!《仙剑世界》公布首支预告
每日看点!用科技诠释豪华!一文看懂AITO问界M9有多少硬核“黑科技”
环球信息:西安一极氪001全国首烧?极氪回应:初步排除电池起火
全球最新:价格崩了!全新日产天籁直降4.9万:不到14万可买合资中型轿车
全球快报:上海车展宝马Mini展台被曝区别对待 冰激淋只给外国人免费吃
进程处于临界区是什么状态?进程处于临界区可以调度吗?
iu14D2N.tmp是什么意思?iu14D2N.tmpiu14D2N.tmp可以删除吗?
miui开发版内测和公测哪个好?miui开发版内测更新频率是多长时间?
拆机版单反是什么意思?拆机版单反与套机的区别是什么?
苹果IPAD用哪个助手好?苹果ipad型号大全及价格表
当前速读:后台性能测试规范
世界聚焦:福建省练习题
Oracle 备忘清单_开发速查表分享
环球速讯:我想听张惠妹的歌_渴了 张惠妹演唱歌曲
今热点:蜂巢能源“龙鳞甲汽车电池”亮相:续航超1000km 热失控不起火
全球报道:清热降火 一朵泡一杯!徽春堂金丝皇菊10.9元大促(2袋约50朵)
华为智能驾驶总裁:华为智能驾驶体验明显好于特斯拉
小米13 Ultra京东全版本卖断货!很多米粉跟员工要F码
【天天快播报】加量还减价!小米平板6 Pro预售战报出炉:2023年双平台预售量新高
到2028年AIoT平台市场价值249亿美元
环球速讯:前端跨域解决方案——JSONP
最新消息:系统之家win7纯净版官网下载_系统之家win7纯净版官网
环球焦点!昆明高新区持续优化知识产权创新环境
“吉林一号”卫星传图!从太空视角俯瞰春耕锦绣画卷
【世界新要闻】“四驱性能 两驱能耗、价格”降维打击!哈弗枭龙MAX千岛湖试驾
当前时讯:4499元!Redmi X 85英寸电视上市:120Hz高刷、3+32GB大存储
曝iPhone 15 Pro Max独占潜望长焦:苹果选了两家供应商
天天速讯:日本报告称:新电池专利中国在数量上领先 日美在质量上更佳
2023年最新微信小程序抓包教程
当前速递!【读财报】上市险企2022年年报:5家偿付率均下滑 中国平安归母净利润及内含价值位列第一
全球要闻:特斯拉称今年是一个独特的机遇:降价利润依然可控 我们成本领先
世界视点!湖北巴东发现罕见白麂:古代称为“瑞兽”
女子晒衣服不慎10楼跌落悬挂2楼 现场可怕:官方提醒提高安全意识
当前聚焦:2999元 索尼首款专业开放式监听耳机MDR-MV1发布:沉浸感无敌
当前消息!别吐槽网速慢了!2023年第一季度全球宽带最快城市在我国北京
学好虚拟化,首先要学Linux
【焦点热闻】多地展开公司债发行人自查自纠 四大事项成关注重点
这下跟安卓真没区别!iOS 17确定支持第三方应用商店 苹果被逼
环球热门:12-240四摄8焦段!小米13 Ultra影像功能深度解析
李想吐槽变色天窗玻璃如同卫生间隐私膜 理想汽车坚持用电动遮阳帘
看点:学系统集成项目管理工程师(中项)系列09_收尾管理
全球观热点:索尼发布4K HDR旗舰监视器:双液晶面板 峰值亮度4000尼特
每日热文:GPT-4可能对经济领域的近期影响,以及远期对全球可能产生的深远影响。
天天百事通!去年我是怎么解决团队问题的
新日2022年净利同比暴增1326.25%!卖了257万辆电动自行车
焦点热文:在上海车展逛了两天 愣是找不出一辆值得写的油车!
世界今日报丨爷青回!电影《灌篮高手》今日上映:等了20多年的全国大赛开打
焦点快看:等等党赢了!华为Mate 50系列官方降价:最高便宜800元
AutoGPT是什么?超简单安装使用教程
今日精选:微信小程序、uniapp、vue生命周期钩子函数