课堂笔记

  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下查看是否有对应的日志打印

Linux内核驱动模块编写尝试的更多相关文章

  1. xmake v2.6.2 发布,新增 Linux 内核驱动模块构建支持

    Xmake 是一个基于 Lua 的轻量级跨平台构建工具. 它非常的轻量,没有任何依赖,因为它内置了 Lua 运行时. 它使用 xmake.lua 维护项目构建,相比 makefile/CMakeLis ...

  2. Linux 内核源码外编译 linux模块--编译驱动模块的基本方法

    1.先编写一个简单的hello模块,hello.c 源码如下: #ifndef __KERNEL__ # define __KERNEL__ #endif #ifndef MODULE # defin ...

  3. 向linux内核中添加外部中断驱动模块

    本文主要介绍外部中断驱动模块的编写,包括:1.linux模块的框架及混杂设备的注册.卸载.操作函数集.2.中断的申请及释放.3.等待队列的使用.4.工作队列的使用.5.定时器的使用.6.向linux内 ...

  4. 《Linux内核精髓:精通Linux内核必会的75个绝技》一HACK #3 如何编写内核模块

    HACK #3 如何编写内核模块 本节将介绍向Linux内核中动态添加功能的结构—内核模块的编写方法.内核模块Linux内核是单内核(monolithic kernel),也就是所有的内核功能都集成在 ...

  5. 编写一个简单的内核驱动模块时报错 “/lib/modules/3.13.0-32-generic/bulid: 没有那个文件或目录。 停止。”

    编写一个简单的内核驱动模块 static int hello_init() { printk(“hello,I am in kernel now\n”); ; } void addfunc(int a ...

  6. 在Ubuntu上为Android系统编写Linux内核驱动程序(老罗学习笔记1)

    这里,我们不会为真实的硬件设备编写内核驱动程序.为了方便描述为Android系统编写内核驱动程序的过程,我们使用一个虚拟的硬件设备,这个设备只有一个4字节的寄存器,它可读可写.想起我们第一次学习程序语 ...

  7. 在Ubuntu上为Android系统编写Linux内核驱动程序

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6568411 在智能手机时代,每个品牌的手机都有 ...

  8. linux内核代码的编写初步以及makefile的配置

    在linux内核代码开发中,头文件不能包含标准C头文件,只能采用GNC标准 而且内核开发中没有main函数,只有init 和 exit ,这是每个内核模块中必须要包含的函数模块. 在GNU C标准中, ...

  9. 【转载】黑客内核:编写属于你的第一个Linux内核模块

    黑客内核:编写属于你的第一个Linux内核模块

随机推荐

  1. 稳住,传输层里的TCP与UDP协议

    传输层协议 1.TCP协议介绍及报文格式 2.TCP三次握手三次挥手 3.UDP协议介绍 1.传输层有两个协议:TCP(传输控制协议)  UDP(用户数据协议) . TCP是面向连接的,可靠的进程到进 ...

  2. SpringBoot源码解读系列三——引导注解

    我们再来看下SpringBoot应用的启动类: 查看代码 import org.springframework.boot.SpringApplication; import org.springfra ...

  3. 《手把手教你》系列技巧篇(六十五)-java+ selenium自动化测试 - cookie -下篇(详细教程)

    1.简介 今天这一篇,宏哥主要讲解:利用WebDriver 提供可以读取.添加和删除cookie 信息的相关操作方法.验证浏览器中是否存在某个cookie.原因是:因为基于真实的cookie 的测试是 ...

  4. 踩坑系列-Java Calendar

    Calendar是Java util包下的日期Api,其中获取月份是当前月份-1 public class Demo { public static void main(String[] args) ...

  5. 理解Python装饰器(Decorator)

    date: 2017-04-14 00:06:46 Python的装饰器,顾名思义就是可以为已有的函数或对象起到装饰的作用,使得达到代码重用的目的. 从一个简单的例子出发 这个例子中我们已经拥有了若干 ...

  6. Solution -「BZOJ 4316」小C的独立集

    \(\mathcal{Description}\)   Link.   求包含 \(n\) 个结点 \(m\) 条边的仙人掌的最大独立集.   \(n\le5\times10^4\),\(m\le6\ ...

  7. IDA FLIRT使用

    IDA FLIRT/FLAIR   FLIRT是IDA提供的一种函数识别技术,即库文件快速识别与鉴定技术(Fast Library Identification and Recognition Tec ...

  8. Grafana v8.3.3 & jmeter-influxdb2-backend

    1. 说明 接上篇文章,今天继续聊Grafana & influxdb2-backend. 2. Grafana v8.3.3安装 下载rpm包 wget https://dl.grafana ...

  9. netty系列之:Bootstrap,ServerBootstrap和netty中的实现

    目录 简介 Bootstrap和ServerBootstrap的联系 AbstractBootstrap Bootstrap和ServerBootstrap 总结 简介 虽然netty很强大,但是使用 ...

  10. windbg调试系列教程:sos扩展的介绍和使用

    SOS是什么? 直观来说,sos就是一个程序集文件.这个程序集的作用就是让我们在使用windbg分析.net进程时,更加方便快捷.通过sos,我们可以清晰的查看CLR运行时的各类信息,辅助我们去理解托 ...