zoukankan      html  css  js  c++  java
  • Linux内核驱动模块编写尝试

    课堂笔记

    1. 源代码

      /*file: hello.c*/
      
      #ifndef _KERNEL_
      #define _KERNEL_
      #endif
      #ifndef MODULE
      #define MODULE
      #endif
      
      #include <linux/module.h>
      #include <linux/kernel.h>
      #include <linux/init.h>
      
      static hello_init(void);  //需要添加额外的函数申明
      void hello_exit(void);
      
      //_init and _exit is the special macro
      static int hello_init(void){  //去掉了函数名前的_init
      
      printk("Hello, world!
      ");
      return 0;
      }
      
      void hello_exit(void){  //去掉了函数名前的_exit,否则编译无法完成
      printk("Good bye, world!
      ");
      return 0;
      }
      
      module_init(hello_init);
      module_exit(hello_exit);
      
      MODULE_LICENSE("GPL");  // 开源协议许可
      

      注:

      • printk与printf类似,但是是运行在内核态,打印的日志文件在/var/log/messages
    2. 编写Makefile文件并运行

      obj-m += hello.o
      
      all:
      make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
      
      clean:
      make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
      

      注:

      • 必须用该操作编译,否则会出现找不到asm/linkage.h的错误

      • 如果/lib/modules/3.10.0-514.26.2.el7.x86_64目录下的build文件为红色,则执行以下操作

      rm -f build  #删除build文件
      ln -s /usr/src/kernels/3.10.0-1160.11.1.el7.x86_64/ ./build  #新建build文件并建立软链接
      

      image-20210117094217819

      make构建的文件

      image-20210117094548598

    3. 尝试添加和移除模块

      insmod hello.ko
      rmmod hello.ko
      

      如果执行成功,可以在/var/log/messages下查看是否有对应的日志打印

      image-20210117094902061

      注:

      • printk与printf类似,但是是运行在内核态,打印的日志文件在/var/log/messages
    4. 编写Makefile文件并运行

      obj-m += hello.o
      
      all:
      make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
      
      clean:
      make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
      

      注:

      • 必须用该操作编译,否则会出现找不到asm/linkage.h的错误

      • 如果/lib/modules/3.10.0-514.26.2.el7.x86_64目录下的build文件为红色,则执行以下操作

          rm -f build  #删除build文件
          ln -s /usr/src/kernels/3.10.0-1160.11.1.el7.x86_64/ ./build  #新建build文件并建立软链接
        

        image-20210117094217819

      make构建的文件

      image-20210117094548598

    5. 尝试添加和移除模块

      insmod hello.ko
      rmmod hello.ko
      

      如果执行成功,可以在/var/log/messages下查看是否有对应的日志打印

      image-20210117094902061

  • 相关阅读:
    JSON Web令牌(JWT)
    CSRF跨站点请求伪造(Cross—Site Request Forgery)
    logging模块
    Django中使用Celery
    第一坑 先引入jQuery ./引入
    CSS 入门
    超大型文件传输方案 + socket + subprocess popen 远程执行系统命令
    MYSQL的执行计划 事务处理 和 跑路
    mysql 存储过程
    Django中CBV View的as_view()源码解析
  • 原文地址:https://www.cnblogs.com/Arno-vc/p/14288291.html
Copyright © 2011-2022 走看看