hi, intel processors runs in 4 privilage mode,kernel runs in highest privilage mode ,You are in user mode so the segmenation hardware loaded the data and code segment descriptor with user data and user code segment,and you are trying to access the kernel data structure from user space which is something you never reach, So for accessing the kernel data struture yr data segment must be set with kernel data segment,but then yr code segment is set to user code segment, so processor will again generate exceptions as your user space code trying to access kernel space code, so better way is to do it in kernel modules which is something like dynamically loaded extensions to kernel code, where you can directly access the member of task_struct structure, but genrally the work should get done by using the exported funtions by kernel u get them in /proc/ksyms, more information about kernel programming you will get on web, and ofcourse the bible for every kernel programmer "linux device drivers" by rubini is always there. Prasanna --- Alexander Nyberg <alexn@telia.com> wrote: > > Hi all, > > I'm trying to develop a C program that access to > > process descriptor information but I have had some > > problem with libraries. > > In particular, I've developed a program like this: > > > > #include <linux/sched.h> > > > > int main(void){ > > pid_t pid; > > .... > > task_struct process = find_task_by_pid(pid); > > ... > > } > > > > but the compiler can't find get_task_by_pid > function, > > while this is a function declared in > > include/linux/sched.h. > > What's wrong? > > The problem is that the function get_task_by_pid() > lives in the kernel, > and you cannot call arbitrary functions in the > kernel (think of what > that would mean to security and isolation). The > functions you can access > from user space are system calls. > > > Are there other methods to access process > descriptor > > pointer? > > If you need more than what is already available from > the task_struct you > would preferably add another system call to your > linux (there are other > ways too). > > Maybe something like: > sys_get_task_struct(pid_t pid, struct task_struct > __user *to) > { > task_struct *task = find_task_by_pid(pid); > copy_to_user(to, task, sizeof(struct task_struct)); > } > > Alex > > > -- > Kernelnewbies: Help each other learn about the Linux > kernel. > Archive: > http://mail.nl.linux.org/kernelnewbies/ > FAQ: http://kernelnewbies.org/faq/ > > __________________________________ Do you Yahoo!? Yahoo! Mail - Helps protect you from nasty viruses. http://promotions.yahoo.com/new_mail -- Kernelnewbies: Help each other learn about the Linux kernel. Archive: http://mail.nl.linux.org/kernelnewbies/ FAQ: http://kernelnewbies.org/faq/