¡¡¡¡LinuxÄÚºËÊÇÒ»¸öÕûÌåÊǽṹ£¬Òò´ËÏòÄÚºËÌí¼ÓÈκζ«Î÷£¬»òÕßɾ³ýijЩ¹¦ÄÜ£¬¶¼Ê®·ÖÀ§ÄÑ¡£ÎªÁ˽â¾öÕâ¸öÎÊÌâÒýÈëÁËÄں˻úÖÆ¡£´Ó¶ø¿ÉÒÔ¶¯Ì¬µÄÏëÄÚºËÖÐÌí¼Ó»òÕßɾ³ýÄ£¿é¡£
¡¡¡¡Ä£¿é²»±»±àÒëÔÚÄÚºËÖУ¬Òò¶ø¿ØÖÆÁËÄں˵ĴóС.È»¶øÄ£¿éÒ»µ©±»²åÈëÄںˣ¬Ëû¾ÍºÍÄÚºËÆäËû²¿·ÖÒ»Ñù.ÕâÑùÒ»À´¾Í»áÔø¼ÒÒ»²¿·Öϵͳ¿ªÏú¡£Í¬Ê±£¬Èç¹ûÄ£¿é³öÏÖÎÊÌ⣬ҲÐí»á´øÀ´ÏµÍ³µÄ±ÀÀ£¡£
¡¡¡¡Ä£¿éµÄʵÏÖ»úÖÆ:
¡¡¡¡Æô¶¯Ê±£¬Óɺ¯Êý 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µÄÎļþϵͳ¡£
¡¡¡¡Ä£¿é±à³Ì
¡¡¡¡Ð´Ò»¸öÄ£¿é£¬±ØÐëÓÐÒ»¶¨µÄ¶à½ø³Ì±à³Ì»ù´¡£¬ÒòΪÄã±äµÃ³ÌÐò²»ÊÇÒÔÒ»¸ö¶ÀÁ¢µÄ³ÌÐòµÄÀ´ÔËÐеġ£ÁíÍ⣬ÒòΪ£¬Ä£¿éÐèÒªÔÚÄÚºËģʽÏÂÔËÐУ¬»áÓöµ½ÔÚÄںͿռäºÍÓû§¿Õ¼äÊý¾Ý½»»»µÄÎÊÌâ.Ò»°ãµÄÊý¾Ý¸´Öƺ¯ÊýÎÞ·¨Íê³ÉÕâÒ»¸ö¹ý³Ì¡£Òò´ËϵͳÒÑÈëÁËһЩÌØÊâµÄº¯ÊýÒÔÓÃÀ´Íê³ÉÄں˿ռäºÍÓû§¿Õ¼äÊý¾ÝµÄ½»»»/
¡¡¡¡ÕâЩº¯ÊýÓÐ:void put _user (type valude£¬type *u_addr)
¡¡¡¡memcpy_tofs()
¡¡¡¡µÈµÈ£¬ÓÐÐËȤµÄÅóÓÑ¿ÉÒÔ×ÐϸµÄ¿´¿´ËùÓеĺ¯Êý£¬ÒÔ¼°ËûÃǵÄÓ÷¨.ÐèҪ˵Ã÷µÄÊÇ.Ä£¿é±à³ÌºÓÄں˵İ汾ÓкܴóµÄ¹Øϵ¡£Èç¹û°æ±¾²»Í¨¿ÉÄÜÔì³É£¬ÄÚºËÄ£¿é²»ÄܱàÒ룬»òÕß.ÔÚÔËÐÐÕâ¸öÄ£¿éʱ£¬³öÏÖ²»¿É²â½á¹û¡£Èç:ϵͳ±ÀÀ£µÈ¡£
¡¡¡¡Ã÷°×ÁËÕâЩÒÔºó£¬Äã¾Í¿ÉÒÔ³¢ÊÔ×űàдÄÚºËÄ£¿éÁË¡£¶ÔÓÚÿһ¸öÄÚºËÄ£¿éÀ´Ëµ£¬±Ø¶¨°üº¬Á½¸öº¯Êýint init_module() Õâ¸öº¯ÊýÔÚ²åÈëÄÚºËʱÆô¶¯£¬ÔÚÄÚºËÖÐ×¢²áÒ»¶¨µÄ¹¦Äܺ¯Êý£¬»òÕßÓÃËûµÄ´úÂë´úÌæÄÚºÍÖÐijЩº¯ÊýµÄÄÚÈÝ(¹À¼ÆÕâЩº¯ÊýÊÇ¿ÕµÄ)¡£Òò´Ë£¬ÄںͿÉÒÔ°²È«µÄжÔØ¡£
¡¡¡¡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ÖеĴ󲿷ÖÇý¶¯³ÌÐò£¬ÊÇÒÔÄ£¿éµÄÐÎʽ±àдµÄ£¬ÕâЩÇý¶¯³ÌÐòÔ´Âë¿ÉÒÔÐ޸ĵ½ÄÚºËÖУ¬Ò²¿ÉÒÔ°ÑËûÃDZàÒë³ÉÄ£¿éÐÎÊÆ£¬ÔÚÐèÒªµÄʱºò¶¯Ì¬¼ÓÔØ¡£
¡¡¡¡Ò»¸öµäÐ͵ÄÇý¶¯³ÌÐò£¬´óÌåÉÏ¿ÉÒÔ·ÖΪÕâô¼¸¸ö²¿·Ö:
¡¡¡¡1£®×¢²áÉ豸
¡¡¡¡ÔÚϵͳ³õÆô£¬»òÕßÄ£¿é¼ÓÔØʱºò£¬±ØÐ뽫É豸µÇ¼Çµ½ÏàÓ¦µÄÉ豸Êý×飬²¢·µ»ØÉ豸µÄÖ÷Çý¶¯ºÅ£¬ÀýÈç:¶Ô¿ìÉ豸À´Ëµµ÷Óà refister_blkdec()½«É豸Ìí¼Óµ½Êý×éblkdevÖУ¬²¢ÇÒ»ñµÃ¸ÃÉ豸ºÅ£¬²¢ÀûÓÃÕâЩÉ豸ºÅ¶Ô´ËÊý×é½øÐÐË÷Òý¡£¶ÔÓÚ×Ö·ûÇý¶¯É豸À´Ëµ£¬ÒªÊ¹Óà module_register_chrdev()À´»ñµÃ×£É豸µÄÇý¶¯ºÅ£¬È»ºó¶ÔÕâ¸öÉ豸µÄËùÓе÷Óö¼ÓÃÕâ¸öÉ豸ºÅÀ´ÊµÏÖ¡£
¡¡¡¡2£®¶¨Ò幦Äܺ¯Êý
¡¡¡¡¶ÔÓÚÿһ¸öÇý¶¯º¯ÊýÀ´Ëµ£¬¶¼ÓÐһЩºÍ´ËÉ豸ÃÜÇÐÏà¹ØµÄ¹¦Äܺ¯Êý£¬ÄÇ×î³£ÓõĿéÉ豸»òÕß×Ö·ûÉ豸À´Ëµ£¬¶¼´æÔÚ×ÅÖîÈç open() read() write() ioctrol()ÕâÒ»ÀàµÄ²Ù×÷¡£µ±ÏµÍ³ÉçÓÃÕâЩµ÷ÓÃʱ£¬½«×Ô¶¯µÄʹÓÃÇý¶¯º¯ÊýÖÐÌض¨µÄÄ£¿é£¬À´ÊµÏÖ¾ßÌåµÄ²Ù×÷¡£¶ø¶ÔÓÚÌض¨µÄÉ豸£¬ÉÏÃæµÄϵͳµ÷ÓöÔÓ¦µÄº¯ÊýÊÇÒ»¶¨µÄ¡£
¡¡¡¡Èç:ÔÚ¿éÇý¶¯É豸ÖÐ.µ±ÏµÍ³ÊÔͼ¶ÁÈ¡Õâ¸öÉ豸(¼´µ÷ÓÃread()ʱ)£¬¾Í»áÔËÐÐÇý¶¯³ÌÐòÖеÄblock_read() Õâ¸öº¯Êý¡£
¡¡¡¡´ò¿ªÐÂÉ豸ʱ»áµ÷ÓÃÕâ¸öÉ豸Çý¶¯³ÌÐòµÄdevice_open() Õâ¸öº¯Êý.
¡¡¡¡3£®Ð¶ÔØÄ£¿é
¡¡¡¡ÔÚ²»ÓÃÕâ¸öÉ豸ʱ£¬¿ÉÒÔ½«ËûжÔØ£¬Ö÷ÒªÊÇ´Ó/proc ÖÐÈ¡ÏûÕâ¸öÉ豸µÄÌØÊâÎļþ£¬¿ÉÓÃÌض¨µÄº¯ÊýʵÏÖ¡£
¡¡¡¡ÏÂÃæÎÒÃÇÁоÙÒ»¸ö×Ö·ûÉ豸Çý¶¯³ÌÐòµÄ¿ò¼Ü.À´ËµÃ÷Õâ¸ö¹ý³Ì.
/* a module of a character device */
/* some include files*/
#include"param.h"
#include"user.h"
#include"tty.h"
#include"dir.h"
#include¡±fs.h"
/* the include files modules need*/
#include"Linux/kernel.h"
#include"Linux/module.h"
#if CONFIG_MODBERSIONS==1
degine MODBERSIONS
#include" Linux.modversions.h"
#endif
#difine devicename mydevice
/* the init funcion*/
int init_module()
{
int tag=module_register_chrdev(0£¬mydevice£¬&Fops);
if (tag<0)
{
printk("the device init is erro!\n");
return 1;
}
return 0;
}
/*the funcion which the device will be used */
int device_open ()
{
¡¡.
}
int device_read ()
{
¡¡.
}
int device_write ()
{
¡¡.
}
int device_ioctl ()
{
¡¡.
}
¡¡
/* the deltter function of this module*/
int cleanup_module()
{
int re=module_unregister_chrdev(tag£¬mydevice);
if( re<0)
{
printk("erro unregister the module !!\n");
return 1;
}
return 0;
}