학 구동 모듈 부터

일반적인 Makefile 템 플 릿
ifeq ($(KERNELRELEASE),)

#KERNELDIR ?= /home/lht/kernel2.6/linux-2.6.14

KERNELDIR ?= /lib/modules/$(shell uname -r)/build  
PWD := $(shell pwd)

modules:
	$(MAKE) -C $(KERNELDIR) M=$(PWD) modules

modules_install:
	$(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install

clean:
	rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions

.PHONY: modules modules_install clean

else
    obj-m := hello.o
endif

간단 한 모듈
#include <linux/module.h>
#include <linux/kernel.h>

MODULE_LICENSE ("GPL");

int init_module (void)
{
  printk (KERN_INFO "Hello world
"); return 0; } void cleanup_module (void) { printk (KERN_INFO "Goodbye world
");

2. 표준 모듈
파라미터 학습
proc 의 조작
ioctl
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>

MODULE_LICENSE ("GPL");

static int __init hello_2_init (void)
{
	printk (KERN_INFO "Hello world
"); return 0; } static void __exit hello_2_exit (void) { printk (KERN_INFO "Goodbye world
"); } module_init (hello_2_init); mo

테스트 프로그램:
#define DRIVER_AUTHOR "Foobar"
#define DRIVER_DESC   "A sample driver"

MODULE_LICENSE ("GPL");
MODULE_AUTHOR (DRIVER_AUTHOR);
MODULE_DESCRIPTION (DRIVER_DESC);
MODULE_SUPPORTED_DEVICE ("TestDevice");

static short int myshort = 1;
static int myint = 420;
static long int mylong = 9999;
static char *mystring = "blah";
static int array[2]= {-1, -1};
static int arr_argc = 0;

module_param (myshort, short, 0000);
MODULE_PARM_DESC (myshort, "A short integer");

module_param (myint, int, 0000); 
MODULE_PARM_DESC (myint, "An integer");

module_param (mylong, long, 0000); 
MODULE_PARM_DESC (mylong, "A long integer");

module_param (mystring, charp, 0000);
MODULE_PARM_DESC (mystring, "A character string");

module_param_array (array, int, &arr_argc, 0000);
//module_param_array (array, int, arr_argc, 0000); //for kernel<2.6.10
MODULE_PARM_DESC (array, "An array of integers");

static int __init hello_2_init (void)
{
	int i;

	printk (KERN_INFO "myshort is a short integer: %hd
", myshort); printk (KERN_INFO "myint is an integer: %d
", myint); printk (KERN_INFO "mylong is a long integer: %ld
", mylong); printk (KERN_INFO "mystring is a string: %s

", mystring); for (i=0; i<arr_argc; i++) printk (KERN_INFO "array[%d] = %d
",i, array[i]); printk (KERN_INFO "Got %d arguments in array
", arr_argc); return 0; } static void __exit hello_2_exit (void) { printk (KERN_INFO "hello driver cleaned up
"); } module_init (hello_2_init); module_exit (hello_2_exit);

좋은 웹페이지 즐겨찾기