2012/6/20 Jeff Haran <jharan@bytemobile.com>
** **
** **
*From:* 王哲 [mailto:wangzhe5004@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@bytemobile.com>****
****
****
*From:* kernelnewbies-bounces@kernelnewbies.org [mailto: kernelnewbies-bounces@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-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****