??????module_init?е????????????????????????????ж????????????module_exit?С??????豸????????????????豸??????????????????豸??????????????У?????????????????豸???alloc_chrdev_region??????????????????cdev_add??????????豸????????????????????????????????д??????????????????д???Makefile?????

ifneq ($(KERNELRELEASE)??)
obj-m := char.o

else
PWD  := $(shell pwd)
KVER := $(shell uname -r)
KDIR := /lib/modules/$(KVER)/build
all:
 $(MAKE) -C $(KDIR) M=$(PWD) modules
clean:
 rm -rf .*.cmd *.o *.mod.c *.ko .tmp_versions modules.*  Module.*
endif

???????Makefile?????????????д??makefile????????????????????????????????char.o??????????????д??飬???????????make???ɡ??????char.ko???????????????????????????????????У?insmod char.ko?????????????????????????????????????????????У???????????????lsmod | grep char???в????????????????豸??????????????豸??????????major??minor?????????????dmesg | tail ????????????????hp??????????????????????249??0????????????????????????????豸??????????mknod /dev/chr_dev c 249 0????????????????ls /dev/chr_dev??????????????????????????????????????????豸????????????д??μ???????????£?

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>

#define CHAR_DEV_NAME "/dev/chr_dev"

int main()
{
 int ret;
 int fd;
 char buf[32];

 fd = open(CHAR_DEV_NAME?? O_RDONLY | O_NDELAY);
 if(fd < 0)
 {
  printf("open failed! ");
  return -1;
 }
 
 read(fd?? buf?? 32);
 close(fd);
 
 return 0;
}

?????????????????????????CHAR_DEV_NAME?????豸????д?豸????????????????????????????б?????????test.c??????gcc test.c -o test??????????????????????????./test???ɡ???????????????????????????????ok????????????????п????κ??????????????????????dmesg?????????????????????????????????????dmesg | tail???ɡ????????????????????????????????chr_open??chr_read?????μ?printk???????????????????????ok???

??????????????????С???????????????????????????????????????????????????????????????????????μ???????????????鲹????£???1???????????????????????豸??????rm -rf /dev/chr_dev???????2????????δ??????????????????Linux?豸??????????????????飬????????????????????????????????????ο???????????