抓取内核信息(二)-遍历数据结构

        观察一个不断变化的事物,难,因为每个瞬间的信息可能 都有不同。但,在这些不同的背后,又有诸多的相似,因此 抽象就是认识事物本质的一种途径。

      与任何软件的代码一样,Linux内核代码中存在有大量的符号(变量和函数),它们就像内核的细胞一样,组成着操作系统这个动态变化的实体。抓取这些符号在某些时刻的值,在一定程度上可以知道这个实体变化的规律。

      Linux内核代码赏析(一)-链表之衍生中,我们看到,大部分的数据都可以组织成双向链表的形式,比如,Linux内核中一些重量级的数据结构:task_struct(进程)、mm_struct(内存)、superblock(文件系统)、inode(文件)等,尽管其中的字段各有不同,但至少可以抽象出一种统一的双向链表形式:

     struct foo_struct{

       …

       void *data;

       struct list_head foo_list;

       …

      }

 

   要对这个数据结构进行遍历,在此写一个函数框架:

  static int list_for_each_foo( void)

  {

      struct struct_foo foo;

struct list_head *pos;

      printk("Enter:/n");

      foo=&foo_struct;  /*实际中根据具体情况取得这个结构体的起始地址*/

      list_for_each(pos,&foo->list)

               {

               p=list_entry(pos, struct task_foo ,list);

               printk(“Print any information /n”);

               }

      return 0;

}

 在此要特别说明如何取得结构体的起始地址。比如,要打印系统中每个进程的信息,就要找出进程这个链表的头。在内核中,0号进程是链表头,其变量为init_task。关于打印进程信息的例子请参看利用list_head遍历进程一文。

 

    但是,别以为这就是灵丹妙药,可以不假思索的照搬。比 如,你如法炮制地去打印super_block这个结构的信息,编译时就是出错。你可能花了整整一个上午的时间在找问题,可是,左看右看,程序逻辑根本没有问题,但编译这个严谨的警察就是不放过你,那到底问题何在,请看下一讲。

 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值