zoukankan      html  css  js  c++  java
  • Linux内核模块编程——Hello World模块

    Linux内核模块编程


    编程环境

    Ubuntu 16.04 LTS

    什么是模块

    内核模块的全称是动态可加载内核模块(Loadable Kernel Modul,KLM),可以动态载入内核,让它成为内核代码的一部分。

    一个模块一般由一组函数和数据结构组成。

    如何编写最简单的Hello World模块

    • 首先要创建一个工作目录,取名叫hello,在命令行输入如下命令
    mkdir hello
    cd hello
    
    • hello.c代码如下:
    #include<linux/module.h>   //每个模块都要包括的头文件
    #include<linux/kernel.h>   //用到了printk()函数
    #include<linux/init.h>
    
    MODULE_LICENSE("GPL");  //没有指定license会出现error
    
    static int hello_init(void)    //static使得该文件以外无法访问
    {
    	printk(KERN_ALERT "Hello World
    "); //只能使用内核里定义好的C函数,printk会根据日志级别将指定信息输出到控制台或日志文件中,KERN_ALERT会输出到控制台
    	return 0;
    }
    static void hello_exit(void)
    {
    	printk(KERN_ALERT "Goodbye World
    ");
    }
    
    module_init(hello_init);
    module_exit(hello_exit);
    
    • Makefile代码如下:
    obj-m := hello.o
    
    KERNEL_DIR := /lib/modules/$(shell uname -r)/build   #指定内核源码
    PWD := $(shell pwd)  #指向当前目录
    
    all:
    	make -C $(KERNEL_DIR) M=$(PWD) modules
    clean:
    	make -C $(KERNEL_DIR) M=$(PWD) clean
    

    检验模块工作情况

    在命令行输入:

    modinfo hello.ko    #modinfo用来查看模块信息
    insmod hello.ko    #加载模块
    lsmod   #查看已经载入的模块,看看有没有hello!
    dmesg   #如果成功应该可以看到最后一行输出了hello world
    rmmod hello   #卸载模块
    
  • 相关阅读:
    apue第16章笔记
    重构与重写
    架构方面的笔记
    多进程失败拉起的demo
    Elasticsearch match_phrase用法
    c++风格
    cocos2d-x 3.2 移植到android
    Mac 下配置 Cocos2d-x 3-x android 的环境
    解决最新版的ADT没有NDK选项的问题
    待飞日记(第六天和第七天)
  • 原文地址:https://www.cnblogs.com/MartinLwx/p/10628530.html
Copyright © 2011-2022 走看看