Thread (11 messages) 11 messages, 4 authors, 2012-04-13

[RFC]Something wrong with my module

From: j.neuschaefer@gmx.net (Jonathan Neuschäfer)
Date: 2012-04-12 14:33:55

On Thu, Apr 12, 2012 at 09:52:02PM +0800, harryxiyou wrote:
On Thu, Apr 12, 2012 at 9:03 PM, Jonathan Neusch?fer
[off-list ref] wrote:

Hi Jonathan,
quoted
On Thu, Apr 12, 2012 at 06:16:56PM +0800, harryxiyou wrote:
quoted
Hi greg,
...
quoted
quoted
hw2.c

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/sched.h>
#include <linux/list.h>
#include <linux/slab.h>

struct pcb {
? ? ? int pid;
? ? ? int state;
? ? ? int flag;
? ? ? char *comm;
? ? ? struct list_head tasks;
};
[...]

(from print_pid:)
quoted
quoted
? ? ? struct task_struct *p = NULL;
[...]
quoted
quoted
? ? ? ? ? ? ? printk("pid: %d, state: %ld, comm: %s\n", p->pid, p->state, p->comm);
Hmmm.., i just want to give a simplest task_struct, which is my pcb structure.
Of course, it is bogus but it is now wrong for inserting. It can not
print my fields
correctly. (I run this module after i take away the rm_task function)

Some wrong logs like this:
[...]
[ 1515.055481] pid: 0, state: 1, comm:
[ 1515.055483] the number of process is 145

I give the pid 8, state 8, and comm "jiawei" in my module. But it can
not print correctly. Maybe kernel can tell my bogus one,right?
This has to do with the way accessing struct fields works in C:
For each struct each field name is translated by the compiler into an
offset which is used to compute the address of a field given the struct's
address. When you access the pid field of a struct task_struct the offset
will be at least around 20 * sizeof(int), which is an invalid offset to
your struct pcb, where the offsets are (most of the time):
	pid: 0
	state: sizeof(int)
	flag: 2 * sizeof(int)
	comm: 3 * sizeof(int)
	tasks: 3 * sizeof(int) + sizeof(char *)
(You get (an approximation of) the offset of a field by adding the size
 of the previous field (the compiler also adds some padding - see
 Documentation/unaligned-memory-access.txt in the kernel tree and
 http://en.wikipedia.org/wiki/Data_padding#Data_structure_padding))

Thanks,
	Jonathan Neusch?fer
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help