![](/img/trans.png)
[英]How to compile the directory /usr/src/kernel/system in MINIX 3?
[英]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.