字符设备驱动 以及Makefile
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 | #include <linux/module.h> // module_init module_exit #include <linux/init.h> // __init __exit #include <linux/cdev.h> #include <linux/fs.h> #define MYMAJOR 200 #define MYNAME "chardev_test_byHc" //DEVICE ID dev_t devid; static int chardev_open( struct inode *inode, struct file *file) { printk(KERN_INFO "chardev open\n" ); return 0; } static ssize_t chardev_read( struct file *file, char __user *buf, size_t size, loff_t *ppos) { return 0; } static const struct file_operations chardev_fops = { .open = chardev_open, .read = chardev_read, }; static struct { struct cdev cdev; }chardev; static int __init mymodule_init( void ) { int ret = 0; printk(KERN_INFO "chrdev_init helloworld init\n" ); cdev_init(&chardev.cdev,&chardev_fops); alloc_chrdev_region(&devid,2,255,MYNAME); printk(KERN_INFO "MAJOR Number is %d\n" ,MAJOR(devid)); printk(KERN_INFO "MINOR Number is %d\n" ,MINOR(devid)); cdev_add(&chardev.cdev,devid,255); return 0; } static void __exit mymodule_exit( void ) { printk(KERN_INFO "chrdev_exit helloworld exit\n" ); cdev_del(&chardev.cdev); unregister_chrdev_region(devid,255); } module_init(mymodule_init); module_exit(mymodule_exit); // MODULE_xxx这种宏作用是用来添加模块描述信息 MODULE_LICENSE( "GPL" ); // 描述模块的许可证 MODULE_AUTHOR( "Hanc" ); // 描述模块的作者 MODULE_DESCRIPTION( "module test" ); // 描述模块的介绍信息 MODULE_ALIAS( "alias xxx" ); // 描述模块的别名信息 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | CURRENT = $(shell uname -r ) KERNEL_TARGET=hello_test MODULE_NAME :=$(KERNEL_TARGET) MODULE_SUF=.ko PWD:=$(shell pwd ) OUTPUT=$(PWD)/ KDIR= /lib/modules/ $(CURRENT) /build INCLUDE=-I /usr/src/linux-headers-4 .9.0-3-common /include EXTRA_CFLAGS = -Wall -g -DASD_KERNEL $(INCLUDE) #ccflags-y+=$(shell if [ $(call cc-version) -ge 0490 ] ; then echo "-Wno-error=date-time -Wno-date-time"; fi ;) obj-m:=$(MODULE_NAME).o $(MODULE_NAME)-objs:= test .o all: make -C $(KDIR) INCLUDE=$(INCLUDE) M=$(PWD) modules clean: make -C $(KDIR) M=$(PWD) clean .PHONY: modules clean |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
2020-03-31 文档解析关注-技术
2020-03-31 mfc添加控制台参数
2020-03-31 蜀道难
2019-03-31 VC++ HIDAPI实现USB数据读写
2019-03-31 进程隐藏
2019-03-31 服务程序
2019-03-31 光电系统显控软件