gpt4 book ai didi

c - MINIX 2 - 内核系统调用

转载 作者:太空宇宙 更新时间:2023-11-04 00:05:12 26 4
gpt4 key购买 nike

我想对内核进行 2 次系统调用(getlot 和 setlot)。他们必须在内核中的 struct proc 中读取和设置一些值。问题是什么?缺少什么?

在/usr/include/minix/callnr.h中我增加了NCALLS并添加了2个define

 #define NCALLS       80    /* number of system calls allowed */

#define SETLOT 78
#define GETLOT 79

在 usr/src/mm/main.c 中

PUBLIC void do_setlot()
{
message msg;
msg = mm_in;
_taskcall(SYSTASK, SYS_SETLOT), &msg);
}

PUBLIC void do_getlot()
{
message msg;
msg = mm_in;
_taskcall(SYSTASK, SYS_GETLOT, &msg);
}

在/usr/src/mm/proto.h 我添加了两个原型(prototype)

_PROTOTYPE( void do_setlot, (void));
_PROTOTYPE( void do_getlot, (void));

在/usr/src/mm/table.c中我在_PROTOTYPE的末尾添加了(int (*call_vec[NCALLS]), (void))

do_setlot,
do_getlot,

在/usr/src/fs/table.c中我在_PROTOTYPE的末尾添加了(int (*call_vec[]), (void) )

no_sys,
no_sys,

在/usr/include/minix/com.h 我创建了 2 个 SYS_xxx 定义

#   define SYS_SETLOT    22
# define SYS_GETLOT 23

在/usr/src/kernel/system.c中我写了

FORWARD _PROTOTYPE( int do_procsetlot, (message *m_ptr) );
FORWARD _PROTOTYPE( int do_procgetlot, (message *m_ptr) );

然后在PUBLIC void sys_task()中加入SYS_xxx切换

case SYS_SETLOT:    r = do_procsetlot(&m);  break;
case SYS_GETLOT: r = do_procgetlot(&m); break;

在底部我写了 2 个定义

PRIVATE int do_procsetlot(m_ptr)
register message *m_ptr;
{
pid_t prid;
int i;
int tickets;
prid = m_ptr->m1_i1;
tickets = m_ptr->m1_i2;

if(tickets > LOT_MAX)
return EINVAL;
if(tickets < LOT_MIN)
return EINVAL;
for(i = 0 ; i <NR_PROCS; i++)
{
if(proc[i].p_pid == prid)
{
proc[i].tickets_number = tickets;
return 0;
}
{
return EINVAL;
}


PRIVATE int do_procgetlot(m_ptr)
register message *m_ptr;
{
int i;
pid_t prid;
prid = m_ptr->m1_i1;

for(i = 0 ; i< NR_PROCS; i++)
{
if(proc[i].p_pid == prid)
return proc[i].tickets_number;
}
return EINVAL;
}

最后在 make hdboot 之后我得到了错误:

exec cc -c -I/usr/include main.c
exec cc -c -I/usr/include proc.c
exec cc -c -I/usr/include system.c
"system.c", line 1260: static not expected
make in /usr/src/kernel: Exit code 1

1260行是

PRIVATE int do_procgetlot(m_ptr)

最佳答案

我知道这条消息已经有好几年了,但是...

do_procsetlot 底部有一个语法错误:

  {
return EINVAL;
}

...应该是:

  }
return EINVAL;
}

我希望你在 2014 年的某个时候自己想通了!

顺便说一句,Minix 2 编译器完全支持 ANSI C,因此您不需要所有的 K&Risms。

关于c - MINIX 2 - 内核系统调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26941283/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com