Linux驱动学习(3-设备节点-手动创建)

原创 2016年05月31日 16:11:33

模块代码chr_test.c

/**
 * To test the chr_dev for AP operation
 * by wozon
 *
 * */

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/cdev.h>
#include <linux/fs.h>


MODULE_LICENSE ("GPL");


dev_t dev;

struct cdev cdev;


int chr_open(struct inode *i, struct file *f)
{
    printk("AP opened!\n");
    return 0;
}

int chr_close(struct inode *i, struct file *filp)
{
    printk("AP closed!\n");
    return 0;
}

struct file_operations chr_fops={
    .owner = THIS_MODULE,
    .open = chr_open,
    .release = chr_close,
};


//模块加载函数
int __init init_module (void)
{
    int rst = 0;
    dev = MKDEV(249,1);   //创建设备节点
    rst = register_chrdev_region(dev,1,"shuibian");  //向内核注册设备号
    if(rst != 0)
    {
        rst = -1;
        goto exit0;
    }

    cdev_init(&cdev,&chr_fops);//字符设备驱动控制块初始化
    rst = cdev_add(&cdev,dev,1);//向内核添加字符设备驱动控制块
    if(rst != 0)
    {
        rst = -2;
        goto exit1;
    }
    printk("Chr,This module was added by the kernel!\n");

    goto exit0;

exit1:
    unregister_chrdev_region(dev,1);//注销设备号

exit0:
    return rst;
}


//模块卸载函数
void __exit cleanup_module (void)
{
    cdev_del(&cdev);//从内核中删除字符设备控制块。
    unregister_chrdev_region(dev,1);
    printk("This module was removed by the kernel!\n");
}

应用程序代码test.c

/*
 * test.c
 */

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/ioctl.h>

int main (void) 
{
    int fd;
    fd = open ("/dev/sb13",O_RDWR);
    if (fd < 0) {
      perror("open");
      exit(0);
    }
    printf ("/dev/chrdev opened, fd=%d\n",fd);

    close (fd);
    printf ("/dev/chrdev closed!\n");
    return 0;
}

Makefile

#To display info during Ccompiling
$(warning KERNELRELEASE=$(KERNELRELEASE))

#To check the KERNELRELEASE enviroment value
ifeq ($(KERNELRELEASE),)
#It's NULL, so to set the enviroment value

KERNELDIR ?= /lib/modules/$(shell uname -r)/build

PWD :=$(shell pwd)

modules:
    $(MAKE) -C $(KERNELDIR) M=$(PWD) modules

modules_install:
    $(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install

clean:
    rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions Module* modules*



.PHONY: modules modules_install clean
#To create obj file
else
        obj-m := chr_test.o
endif

先编译模块文件,在终端里面输入make,按下回车
这里写图片描述
生成chr_test.ko文件。
进入root用户,手动创建设备节点:mknod /dev/ c 249 1
这里写图片描述
可以看出在/dev/目录下面生成了sb13设备
将chr_test.ko文件加载进内核里面 insmod chr_test.ko
编译test.c文件,生成应用程序
这里写图片描述
执行应用程序 sudo ./a.out
这里写图片描述
可以看出,正常访问到了我们刚刚创建的设备节点。

ps:我们这样通过手动方式创建设备节点,然后编辑模块代码,用应用程序来访问,很复杂,尤其是作为别人项目一部分时,就更加不便维护,下一节我们将讲解自动创建设备节点的方法。

删除链表中等于给定值val的所有节点

(1)删除链表中等于给定值val的所有节点  给出链表 1->2->3->3->4->5->3, 和 val = 3, 你需要返回删除3之后的链表:1->2->4->5。  (2)删除链表中重复的...
  • Ssecond
  • Ssecond
  • 2016年10月01日 14:14
  • 292

LintCode_35_翻转链表

翻转一个链表 您在真实的面试中是否遇到过这个题?  Yes 样例 给出一个链表1->2->3->null,这个翻转后的链表为3->2->1->null 挑战 在原地一次翻转完成...
  • zaynmalik
  • zaynmalik
  • 2016年04月09日 23:17
  • 227

Java常见排序:(三)快速排序

快速排序是一种非常快的交换排序方法,思路很简单,将待排的数据序列中任意取一个数据作为分界值,所有比这个值小的放在左边,比他大的放在右边。形成左右两个子序列,左边的值都比分界值小,右边的值都比分界大。接...
  • daguairen
  • daguairen
  • 2016年10月07日 15:12
  • 386

快速排序 和 Dijkstra 3-way快排介绍

此文主要参考Algorithms, 4th Edition,Robert Sedgewick and Kevin Wayne  快速排序算法是一个很重要的算法,提供了解决问题一个重要的思想。...
  • ZJU_Sutton
  • ZJU_Sutton
  • 2013年04月24日 12:58
  • 1175

Hadoop经典案例Spark实现(三)——数据排序

Hadoop经典案例Spark实现(三)——数据排序
  • kwu_ganymede
  • kwu_ganymede
  • 2016年01月07日 13:50
  • 2251

Xposed源码分析

主要行为替换Zygote,进行拓展 1.system/bin/app_process.cpp if (zygote) {         runtime.start(keepLoadingXposed...
  • u012227549
  • u012227549
  • 2014年12月03日 09:24
  • 1287

华为机试—链表翻转(给出链表和数K)

题目: 给出一个链表和一个数k,比如链表1→2→3→4→5→6,k=2,则翻转后2→1→4→3→6→5,若k=3,翻转后3→2→1→6→5→4,若k=4,翻转后4→3→2→1→5→6 基本...
  • wtyvhreal
  • wtyvhreal
  • 2015年05月12日 14:22
  • 1625

【LintCode】翻转链表 II

题目 给一个链表,然后我们要把这个链表中第m个节点到第n个节点的部分翻转。 样例 给出链表1->2->3->4->5->null, m = 2 和n = 4,返回1->4->3->2->5->nul...
  • qq_20801369
  • qq_20801369
  • 2016年09月08日 16:00
  • 427

hanooi汉诺塔递归问题

汉诺塔问题 有三根杆子A,B,C。A杆上有N个(N>1)穿孔圆盘,盘的尺寸由下到上依次变小。要求按下列规则将所有圆盘移至C杆: 每次只能移动一个圆盘; 大盘不能叠在小盘上面。 提示:可将圆盘临时置...
  • scanferror
  • scanferror
  • 2017年12月09日 12:43
  • 21

LintCode(99) 重排链表

题目  重排链表 给定一个单链表L: L0→L1→…→Ln-1→Ln, 重新排列后为:L0→Ln→L1→Ln-1→L2→Ln-2→… 必须在不改变节点值...
  • fly_yr
  • fly_yr
  • 2016年06月03日 21:54
  • 2222
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Linux驱动学习(3-设备节点-手动创建)
举报原因:
原因补充:

(最多只允许输入30个字)