编写简单Linux内核模块

模块代码如下

//main.c
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/sched.h>
#include <linux/list.h>

static int my_hello(void){
    struct task_struct *task = NULL;

    printk("Hello\n");

    for_each_process(task){//打印系统中的所有进程信息
        printk("PID:%d \t NAME:%s \t STATE:%ld\n",task->pid,task->comm,task->state);
    }   

    return 0;
}

static void my_exit(void){
    printk("exit\n");
}

module_init(my_hello);//指定模块加载时执行的操作( 类似C++中的构造函数)
module_exit(my_exit);//指定模块退出时执行的操作( 类似C++中的析构函数)
MODULE_LICENSE("GPL");

Makefile编写

obj-m+=main.o #指定生成的模块

all:
    make -C /lib/modules/$(shell uname -r)/build M=$(shell pwd) modules
clean:
    make -C /lib/modules/$(shell uname -r)/build M=$(shell pwd) clean
其中:make 中的 -c 选项表示切换到指定目录,这里是切换到当前内核的源码目录下. M 选项表示:要生成模块的代码目录,modules表示生成内核模块

整个语句的理解大概可以为: 切换到内核源码目录(因为模块需要用到一些内核头文件),结合自己模块代码生成对应模块

原文地址:https://www.cnblogs.com/r1ng0/p/9448150.html

时间: 2024-10-07 23:25:35

编写简单Linux内核模块的相关文章

Linux内核模块编写详解

内核编程常常看起来像是黑魔法,而在亚瑟 C 克拉克的眼中,它八成就是了.Linux内核和它的用户空间是大不相同的:抛开漫不经心,你必须小心翼翼,因为你编程中的一个bug就会影响到整个系统,本文给大家介绍linux内核模块编写,需要的朋友可以参考下 内核编程常常看起来像是黑魔法,而在亚瑟 C 克拉克的眼中,它八成就是了.Linux内核和它的用户空间是大不相同的:抛开漫不经心,你必须小心翼翼,因为你编程中的一个bug就会影响到整个系统.浮点运算做起来可不容易,堆栈固定而狭小,而你写的代码总是异步的,

编写你的第一个Linux内核模块(目前校对到杂项设备)

想要开始黑掉核?没有线索不知道如何开始?让我们向你展示如何做- 内核编程通常被视为黑魔法.在Arthur C Clarke的意义上说,它可能是.Linux内核与用户空间有很大的不同:抛开漫不经心的态度,你要格外小心,因为在你代码中的一个小小的bug都会影响整个系统.这里没有简单的方法来做浮点运算.堆栈既固定又小,你写的代码总是异步所以你需要考虑并发性.尽管如此,Linux内核是一个非常大而复杂的C程序,对每个人都是开放的(阅读.学习.提高),而你也可以成为其中的一部分. "最简单的方法开始内核编

从简入难makefile文件编写,Linux C++编程,简单vi命令

 1.一个最基本的C++程序 2.第二个c++程序 3.第一个入门级别的简单的makefile 4.在makefile中定义变量. 5.编写makefile的依赖 如果start:标识后面的某个.o没有,则重新编译没有编译的那个文件 6.最终的makefile文件 总结:makefile是通过.o文件是否存在已经.cpp最后的修改时间来判断是否重新编译.o文件. 7.makefile不管理.h文件,它是编译器来进行管理的. vi: i在光标之前插入 a在光标后面插入 x删除后面的字符 dd删

linux 内核模块的编写,插入,显示及卸载

环境:ubuntu 8.04 内核版本:2.6.32.59-debug 1.编写文件hello.c #include <linux/init.h> #include <linux/kernel.h> //printk /*写内核驱动的时候 必须加载这个头文件,作用是动态的将模块加载到内核中去,常用的宏定义如 MODULE_LICESENCE(),MODULE_AUTHOR(),等在此文件中*/ #include <linux/module.h> MODULE_LICEN

Linux内核模块编写模板

本文讲述如何编写Linux内核模块,需要两个文件 mytest.c,Makefile. 存放到同一个文件夹目录,然后make.make install,就可以完成内核模块的编译生成和安装. 然后通过dmesg命令就可以看到从模块初始化函数输出的信息. mytest.c: #include <linux/module.h> #include <linux/crypto.h> #include <linux/kernel.h> #include <linux/init

迅为4412开发板Linux驱动教程——编写简单应用调用驱动

Linux驱动教程:http://pan.baidu.com/s/1c0hljUS 编写简单应用调用驱动--头文件 ? 打印头文件 – include <stdio.h>调用打印函数printf ? 应用中调用文件需要的头文件 – #include <sys/types.h>基本系统数据类型.系统的基本数据类型在32 编译 环境中保持为32 位值,并会在64 编译环境中增长为64 位值. – #include <sys/stat.h>系统调用函数头文件.可以调用普通文件

3、Linux内核模块学习

一.内核模块的学习   内核的整体框架是非常的大,包含的组件也是非常多,如何将需要的组件包含在内核中呢?选择一,就是将所有的组件全部编译进内核,虽然需要的组件都可以使用,但是内核过分庞大,势必带来效率影响:选择二是,将组件编译为模块,需要的时候,就自行加载进内核,这种就是我们称之为的模块,当模块被加载到内核的机制,不仅控制了内核大小,同时被加载的内核与被编译进内核的部分,功能意义.    3.1.内核的加载与卸载     将 hello.c 编译为模块,hello.ko, insmod hell

Linux内核模块编程与内核模块LICENSE -《详解(第3版)》预读

Linux内核模块简介 Linux内核的整体结构已经非常庞大,而其包含的组件也非常多.我们怎样把需要的部分都包含在内核中呢?一种方法是把所有需要的功能都编译到Linux内核.这会导致两个问题,一是生成的内核会很大,二是如果我们要在现有的内核中新增或删除功能,将不得不重新编译内核. 有没有一种机制使得编译出的内核本身并不需要包含所有功能,而在这些功能需要被使用的时候,其对应的代码被动态地加载到内核中呢?Linux提供了这样的一种机制,这种机制被称为模块(Module).模块具有这样的特点. 模块本

Linux内核模块简介

1. 宏内核与微内核 内核(Kernel)在计算机科学中是操作系统最基本的部分,主要负责管理系统资源.中文版维基百科上将内核分为四大类:单内核(宏内核):微内核:混合内核:外内核. 混合内核实质上也是微内核,而外内核是一种比较极端的设计方法,目前还处于研究阶段,所以我们就着重讨论宏内核与微内核两种内核. 简单的介绍,宏内核(Monolithickernel)是将内核从整体上作为一个大过程来实现,所有的内核服务都在一个地址空间运行,相互之间直接调用函数,简单高效.微内核(Microkernel)功