Linuxデバイス駆動-シンプルな文字駆動
14029 ワード
Linux文字デバイスの静的登録方法について説明します.
モジュールのロードについては、まず参照してください.
モジュールの構築と実行
1.またはラインソース:
モジュールのロードについては、まず参照してください.
モジュールの構築と実行
1.またはラインソース:
//memdev.h
#
ifndef _MEMDEV_H_
#
define _MEMDEV_H_
#
ifndef MEMDEV_MAJOR
#
define MEMDEV_MAJOR
200
#
endif
#
ifndef MEMDEV_NR_DEVS
#
define MEMDEV_NR_DEVS
2
#
endif
#
ifndef MEMDEV_SIZE
#
define MEMDEV_SIZE
4096
#
endif
struct mem_dev{
char
* data;
unsigned
long size;
};
#
endif
//memdev.c
#
include
< linux
/ module.h
>
#
include
< linux
/ types.h
>
#
include
< linux
/ fs.h
>
#
include
< linux
/ errno.h
>
#
include
< linux
/ mm.h
>
#
include
< linux
/ sched.h
>
#
include
< linux
/ init.h
>
#
include
< linux
/ cdev.h
>
#
include
<
asm
/ io.h
>
#
include
<
asm
/ system.h
>
#
include
<
asm
/ uaccess.h
>
#
include
< linux
/ wait.h
>
#
include
< linux
/ completion.h
>
#
include
"memdev.h"
MODULE_LICENSE(
"Dual BSD/GPL" );
static
int mem_major
= MEMDEV_MAJOR;
struct mem_dev
* mem_devp;
/* */
struct cdev cdev;
/* */
int mem_open(
struct inode
* inode,
struct file
* filp)
{
printk(
"open own file
" );
return
0 ;
}
/* */
static
const
struct file_operations mem_fops
=
{
.owner
= THIS_MODULE,
.open
= mem_open,
};
/* */
static
int memdev_init(
void )
{
int result;
int i;
dev_t devno
= MKDEV(mem_major,
0 );
/* */
result
= register_chrdev_region(devno,
2 ,
"memdev" );
if (result
<
0 )
return result;
/* cdev */
cdev_init(
& cdev,
& mem_fops);
/* */
cdev_add(
& cdev, MKDEV(mem_major,
0 ), MEMDEV_NR_DEVS);
return result;
}
/* */
static
void memdev_exit(
void )
{
cdev_del(
& cdev);
/* */
unregister_chrdev_region(MKDEV(mem_major,
0 ),
2 );
/* */
}
module_init(memdev_init);
module_exit(memdev_exit);
#Makefile
ifneq ($(KERNELRELEASE),)
obj
-m
:
= memdev.o
else
KERNELDIR
?
=
/lib
/modules
/$(shell uname
-r)
/build
PWD
= $(shell pwd)
default
:
$(MAKE)
-C $(KERNELDIR) M
=$(PWD) modules
clean
:
rm memdev.mod
* module
* memdev.o memdev.ko Module.
*
endif
2.
make , memdev.ko
insmod memdev.ko memdev
:sudo mknod /dev/memdev_t c 200 0
// memusr.c
#
include
<stdio.h
>
#
include
<string.h
>
int main()
{
FILE
*fp0;
/* */
fp0
= fopen(
"/dev/memdev_t",
"r+");
if (fp0
== NULL) {
printf(
"Open Memdev0 Error!
");
return
-
1;
}
}
, dmesg
[38439.741816] Hello World!
[38657.654345] Goodbye
[40393.039520] open own file
sudo memusr 。
:https://www.cnblogs.com/Windeal/p/4284680.html