Re: A confusion about invoking my syscall

2012-06-20 Thread 王哲
2012/6/20 Jeff Haran jha...@bytemobile.com

  ** **

 ** **

 *From:* 王哲 [mailto:wangzhe5...@gmail.com]
 *Sent:* Monday, June 18, 2012 9:32 PM
 *To:* Jeff Haran
 *Cc:* kernelnewbies
 *Subject:* Re: A confusion about invoking my syscall

 ** **

 ** **

 2012/6/19 Jeff Haran jha...@bytemobile.com

  

  

 *From:* kernelnewbies-boun...@kernelnewbies.org [mailto:
 kernelnewbies-boun...@kernelnewbies.org] *On Behalf Of *??
 *Sent:* Monday, June 18, 2012 6:40 PM
 *To:* kernelnewbies
 *Subject:* A confusion about invoking my syscall

  

 Hello everyone:

  I append a simple syscall in kernel. and the function is as
 follows:

   asmlinkage  long sys_mysyscall(long data)
  {
   printk(This is my syscall!\n);
   return data;
   }

 and i test it sucessfully in user space . and the test program:

#include
 linux/unistd.h

#include syscall.h
#include sys/types.h
#include stdio.h



int main(void)
{
long n = 0,m = 0,pid1,pid2;
n = syscall(345,190);// #define __NR_mysyscall  345
printf(n = %ld\n,n);
pid1 = syscall(SYS_getpid);  //getpid
printf(pid = %ld\n,pid1);
pid2 = syscall(20);  //getpid
printf(pid = %ld\n,pid2);
return 0;
   }
 and the result:
 n = 190
 pid = 4097
 pid = 4097

 but if the test program is:
 #include linux/unistd.h
 #include syscall.h
 #include sys/types.h
 #include stdio.h



 int main(void)
 {
  long n = 0,m = 0,pid1,pid2;
  n = syscall(345,190);// #define __NR_mysyscall  345
  printf(n = %ld\n,n);
  m = syscall(SYS_mysyscall,190);
  printf(m = %ld\n,m);
  pid1 = syscall(SYS_getpid);  //getpid
  printf(pid = %ld\n,pid1);
  pid2 = syscall(20);  //getpid
  printf(pid = %ld\n,pid2);
  return 0;
 }
 and the result:
 wanny@wanny-C-Notebook-:~/syscall/src$ gcc test1.c
 test1.c: In function ‘main’:
 test1.c:13:14: error: ‘SYS_mysyscall’ undeclared (first use in this
 function)
 test1.c:13:14: note: each undeclared identifier is reported only once for
 each function it appears in


 why i can't invoke my syscall with SYS_mysyscall?

 Thanks in advance!

 Because it appears you never defined the symbol SYS_mysyscall.

  I think so,but where shoud i defne the  symbol SYS_mysyscall ? 

 and where is the symbol SYS_getpid defined? 

 On my system /usr/include/bits/syscall.h, which is being included in your
 program because it includes syscall.h.

83 #define SYS_getpid __NR_getpid  ,so SYS_getpid is replaced
by __NR_getpid. and __NR_getpid was defined in the
kernel(arch/x86/include/asm/unistd_32.h). and my syscall was also defined
there.#define SYS_mysyscall __NR_mysyscall, i don't kown why it doesn't
works.



 

 Jeff Haran


___
Kernelnewbies mailing list
Kernelnewbies@kernelnewbies.org
http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies


Re: A confusion about invoking my syscall

2012-06-19 Thread Baoquan He
On Tue, Jun 19, 2012 at 12:32 PM, 王哲 wangzhe5...@gmail.com wrote:



 2012/6/19 Jeff Haran jha...@bytemobile.com

  ** **

 ** **

 *From:* kernelnewbies-boun...@kernelnewbies.org [mailto:
 kernelnewbies-boun...@kernelnewbies.org] *On Behalf Of *??
 *Sent:* Monday, June 18, 2012 6:40 PM
 *To:* kernelnewbies
 *Subject:* A confusion about invoking my syscall

 ** **

 Hello everyone:

  I append a simple syscall in kernel. and the function is as
 follows:

   asmlinkage  long sys_mysyscall(long data)
  {
   printk(This is my syscall!\n);
   return data;
   }

 and i test it sucessfully in user space . and the test program:

#include
 linux/unistd.h

#include syscall.h
#include sys/types.h
#include stdio.h



int main(void)
{
long n = 0,m = 0,pid1,pid2;
n = syscall(345,190);// #define __NR_mysyscall  345
printf(n = %ld\n,n);
pid1 = syscall(SYS_getpid);  //getpid
printf(pid = %ld\n,pid1);
pid2 = syscall(20);  //getpid
printf(pid = %ld\n,pid2);
return 0;
   }
 and the result:
 n = 190
 pid = 4097
 pid = 4097

 but if the test program is:
 #include linux/unistd.h
 #include syscall.h
 #include sys/types.h
 #include stdio.h



 int main(void)
 {
  long n = 0,m = 0,pid1,pid2;
  n = syscall(345,190);// #define __NR_mysyscall  345
  printf(n = %ld\n,n);
  m = syscall(SYS_mysyscall,190);
  printf(m = %ld\n,m);
  pid1 = syscall(SYS_getpid);  //getpid
  printf(pid = %ld\n,pid1);
  pid2 = syscall(20);  //getpid
  printf(pid = %ld\n,pid2);
  return 0;
 }
 and the result:
 wanny@wanny-C-Notebook-:~/syscall/src$ gcc test1.c
 test1.c: In function ‘main’:
 test1.c:13:14: error: ‘SYS_mysyscall’ undeclared (first use in this
 function)
 test1.c:13:14: note: each undeclared identifier is reported only once for
 each function it appears in


 why i can't invoke my syscall with SYS_mysyscall?

 Thanks in advance!

 Because it appears you never defined the symbol SYS_mysyscall.

 ** I think so,but where shoud i defne the  **symbol SYS_mysyscall ?

   and where is the symbol SYS_getpid defined?



 you can read LKD3 written by Robert Love which describes the process
clearly.



 Jeff Haran
   



 ___
 Kernelnewbies mailing list
 Kernelnewbies@kernelnewbies.org
 http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies


___
Kernelnewbies mailing list
Kernelnewbies@kernelnewbies.org
http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies


Re: A confusion about invoking my syscall

2012-06-19 Thread Matthias Brugger
On 06/19/2012 06:32 AM, 王哲 wrote:


 2012/6/19 Jeff Haran jha...@bytemobile.com mailto:jha...@bytemobile.com

 __ __

 __ __

 *From:*kernelnewbies-boun...@kernelnewbies.org
 mailto:kernelnewbies-boun...@kernelnewbies.org
 [mailto:kernelnewbies-boun...@kernelnewbies.org
 mailto:kernelnewbies-boun...@kernelnewbies.org] *On Behalf Of *??
 *Sent:* Monday, June 18, 2012 6:40 PM
 *To:* kernelnewbies
 *Subject:* A confusion about invoking my syscall

 __ __

 Hello everyone:

   I append a simple syscall in kernel. and the function is
 as follows:

asmlinkage  long sys_mysyscall(long data)
   {
printk(This is my syscall!\n);
return data;
}

 and i test it sucessfully in user space . and the test program:

 #include linux/unistd.h
 #include syscall.h
 #include sys/types.h
 #include stdio.h



 int main(void)
 {
 long n = 0,m = 0,pid1,pid2;
 n = syscall(345,190);// #define __NR_mysyscall  345
 printf(n = %ld\n,n);
 pid1 = syscall(SYS_getpid);  //getpid
 printf(pid = %ld\n,pid1);
 pid2 = syscall(20);  //getpid
 printf(pid = %ld\n,pid2);
 return 0;
}
 and the result:
 n = 190
 pid = 4097
 pid = 4097

 but if the test program is:
 #include linux/unistd.h
 #include syscall.h
 #include sys/types.h
 #include stdio.h



 int main(void)
 {
   long n = 0,m = 0,pid1,pid2;
   n = syscall(345,190);// #define __NR_mysyscall  345
   printf(n = %ld\n,n);
   m = syscall(SYS_mysyscall,190);
   printf(m = %ld\n,m);
   pid1 = syscall(SYS_getpid);  //getpid
   printf(pid = %ld\n,pid1);
   pid2 = syscall(20);  //getpid
   printf(pid = %ld\n,pid2);
   return 0;
 }
 and the result:
 wanny@wanny-C-Notebook-:~/syscall/src$ gcc test1.c
 test1.c: In function ‘main’:
 test1.c:13:14: error: ‘SYS_mysyscall’ undeclared (first use in this
 function)
 test1.c:13:14: note: each undeclared identifier is reported only
 once for each function it appears in


 why i can't invoke my syscall with SYS_mysyscall?

 Thanks in advance!

 Because it appears you never defined the symbol SYS_mysyscall.

 __ I think so,but where shoud i defne the __symbol SYS_mysyscall ?

and where is the symbol SYS_getpid defined?

Not sure, but I think the syscalls should be defined in syscall.h which 
is included by your program. I suppose that this file is part of libc, 
so there won't be your syscall definition in there.
The easiest way would be to define the syscall by yourself.

Remember that adding a syscall to the linux kernel is a bad idea.

Regards,
Matthias


 Jeff Haran
 




 ___
 Kernelnewbies mailing list
 Kernelnewbies@kernelnewbies.org
 http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies


___
Kernelnewbies mailing list
Kernelnewbies@kernelnewbies.org
http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies


RE: A confusion about invoking my syscall

2012-06-19 Thread Jeff Haran


From: 王哲 [mailto:wangzhe5...@gmail.com]
Sent: Monday, June 18, 2012 9:32 PM
To: Jeff Haran
Cc: kernelnewbies
Subject: Re: A confusion about invoking my syscall


2012/6/19 Jeff Haran jha...@bytemobile.commailto:jha...@bytemobile.com


From: 
kernelnewbies-boun...@kernelnewbies.orgmailto:kernelnewbies-boun...@kernelnewbies.org
 
[mailto:kernelnewbies-boun...@kernelnewbies.orgmailto:kernelnewbies-boun...@kernelnewbies.org]
 On Behalf Of ??
Sent: Monday, June 18, 2012 6:40 PM
To: kernelnewbies
Subject: A confusion about invoking my syscall

Hello everyone:

 I append a simple syscall in kernel. and the function is as follows:

  asmlinkage  long sys_mysyscall(long data)
 {
  printk(This is my syscall!\n);
  return data;
  }

and i test it sucessfully in user space . and the test program:

   #include linux/unistd.h
   #include syscall.h
   #include sys/types.h
   #include stdio.h



   int main(void)
   {
   long n = 0,m = 0,pid1,pid2;
   n = syscall(345,190);// #define __NR_mysyscall  345
   printf(n = %ld\n,n);
   pid1 = syscall(SYS_getpid);  //getpid
   printf(pid = %ld\n,pid1);
   pid2 = syscall(20);  //getpid
   printf(pid = %ld\n,pid2);
   return 0;
  }
and the result:
n = 190
pid = 4097
pid = 4097

but if the test program is:
#include linux/unistd.h
#include syscall.h
#include sys/types.h
#include stdio.h



int main(void)
{
 long n = 0,m = 0,pid1,pid2;
 n = syscall(345,190);// #define __NR_mysyscall  345
 printf(n = %ld\n,n);
 m = syscall(SYS_mysyscall,190);
 printf(m = %ld\n,m);
 pid1 = syscall(SYS_getpid);  //getpid
 printf(pid = %ld\n,pid1);
 pid2 = syscall(20);  //getpid
 printf(pid = %ld\n,pid2);
 return 0;
}
and the result:
wanny@wanny-C-Notebook-:~/syscall/src$ gcc test1.c
test1.c: In function ‘main’:
test1.c:13:14: error: ‘SYS_mysyscall’ undeclared (first use in this function)
test1.c:13:14: note: each undeclared identifier is reported only once for each 
function it appears in


why i can't invoke my syscall with SYS_mysyscall?

Thanks in advance!
Because it appears you never defined the symbol SYS_mysyscall.
 I think so,but where shoud i defne the  symbol SYS_mysyscall ?
  and where is the symbol SYS_getpid defined?
On my system /usr/include/bits/syscall.h, which is being included in your 
program because it includes syscall.h.
Jeff Haran

___
Kernelnewbies mailing list
Kernelnewbies@kernelnewbies.org
http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies


RE: A confusion about invoking my syscall

2012-06-18 Thread Jeff Haran


From: kernelnewbies-boun...@kernelnewbies.org 
[mailto:kernelnewbies-boun...@kernelnewbies.org] On Behalf Of ??
Sent: Monday, June 18, 2012 6:40 PM
To: kernelnewbies
Subject: A confusion about invoking my syscall

Hello everyone:

 I append a simple syscall in kernel. and the function is as follows:

  asmlinkage  long sys_mysyscall(long data)
 {
  printk(This is my syscall!\n);
  return data;
  }

and i test it sucessfully in user space . and the test program:

   #include linux/unistd.h
   #include syscall.h
   #include sys/types.h
   #include stdio.h



   int main(void)
   {
   long n = 0,m = 0,pid1,pid2;
   n = syscall(345,190);// #define __NR_mysyscall  345
   printf(n = %ld\n,n);
   pid1 = syscall(SYS_getpid);  //getpid
   printf(pid = %ld\n,pid1);
   pid2 = syscall(20);  //getpid
   printf(pid = %ld\n,pid2);
   return 0;
  }
and the result:
n = 190
pid = 4097
pid = 4097

but if the test program is:
#include linux/unistd.h
#include syscall.h
#include sys/types.h
#include stdio.h



int main(void)
{
 long n = 0,m = 0,pid1,pid2;
 n = syscall(345,190);// #define __NR_mysyscall  345
 printf(n = %ld\n,n);
 m = syscall(SYS_mysyscall,190);
 printf(m = %ld\n,m);
 pid1 = syscall(SYS_getpid);  //getpid
 printf(pid = %ld\n,pid1);
 pid2 = syscall(20);  //getpid
 printf(pid = %ld\n,pid2);
 return 0;
}
and the result:
wanny@wanny-C-Notebook-:~/syscall/src$ gcc test1.c
test1.c: In function ‘main’:
test1.c:13:14: error: ‘SYS_mysyscall’ undeclared (first use in this function)
test1.c:13:14: note: each undeclared identifier is reported only once for each 
function it appears in


why i can't invoke my syscall with SYS_mysyscall?

Thanks in advance!

Because it appears you never defined the symbol SYS_mysyscall.

Jeff Haran


___
Kernelnewbies mailing list
Kernelnewbies@kernelnewbies.org
http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies


Re: A confusion about invoking my syscall

2012-06-18 Thread 王哲
2012/6/19 Jeff Haran jha...@bytemobile.com

  ** **

 ** **

 *From:* kernelnewbies-boun...@kernelnewbies.org [mailto:
 kernelnewbies-boun...@kernelnewbies.org] *On Behalf Of *??
 *Sent:* Monday, June 18, 2012 6:40 PM
 *To:* kernelnewbies
 *Subject:* A confusion about invoking my syscall

 ** **

 Hello everyone:

  I append a simple syscall in kernel. and the function is as
 follows:

   asmlinkage  long sys_mysyscall(long data)
  {
   printk(This is my syscall!\n);
   return data;
   }

 and i test it sucessfully in user space . and the test program:

#include
 linux/unistd.h

#include syscall.h
#include sys/types.h
#include stdio.h



int main(void)
{
long n = 0,m = 0,pid1,pid2;
n = syscall(345,190);// #define __NR_mysyscall  345
printf(n = %ld\n,n);
pid1 = syscall(SYS_getpid);  //getpid
printf(pid = %ld\n,pid1);
pid2 = syscall(20);  //getpid
printf(pid = %ld\n,pid2);
return 0;
   }
 and the result:
 n = 190
 pid = 4097
 pid = 4097

 but if the test program is:
 #include linux/unistd.h
 #include syscall.h
 #include sys/types.h
 #include stdio.h



 int main(void)
 {
  long n = 0,m = 0,pid1,pid2;
  n = syscall(345,190);// #define __NR_mysyscall  345
  printf(n = %ld\n,n);
  m = syscall(SYS_mysyscall,190);
  printf(m = %ld\n,m);
  pid1 = syscall(SYS_getpid);  //getpid
  printf(pid = %ld\n,pid1);
  pid2 = syscall(20);  //getpid
  printf(pid = %ld\n,pid2);
  return 0;
 }
 and the result:
 wanny@wanny-C-Notebook-:~/syscall/src$ gcc test1.c
 test1.c: In function ‘main’:
 test1.c:13:14: error: ‘SYS_mysyscall’ undeclared (first use in this
 function)
 test1.c:13:14: note: each undeclared identifier is reported only once for
 each function it appears in


 why i can't invoke my syscall with SYS_mysyscall?

 Thanks in advance!

 Because it appears you never defined the symbol SYS_mysyscall.

 ** I think so,but where shoud i defne the  **symbol SYS_mysyscall ?

  and where is the symbol SYS_getpid defined?





 Jeff Haran
  

___
Kernelnewbies mailing list
Kernelnewbies@kernelnewbies.org
http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies