[RFC]Something wrong with my module
flat view
From: harryxiyou <hidden>
Date: 2012-04-12 13:52:02
On Thu, Apr 12, 2012 at 9:03 PM, Jonathan Neusch?fer [off-list ref] wrote: Hi Jonathan,
On Thu, Apr 12, 2012 at 06:16:56PM +0800, harryxiyou wrote:quoted
Hi greg,
...
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; }; static int insert_task(struct task_struct *p) { ? ? ? struct pcb *pcb1 = NULL; ? ? ? pcb1 = (struct pcb *)kmalloc(sizeof(struct pcb), GFP_KERNEL); ? ? ? if (NULL == pcb1) { ? ? ? ? ? ? ? printk("<0> kmalloc failed!\n");If you don't return, you'll do an invalid memory access the next line.
Yup, you are right. I will correct it.
quoted
? ? ? } ? ? ? pcb1->state = 8; ? ? ? pcb1->flag = 8; ? ? ? pcb1->pid= 2; ? ? ? pcb1->comm = "jiawei"; ? ? ? list_add(&pcb1->tasks, &p->tasks);You add your pcb structure to a list of struct task_structs, this looks somewhat bogus.
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.054547] Search for insert task--------> [ 1515.054550] pid: 1, state: 1, comm: init [ 1515.054554] pid: 2, state: 1, comm: kthreadd [ 1515.054558] pid: 3, state: 1, comm: ksoftirqd/0 [ 1515.054561] pid: 4, state: 1, comm: migration/0 [ 1515.054564] pid: 5, state: 1, comm: watchdog/0 [ 1515.054568] pid: 6, state: 1, comm: events/0 [ 1515.054571] pid: 7, state: 1, comm: cpuset [ 1515.054575] pid: 8, state: 1, comm: khelper ... [ 1515.055011] pid: 2117, state: 1, comm: bash [ 1515.055014] pid: 2234, state: 1, comm: vim [ 1515.055017] pid: 2236, state: 1, comm: flush-8:0 [ 1515.055020] pid: 2370, state: 1, comm: su [ 1515.055023] pid: 2377, state: 1, comm: bash [ 1515.055027] pid: 2701, state: 0, comm: insmod [ 1515.055030] the number of process is 144 [ 1515.055032] show all tasks--------> [ 1515.055035] pid: 1, state: 1, comm: init [ 1515.055038] pid: 2, state: 1, comm: kthreadd [ 1515.055041] pid: 3, state: 1, comm: ksoftirqd/0 [ 1515.055044] pid: 4, state: 1, comm: migration/0 [ 1515.055047] pid: 5, state: 1, comm: watchdog/0 [ 1515.055051] pid: 6, state: 1, comm: events/0 [ 1515.055054] pid: 7, state: 1, comm: cpuset [ 1515.055057] pid: 8, state: 1, comm: khelper [ 1515.055060] pid: 9, state: 1, comm: netns [ 1515.055063] pid: 10, state: 1, comm: async/mgr [ 1515.055066] pid: 11, state: 1, comm: pm [ 1515.055069] pid: 12, state: 1, comm: sync_supers [ 1515.055072] pid: 13, state: 1, comm: bdi-default [ 1515.055075] pid: 14, state: 1, comm: kintegrityd/0 [ 1515.055078] pid: 15, state: 1, comm: kblockd/0 [ 1515.055081] pid: 16, state: 1, comm: ata_aux [ 1515.055084] pid: 17, state: 1, comm: ata_sff/0 [ 1515.055087] pid: 18, state: 1, comm: khubd [ 1515.055090] pid: 19, state: 1, comm: kseriod [ 1515.055093] pid: 20, state: 1, comm: kmmcd [ 1515.055096] pid: 22, state: 1, comm: khungtaskd ... [ 1515.055466] pid: 2234, state: 1, comm: vim [ 1515.055468] pid: 2236, state: 1, comm: flush-8:0 [ 1515.055472] pid: 2370, state: 1, comm: su [ 1515.055474] pid: 2377, state: 1, comm: bash [ 1515.055477] pid: 2701, state: 0, comm: insmod [ 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?
quoted
? ? ? return 0; } static int rm_task(struct task_struct *p){ ? ? ? struct task_struct *del = p; ? ? ? list_del(&p->tasks); // ? ?kfree(del); ? ? ? return 0; } #if 1 static int print_pid(void) {You do possibly destructive operations here, "print" doesn't quite imply that.quoted
? ? ? struct task_struct *task = NULL; ? ? ? struct task_struct *p = NULL; ? ? ? struct list_head *pos = NULL; ? ? ? int count = 0; ? ? ? printk("Search for insert task-------->\n"); ? ? ? task = &init_task; ? ? ? list_for_each(pos, &task->tasks) { ? ? ? ? ? ? ? p = list_entry(pos, struct task_struct, tasks); ? ? ? ? ? ? ? count++; ? ? ? ? ? ? ? if (0 == p->pid) { ? ? ? ? ? ? ? ? ? ? ? rm_task(p); ? ? ? ? ? ? ? } ? ? ? ? ? ? ? printk("pid: %d, state: %ld, comm: %s\n", p->pid, p->state, p->comm); ? ? ? } ? ? ? insert_task(p);Why do you want to insert your bogus struct after the last task?quoted
? ? ? printk("<1> Hello World\n");The KERN_* constants are a good replacement for a manual "<n>".
Yup, that would be fine.
quoted
Dmesg logs: [ 1174.738305] Search for insert task-------->[...]quoted
[ 1174.738819] pid: 2481, state: 1, comm: bash [ 1174.738822] pid: 0, state: 1, comm: [ 1174.738840] BUG: unable to handle kernel paging request at 00100100This is probably in insert_task. list_del sets tasks->next to LIST_POISON1 (which is 0x00100100), list_add tries to access it and segfaults.
Hmm, it sounds well for me.
quoted
Cloud you please give me some help?Hope This Helps, ? ? ? ?Jonathan Neusch?fer
It do helps me, thanks very much ;-) -- Thanks Harry Wei