Hi, Fuxin Zhang ======= 2003-09-16 11:22:00 WROTE:======= >I am not sure why you send a generic kernel problem to linux/mips list. Oh~~~Sorry ,Sorry ,I have to say sorry sorry agian and again! My purpose is to port my kernel module to mips-linux and I have the crosse-compile environment.So generally, if it (kernle module) can be ok in my linux(nor mips),it also do not have any troubles when I port it to the mips-linux.I have test it before.(Of course ,only with some simple kernle modules) . >As to your problem, probably it is caused by some incompatible changes >between different kernel versions. Many kernel related codes are highly >version depended. Check the datastructs, add -Wall to compile and check "-Wall" exsits before and following is part of my original Makefile: -------------------------------------------------------------- WARN := -W -Wall -Wstrict-prototypes -Wmissing-prototypes INCLUDE := -isystem /lib/modules/`uname -r`/build/include CFLAGS := -O2 -DMODULE -D__KERNEL__ ${WARN} ${INCLUDE} CC := gcc OBJS := ${patsubst %.c, %.o, ${wildcard *.c}} all: ${OBJS} -------------------------------------------------------------- >for any warnings. BTW, I don't the method you used to cleanup is safe, >there maybe a task queued but not executed at the time you >'rmmod',doesn't it? Yes ,in http://www.faqs.org/docs/kernel/x1145.html#AEN1201 , it mentions the situation as you said.And just to overcoming it ,it use the sleep_on().But as you see, now it can not "rmmod" correctly and my linux will broke. As a newbie to kernel module ,I am not sure why and not know how to scheduale a function to be called on every timer interrupt or every seconds in kernle module. Eagering your help! >>interrupt > >广星 wrote: > >>Hi,everyone! >> >> I have written a simple kernel module following the example in "Chapter 11. >>Scheduling Tasks" of <<The Linux Kernel Module Programming Guide>> >>(http://www.faqs.org/docs/kernel/x1145.html#AEN1201). >> Because I only want to scheduale a function to be called on every timer >>interrupt,I have simplified the example in the following as you can see. >> It can be compiled ok, and it can be "insmod" correctly.But when I try >> to "rmmod" ,sometimes my LINUX freeze and somtimes it will reboot automatically. >> My linux version is 2.4.18-3. >> And I have read the "Chapter 11.Scheduling Tasks" of <<The Linux Kernel Module >> Programming Guide>> ,I think it the combination of tq_timer and sleep_on() arose the >> fatal error. But I do not know why and how to conquer it. >> >> Anyone can tell why? And are there any good others methods to implement schedualing >> a function to be called on every timer interrupt or on every second? >> >> Eagering your help and thank you in advance! >> >> >> >> /* sched.c - scheduale a function to be called on every timer interrupt. >> * >> * Copyright (C) 2001 by Peter Jay Salzman >> */ >> >>/* The necessary header files */ >> >>/* Standard in kernel modules */ >>#include <linux/kernel.h> /* We're doing kernel work */ >>#include <linux/module.h> /* Specifically, a module */ >> >>/* Deal with CONFIG_MODVERSIONS */ >>/* >>#if CONFIG_MODVERSIONS==1 >>#define MODVERSIONS >>#include <linux/modversions.h> >>#endif >>*/ >>/* Necessary because we use the proc fs */ >>#include <linux/proc_fs.h> >>#include <linux/interrupt.h> >> >>/* We scheduale tasks here */ >>#include <linux/tqueue.h> >> >>/* We also need the ability to put ourselves to sleep and wake up later */ >>#include <linux/sched.h> >> >>/* In 2.2.3 /usr/include/linux/version.h includes a macro for this, but >> * 2.0.35 doesn't - so I add it here if necessary. >> */ >>#ifndef KERNEL_VERSION >>#define KERNEL_VERSION(a,b,c) (((a)<<16)+((b)<<8)+(c)) >>#endif >> >>/*Basic Info. of this module >>*/ >>MODULE_LICENSE("GPL"); // Get rid of taint message by declaring code as GPL >>MODULE_DESCRIPTION("Just to test!"); // What does this module do? >> >>/* The number of times the timer interrupt has been called so far */ >>static int TimerIntrpt = 0; >> >>/* This is used by cleanup, to prevent the module from being unloaded while >> * intrpt_routine is still in the task queue >> */ >>static struct wait_queue *WaitQ = NULL; >> >>static void intrpt_routine(void *); >> >>/* The task queue structure for this task, from tqueue.h */ >>static struct tq_struct Task = { >> {NULL,NULL}, /* Next item in list - queue_task will do this for us */ >> 0, /* A flag meaning we haven't been inserted into a task >> * queue yet >> */ >> intrpt_routine, /* The function to run */ >> NULL, /* The void* parameter for that function */ >>}; >> >>/* This function will be called on every timer interrupt. Notice the void* >> * pointer - task functions can be used for more than one purpose, each time >> * getting a different parameter. >> */ >>static void intrpt_routine(void *irrelevant) >>{ >> /* Increment the counter */ >> TimerIntrpt++; >> //printk("<1>Ok,It is the time to do something!\n"); >> if (WaitQ != NULL){ >> wake_up(&WaitQ); >> return; >> } >> else { >> if ((TimerIntrpt1000)==0){ >> printk("<1>It is the time to do something!\n"); >> } >> queue_task(&Task, &tq_timer); >> } >> >>} >> >> >> >>/* Initialize the module - register the proc file */ >>int init_module() >>{ >> /* Put the task in the tq_timer task queue, so it will be executed at >> * next timer interrupt >> */ >> queue_task(&Task, &tq_timer); >> printk("<1>Insert It Ok\n"); >> return 0; >> >>} >> >>/* Cleanup */ >>void cleanup_module() >>{ >> printk("<1>Say 886\n"); >> sleep_on(&WaitQ); >>} >> >> >> >> >> >> 祝 >>健康 愉快 >> >> >> 广星 >> guangxing@ict.ac.cn >> 2003-09-16 >> >> >> >> >> >> >> >> = = = = = = = = = = = = = = = = = = = = Guangxing Zhang guangxing@ict.ac.cn 2003-09-16