|
我在include/linux文件夹中写了个evnt.h头文件,并包含了一切需要的include,声明了一个结构struct Event;
在kernel文件夹中写了一个event.c文件,,声明了一个结构静态常量static struct Event eventArray[MAX_EVENTS]; /*define MAX_EVENTS 32*/
并声明了一个void evnt_init()初始化函数将数组中的64个元素初始化;
然后在init文件夹的main.c文件中的asmlinkage void __init start_kernel(void)函数添加了对evnt_init()的调用。
编译内核并重新引导没问题。
我能肯定evnt_init在系统启动时被调用了,但是我在自己添加的系统调用asmlinkage int sys_evntopen(int eventNum)中调用eventArray数组时,发现当调用evntopen(0)时,老是返回-1,估计就是eventArray[MAX_EVENTS]的初始化不正确,改了很多都不知道原因。有那位大牛人能帮我解决这个问题吗?小弟在此不胜感激。
各源码部分如下:
event.c
static struct Event eventArray[MAX_EVENTS]; /* The event array */
void evnt_init(void) {
int i;
for(i = 0; i<MAX_EVENTS; i++) {
eventArray.ownerPid = -1;
eventArray.queue = NULL;
eventArray.numBlocked = 0;
eventArray.usageCount = 0;
}
}
asmlinkage int sys_evntopen(int eventNum)
{
int i;
if(eventNum == 0) {
/* Look for an available slot */
for(i=0; i < MAX_EVENTS; i++) {
if (eventArray.ownerPid == -1) {
eventArray.ownerPid = current->pid;
eventArray.usageCount = 1;
return i;
}
}
return -1; /* No events available */
}
eventArray[eventNum].usageCount++;
return eventNum;
}
event.h
#define MAX_NAME_LEN 64
#define MAX_EVENTS 32
struct Event {
int ownerPid;
struct wait_queue *queue;
int numBlocked;
int usageCount;
}; |
|