Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1014433
  • 博文数量: 327
  • 博客积分: 9995
  • 博客等级: 中将
  • 技术积分: 4319
  • 用 户 组: 普通用户
  • 注册时间: 2009-05-25 11:21
文章存档

2011年(31)

2010年(139)

2009年(157)

我的朋友

分类: LINUX

2010-05-06 21:48:48

如果你深思一下语言中的任何一种数据类型,是否是一种抽象?比如,C中的int型,就是所有整数的一种抽象,只不过,因为内存和寄存器的有界,这个整数的范围不是数学中的无限,而是受计算机寻址范围的限制。那么,C语言中最恼人的指针类型呢?也不过是内存地址的一种抽象。

言归正传,回到Linux内核。如果把内核比喻成一个母家园的话,那么插入的模块就是围绕母亲的孩子。内核中存在有大量的变量和函数(统称为符号),母亲并不是把所有的符号都共享给孩子,而是根据需要分享一些符号出去,因此在内核代码中,凡是被EXPORT_SYMBOL()宏导出的符号,孩子们才能直接调用。可是,有时候孩子想使用的符号并没有被母亲释放出来怎么办?这就是上一讲中所提的问题所在。

实际上,为了系统管理员便于观察内核的信息,内核已经提供了出口,这就是proc文件系统。进入proc目录,犹入进入大集市,各种信息应接不暇。其中有一个叫kallsyms文件中存放有所有符号的地址。当你知道了一个变量或函数的地址,就相当于找到了其信息存放的入口点,借助于指针,抓取它们的内容就轻而易举了。

  动起手来,kallsyms中找一个你熟悉的变量,比如super_blocks, inode,打印出其某些字段的内容。例如,在Linux文件系统中,每个文件系统都有一个超级块,以下模块打印出超级块中某些字段的内容。

#include

#include

#include

#include

#include

#include

#define SUPER_BLOCKS_ADDRESS 0xc048db0c // from /proc/kallsyms

#define SB_LOCK_ADDRESS      0xc05b2440 //  from /proc/kallsyms

static int __init sbinfo_init(void)

{

    struct super_block *sb;

    struct list_head *pos;

    printk("sb:%d\tinode:%d\n",sizeof(struct super_block),sizeof(struct inode));

    printk("\nprint file_sys_type:\n");

    spin_lock((spinlock_t *)SB_LOCK_ADDRESS);

    list_for_each(pos, (struct list_head *)SUPER_BLOCKS_ADDRESS) {

        sb = list_entry(pos, struct super_block, s_list);

        printk("dev_t:%d:%d  ", MAJOR(sb->s_dev),MINOR(sb->s_dev));

        printk("count:%d  file_type name:%s\n", sb->s_count, sb->s_type->name);

    }

    spin_unlock((spinlock_t *)SB_LOCK_ADDRESS);

    return 0;

} 

static void __exit sbinfo_exit(void)

{

    printk("unloading....\n");

} 

module_init(auditfs_init);

module_exit(auditfs_exit);

MODULE_LICENSE("GPL");

阅读(760) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~