RE: A confusion about invoking my syscall

2012-06-20 Thread Jeff Haran


From: 王哲 [mailto:wangzhe5...@gmail.com]
Sent: Wednesday, June 20, 2012 1:16 AM
To: Jeff Haran
Cc: kernelnewbies
Subject: Re: A confusion about invoking my syscall


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


From: 王哲 [mailto:wangzhe5...@gmail.com<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 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 
   #include 
   #include 
   #include 



   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 
#include 
#include 
#include 



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.

My sources contain no reference to SYS_mysyscall nor __NR_mysyscall, so I 
assume you’ve added them to the Linux include files that you built your module 
from.

User space programs like your main() program above generally aren’t going to 
include Linux source tree include files. When you include  from a 
user space program in a typical development environment, the compiler is by 
default going to look for syscall.h in /usr/include, not in the Linux source 
tree where presumably you’ve made your modifications. Of course you can always 
tell the compiler to look there using the -I command line option to gcc, if you 
want to. The usual practice however is to keep kernel code and user code 
include files completely separate. That means some duplication of effort, like 
having to define SYS_mysyscall in two different places, but that’s the usual 
practice because most people aren’t building kernels and thus haven’t installed 
the kernel source include files.

Jeff Haran


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


Re: A confusion about invoking my syscall

2012-06-20 Thread 王哲
2012/6/20 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 
>
>  
>
>  
>
> *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
> 
>
>#include 
>#include 
>#include 
>
>
>
>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 
> #include 
> #include 
> #include 
>
>
>
> 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 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 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 
   #include 
   #include 
   #include 



   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 
#include 
#include 
#include 



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-19 Thread Matthias Brugger
On 06/19/2012 06:32 AM, 王哲 wrote:
>
>
> 2012/6/19 Jeff Haran mailto: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 
> #include 
> #include 
> #include 
>
>
>
> 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 
> #include 
> #include 
> #include 
>
>
>
> 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 Baoquan He
On Tue, Jun 19, 2012 at 12:32 PM, 王哲  wrote:

>
>
> 2012/6/19 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
>> 
>>
>>#include 
>>#include 
>>#include 
>>
>>
>>
>>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 
>> #include 
>> #include 
>> #include 
>>
>>
>>
>> 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-18 Thread 王哲
2012/6/19 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
> 
>
>#include 
>#include 
>#include 
>
>
>
>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 
> #include 
> #include 
> #include 
>
>
>
> 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


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 
   #include 
   #include 
   #include 



   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 
#include 
#include 
#include 



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