On 21 October 2012 21:28,  <[email protected]> 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
[email protected]
http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies

Reply via email to