课堂笔记

  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!\n");
    return 0;
    } void hello_exit(void){ //去掉了函数名前的_exit,否则编译无法完成
    printk("Good bye, world!\n");
    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文件并建立软链接

    make构建的文件

  3. 尝试添加和移除模块

    insmod hello.ko
    rmmod hello.ko

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

    注:

    • 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文件并建立软链接

    make构建的文件

  5. 尝试添加和移除模块

    insmod hello.ko
    rmmod hello.ko

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

最新文章

  1. Codeforces Round #267 Div2 C George and Job --DP
  2. [Elixir009]像GenServer一样用behaviour来规范接口
  3. 基础笔记(二)HTTP协议
  4. eclipse 好用的插件安装地址集合【持续更新】
  5. Light OJ 1033 - Generating Palindromes(区间DP)
  6. 生成getter()、setter()方法去掉变量前缀
  7. IKAnalyzer使用停用词词典进行分词
  8. Linux前台的程序转到后台执行(关闭终端而不杀死命令)
  9. BZOJ 1036: [ZJOI2008]树的统计Count( 树链剖分 )
  10. leetcode[60] Rotate List
  11. KVM 虚拟化基本搭建
  12. Animals and Puzzle
  13. Animation-list,帧动画+属性动画,做出Flash般的效果
  14. 可重复执行的SQL Script
  15. jquery左右折叠框
  16. XMPP协议之消息回执解决方案
  17. 网络学习day04_VLSM、子网划分
  18. plugin-barcodescanner 报错
  19. centos7系统分区方案
  20. 微信小程序初体验与DEMO分享

热门文章

  1. Solution -「LOJ #6029」「雅礼集训 2017」市场
  2. dbTable
  3. 《深度探索C++对象模型》第二章 | 构造函数语意学
  4. Spring MVC 是什么? 核心总结
  5. Spring的AOP的底层实现原理?
  6. 微服务从代码到k8s部署应有尽有系列(十四、部署环境搭建)
  7. Django创建第一个应用App(3)
  8. Spring Boot 学习-基础
  9. 小牟有趣的PWN
  10. centos安装k8s集群