On 21 October 2012 21:28, <rgonzale@xxxxxxxxxxxxxxxx> wrote: > I'm trying to implement my own system call on Linux kernel 2.6.37.3 using this guide. > > http://enzam.wordpress.com/2011/03/2...nel-ubuntu-os/ > > Here's the code that I have for kernel/mysystemcalls.c > It just takes an int for an argument and then spits out the PIDs for the process that is running on that CPU. > Code: > > #include<linux/linkage.h> > #include<linux/cpumask.h> > asmlinkage long sys_current_pid(int i) { > struct rq *rq; > int num_cpu; > num_cpu = num_online_cpus(); > if(i <= 0 || i > num_cpu) > return -1; > > rq = cpu_rq(i); > if(rq->curr != NULL) > return rq->curr->pid; > else > return -1; > } > > But on kernel compilation I get this. > Code: > > kernel/mysystemcalls.c: In function 'sys_current_pid': > kernel/mysystemcalls.c:12: error: implicit declaration of function 'cpu_rq' > kernel/mysystemcalls.c:12: warning: assignment makes pointer from integer without a cast > kernel/mysystemcalls.c:13: error: dereferencing pointer to incomplete type > kernel/mysystemcalls.c:14: error: dereferencing pointer to incomplete type > make[1]: *** [kernel/mysystemcalls.o] Error 1 > make[1]: *** Waiting for unfinished jobs.... > > The definition for cpu_rq() is in kernel/sched.c. sched.c contains the implementation, the definition is in sched/sched.h, you should #include that header. > Here's the pertinent piece of Makefile in kernel/Makefile > Code: > > # > # Makefile for the linux kernel. > # > > obj-y = sched.o fork.o exec_domain.o panic.o printk.o \ > cpu.o exit.o itimer.o time.o softirq.o resource.o \ > sysctl.o sysctl_binary.o capability.o ptrace.o timer.o user.o \ > signal.o sys.o kmod.o workqueue.o pid.o \ > rcupdate.o extable.o params.o posix-timers.o \ > kthread.o wait.o kfifo.o sys_ni.o posix-cpu-timers.o mutex.o \ > hrtimer.o rwsem.o nsproxy.o srcu.o semaphore.o \ > notifier.o ksysfs.o pm_qos_params.o sched_clock.o cred.o \ > async.o range.o jump_label.o > obj-y += mysystemcalls.o > > I would think that since sched.o(the first c file that gets compiled) has the definition for the cpu_rq() then mysystemcalls.c should be able to see that function. What am I missing? > You don't have a *link* error. It is not that the linker can't find cpu_rq(). It is the compiler that does not understand the cpu_rq() definition. Try to include the header. Cheers, -Filipe _______________________________________________ Kernelnewbies mailing list Kernelnewbies@xxxxxxxxxxxxxxxxx http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies