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_LICENSE("Dual BSD/GPL");  //为必须选择的语句,它是模块的许可权限,如果不声明,会出现警告信息。

static int hello_init(void)

{

  printk("Hello, world -- this is the kernel speaking\n");  //printk:与printfde 区别是运行于内核态,且有消息级别机制

  return 0;

}

static void hello_exit(void)

{

  printk("Short is the life of a kernel module\n");

}

module_init(hello_init);  //入口点不再是main( )函数,而应该是module_init( 函数名 )函数

module_exit(hello_exit);  //模块的卸载点指定为hello_exit函数指针

2、编写Makefile

obj-m:=hello.o

KERNELBUILD := /lib/modules/2.6.32.59-debug  //本Makefile 依赖的linux内核源码路径  ,如是交叉编译时就取开发板上运行的源码路径

all:

  make -C $(KERNELBUILD) M=$(shell pwd) modules //到linux源码所在的目录执行主Makefile 并当前路径传给主Makefile,告诉主Makefile执行完后返回到当前目录,执行Makefile

  echo insmod ./hello.ko to turn it on

clean:

  rm -rf *.o *.ko *.mod.c *order *.symvers .tmp_versions

3、在hello.c目录下make,于是当前目录出现了 hello.ko

4、insmod hello.ko

5、dmesg -C查看内核信息(由第四步产生的)

6、lsmod | grep "hello"  命令可以看到hello内核模块,如果第四步正确的话

7、rmmod hello    //删除内核模块hello.ko

8、dmesg -C查看内核信息(由第七步产生)。

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

时间: 2024-10-26 08:59:23

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

Linux内核模块编写详解

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

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

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

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

Linux内核模块简介

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

linux内核模块相关命令:lsmod,depmod,modprobe,modinfo,insmod,rmmod 使用说明

加载内核驱动的通常流程: 1.先将.ko文件拷贝到/lib/module/`uname -r`(内核版本号)/kernel/driver/...目录下, 根据具体用途的区别分为net.ide.scsi.usb.video.parport.md.block.ata等等. 2.运行depmod -a,更新模块依赖新,主要是更新modules.dep文件 3.运行modprobe加载内核模块 lsmod 功能:列出内核已载入模块的状态 用法:lsmod 描述: lsmod 以美观的方式列出/proc/

linux内核模块编译makefile

linux内核可加载模块的makefile 在开发linux内核驱动时,免不了要接触到makefile的编写和修改,尽管网上的makefile模板一大堆,做一些简单的修改就能用到自己的项目上,但是,对于这些基础的东西,更应该做到知其然并知其所以然. 本篇文章中只讨论linux内核模块编译的makefile,linux内核makefile总览可以参考另一篇博客:linux内核makefile概览 本篇博客参考官方文档. linux内核使用的是kbuild编译系统,在编译可加载模块时,其makefi

3、Linux内核模块学习

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

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

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

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

Linux内核模块简单介绍 Linux内核的总体结构已经很庞大,而其包括的组件或许多.我们如何把须要的部分都包括在内核中呢?一种方法是把全部须要的功能都编译到Linux内核.这会导致两个问题.一是生成的内核会很大,二是假设我们要在现有的内核中新增或删除功能,将不得不又一次编译内核. 有没有一种机制使得编译出的内核本身并不须要包括全部功能,而在这些功能须要被使用的时候,其相应的代码被动态地载入到内核中呢?Linux提供了这样的一种机制,这样的机制被称为模块(Module).模块具有这样的特点. 模