From: harryxiyou@gmail.com (harryxiyou)
To: kernelnewbies@lists.kernelnewbies.org
Subject: [RFC]Something wrong with my module
Date: Thu, 12 Apr 2012 21:52:02 +0800 [thread overview]
Message-ID: <CAD+1EGPWs1SzzUR0X-T4mv9FQteo8yyJtcZaE2eet6k7FiHEBg@mail.gmail.com> (raw)
In-Reply-To: <20120412130325.GA1874@debian.debian>
On Thu, Apr 12, 2012 at 9:03 PM, Jonathan Neusch?fer
<j.neuschaefer@gmx.net> wrote:
Hi Jonathan,
> On Thu, Apr 12, 2012 at 06:16:56PM +0800, harryxiyou wrote:
>> Hi greg,
>>
...
>>
>> 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.
>
>> ? ? ? }
>> ? ? ? 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?
>
>> ? ? ? 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.
>
>> ? ? ? 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?
>
>> ? ? ? printk("<1> Hello World\n");
>
> The KERN_* constants are a good replacement for a manual "<n>".
Yup, that would be fine.
>
>>
>>
>> Dmesg logs:
>>
>> [ 1174.738305] Search for insert task-------->
> [...]
>> [ 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 00100100
>
> This 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.
>
>>
>> Cloud you please give me some help?
>
> Hope This Helps,
> ? ? ? ?Jonathan Neusch?fer
It do helps me, thanks very much ;-)
--
Thanks
Harry Wei
next prev parent reply other threads:[~2012-04-12 13:52 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-04-12 10:16 [RFC]Something wrong with my module harryxiyou
2012-04-12 11:18 ` Kristof Provost
2012-04-12 13:40 ` harryxiyou
2012-04-12 13:59 ` Frank Ch. Eigler
2012-04-12 14:04 ` harryxiyou
2012-04-12 14:08 ` harryxiyou
2012-04-12 14:45 ` Kristof Provost
2012-04-12 13:03 ` Jonathan Neuschäfer
2012-04-12 13:52 ` harryxiyou [this message]
2012-04-12 14:33 ` Jonathan Neuschäfer
2012-04-13 15:00 ` harryxiyou
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=CAD+1EGPWs1SzzUR0X-T4mv9FQteo8yyJtcZaE2eet6k7FiHEBg@mail.gmail.com \
--to=harryxiyou@gmail.com \
--cc=kernelnewbies@lists.kernelnewbies.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).