ºìÁªLinuxÃÅ»§
Linux°ïÖú

LinuxÄÚºËÄ£¿éºÍÇý¶¯µÄ±àд¹ý³Ì

·¢²¼Ê±¼ä:2007-09-01 00:01:36À´Ô´:ºìÁª×÷Õß:History
¡¡¡¡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;

}
ÎÄÕÂÆÀÂÛ

¹²ÓÐ 0 ÌõÆÀÂÛ