A confusion about invoking my syscall

王哲 wangzhe5004 at gmail.com
Wed Jun 20 04:15:41 EDT 2012


2012/6/20 Jeff Haran <jharan at bytemobile.com>

>  ** **
>
> ** **
>
> *From:* 王哲 [mailto:wangzhe5004 at 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 <jharan at bytemobile.com>****
>
>  ****
>
>  ****
>
> *From:* kernelnewbies-bounces at kernelnewbies.org [mailto:
> kernelnewbies-bounces at 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 at wanny-C-Notebook-XXXX:~/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****
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.kernelnewbies.org/pipermail/kernelnewbies/attachments/20120620/4ad9e055/attachment-0001.html 


More information about the Kernelnewbies mailing list