linux 内核模块 和 驱动程序的编写(1)

原创 2001年07月06日 07:58:00

linux 内核模块 驱动程序的编写(1)

作者: sunmoon

<http://os.silversand.net>

linux内核是一个整体是结构.因此向内核添加任何东西.或者删除某些功能 ,都十分困难.为了解决这个问题.引入了内核机制.从而可以动态的想内核中添加或者删除模块.

模块不被编译在内核中,因而控制了内核的大小.然而模块一旦被插入内核,他就和内核其他部分一样.这样一来就会曾家一部分系统开销.同时,如果模块出现问题.,也许会带来系统的崩溃.

1.1模块的实现机制:

启动时,由函数 void inti_modules() 来初始化模块,.因为启动事很多时候没有模块.这个函数往往把内核自身当作一个虚模块.

如由系统需要,则调用一系列以sys 开头的函数,对模块进行操作. :sys_creat_modules(),sys_inti_modules() ,sys_deldte_modules()等等.

这里会用到一些模块的数据就结构,/usr/scr/linux/include/linux/module.h ,有兴趣的朋友可以找出来一看

块的加入有两种方法:一是手动加入::insmod modulename.另一种是根据需要,动态的加载模块.如你执行命令: $mount -t msdos /dev/hdd /mnt/d .系统便自动加载 FAT模块,以支持MSDOS的文件系统.

1.2 模块编程

写一个模块,必须有一定的多进程编程基础.因为你变得程序不是以一个独立的程序的来运行的.另外,因为,模块需要在内核模式下运行,会遇到在内和空间和用户空间数据交换的问题.一般的数据复制函数无法完成这一个过程.因此系统已入了一些特殊的函数以用来完成内核空间和用户空间数据的交换.

这些函数有:void put _user (type valude,type *u_addr)

memcpy_tofs()

等等,有兴趣的朋友可以仔细的看看所有的函数,以及他们的用法.需要说明的是.模块编程河内核的版本有很大的关系.如果版本不通可能造成,内核模块不能编译,或者.在运行这个模块时,出现不可测结果.:系统崩溃等.

明白了这些以后.你就可以尝试着编写内核模块了.对于每一个内核模块来说.必定包含两个函数

int init_module() 这个函数在插入内核时启动,在内核中注册一定的功能函数,或者用他的代码代替内和中某些函数的内容(估计这些函数是空的).因此,内和可以安全的卸载.(个人猜测)

int cleanup_module() 当内核模块谢载时,调用.将模块从内核中清除.

同其他的程序设计教程一样 ,我们给出一个hello world 的例子

/*hello.c a module programm*/

/* the program runing under kernel mod and it is a module*/

#include" linux/kernerl.h"

#include"llinux/module.h"

/* pross the CONFIG_MODVERSIONS*/

#if CONFIG_MODVERSIONS==1

#define MODVERSIONS

#include""linux/modversions.h"

#end if

 

/* the init function*/

int init_module()

{

printk(" hello world !/n');

printd(" I have runing in a kerner mod@!!/n");

return 1;

}

/* the distory function*/

int cleanup_module()

{

printk(" I will shut down myself in kernerl mod /n)";

retutn 0;

}

这样一个例子就完成了.我们也写一个makefile 的例子,以适于我们在大程序重的应用.一下是makfile 文件的内容

# a makefile for a module

CC=gcc

MODCFLAGS:= -Wall _DMODULE -D_KERNEL_ -Dlinux

hello.o hello.c /usr/inculde?linux/version.h

CC $(MODCFLAGS) 0c hello.c

echo the module is complie completely

然后你运行make 命令 得到hello.o 这个模块.运行

$insmod hello.o

hello world!

I will shut down myself in kernerl mod

$lsmod

hello (unused)

….

$remmod

I will shut down myself in kernerl mod

这样你的模块就可以随意的插入和删除了.

Linux之使用内核模块增加一个系统调用

使用内核模块的方式添加系统调用 1,为什么? 编译内核的方式费时间,一般的PC机都要两三个小时,而且不方便调试,一旦出现问题前面的工作都前功尽弃,所以我使用内核模块的方式添加系统调用。 2,怎...
  • qq_26811393
  • qq_26811393
  • 2016年03月01日 10:22
  • 448

内核模块的基本编写以及Makefile的编写

前面讲了内核模块怎么安装和卸载,那么现在就正式讲解一下内核模块怎么编写。 以一个在内核中打印出”hello world”到终端的例子讲解。 1、  首先要写模块加载时的入口函数和模块卸载时的入口函...
  • yby19870627
  • yby19870627
  • 2012年03月16日 13:13
  • 5243

Linux内核模块的编写方法和技巧

内核模块可以在不重新编译内核的情况下添加到内核代码中运行,其可以动态加载和卸载,因此可以根据需要将内核某些功能独立出来作为模块,而不是编译到内核中,这样可以减少内核大小,并且可以按照实际需求选择裁剪或...
  • jasonchen_gbd
  • jasonchen_gbd
  • 2015年04月12日 12:44
  • 1700

用内核模块的方式为系统添加一个系统调用

今天,利用内核模块的方式向系统添加了一个内核模块。在make后,我开始sudo insmod hello.ko完成之后。老是出现killed,在lsmod后,发现hello这个模块已经加载上去,但是测...
  • T_IS_BEHINGD_T
  • T_IS_BEHINGD_T
  • 2016年12月03日 23:25
  • 634

第一个linux内核模块的编写

最近, 感觉自己应该学一下linux的东西了, 于是,na
  • zaijzhgh
  • zaijzhgh
  • 2014年06月10日 22:52
  • 4778

【Linux开发】编写属于你的第一个Linux内核模块

曾经多少次想要在内核游荡?曾经多少次茫然不知方向?你不要再对着它迷惘,让我们指引你走向前方…… 内核编程常常看起来像是黑魔法,而在亚瑟 C 克拉克的眼中,它八成就是了。Linux内核和它的用户空...
  • LG1259156776
  • LG1259156776
  • 2016年05月15日 20:54
  • 2169

linux内核模块和驱动程序的编写

linux中的大部分驱动程序,是以模块的形式编写的.这些驱动程序源码可以修改到内核中,也可以把他们编译成模块形势,在需要的时候动态加载.一个典型的驱动程序,大体上可以分为这么几个部分:1、注册设备在系...
  • luixing67
  • luixing67
  • 2009年10月16日 09:43
  • 366

Linux 内核模块和驱动程序的详细编写

     linux内核是一个整体是结构。因此向内核添加任何东西。或者删除某些功能 ,都十分困难。为了解决这个问题。引入了内核机制。从而可以动态的想内核中添加或者删除模块。模块不被编译在内核中,因而控...
  • menuconfig
  • menuconfig
  • 2007年08月24日 15:41
  • 649

Linux内核模块编程-HelloWorld

HelloWorld内核开始断断续续学习内核,大概半年了,多少开始对内核有点感悟了,但是对于这个庞然大物我显得很渺小,在枯燥的内核源码之中似乎没有一点点成功的喜悦,因此我选择学习内核模块编程,通过编写...
  • zhangyifei216
  • zhangyifei216
  • 2015年11月07日 17:00
  • 2347

编写一个简单的内核模块程序Hello World!

一、Linux内核模块基本原理Linux 内核模块(LKM)是一些在启动的操作系统内核需要时可以载入内核执行的代码块,不需要时由操作系统卸载。它们扩展了操作系统内核功能却不需要重新编译内核、启动系统。...
  • sh21_
  • sh21_
  • 2017年03月09日 16:47
  • 3027
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:linux 内核模块 和 驱动程序的编写(1)
举报原因:
原因补充:

(最多只允许输入30个字)