簡體   English   中英

MINIX 2-內核的syscall

[英]MINIX 2 - syscall to kernel

我想對內核(getlot和setlot)進行2次syscall。 他們必須在內核的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( 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) );

然后添加SYS_xxx以切換到PUBLIC void sys_task()

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

在底部我寫了兩個定義

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;
}

終於在使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。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM