LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1296|回复: 12

怎么知道加载了哪些kernal module ?

[复制链接]
发表于 2004-4-6 16:22:27 | 显示全部楼层 |阅读模式
我只要知道它的名字就可以了,谢谢。
发表于 2004-4-6 16:32:19 | 显示全部楼层

尝试.我在boot loader的时候使用过.

lsmod

另:你的头像不怕人家告你侵权?
www.tianyaclub.com
 楼主| 发表于 2004-4-6 16:41:34 | 显示全部楼层
谢谢,能登陆后看吗?我一时找不到怎么做?
另:还没找到那图    ,关于版权问题,
发表于 2004-4-6 17:42:21 | 显示全部楼层
唉,真是有点悲哀,也就几个月没用而已,我把这些都忘了,看我这脑子

我也在极力找着答案,可是怎么也找不到,郁闷
发表于 2004-4-6 17:44:38 | 显示全部楼层
use "kldstat" under BSD .
 楼主| 发表于 2004-4-6 21:49:51 | 显示全部楼层
还有个奇怪的现象,在系统引导时unload kernel, 加载上旧的内核,启动,到了界面,就不能听歌了,是/dev/sond/* 失败,原来一切正常的,两个声音模块是。
snd_ich.ko AND snd_pcm.ko

kldstat能知道一个模块的状态,#kldstat MODULE_NAME是知道该模块的状态

其实我这贴的目的是想知道一个模块名,然后在程序中使用用modstat,OR kldstat()。
找到了一个modfind()的使用的例子,modfind()的作用是返回一个模块的modid.
这程序来自:
/usr/share/examples/kld/syscall/test/call.c

  1. #include <stdio.h>
  2. #include <sys/syscall.h>
  3. #include <sys/types.h>
  4. #include <sys/module.h>
  5. static void usage (void);
  6. static void
  7. usage (void)
  8. {
  9.         fprintf (stderr, "call syscall-number\n");
  10.         exit (1);
  11. }
  12. int
  13. main(int argc, char **argv)
  14. {
  15.         char *endptr;
  16.         int syscall_num;
  17.         struct module_stat stat;
  18.         stat.version = sizeof(stat);
  19.         modstat(modfind("syscall"), &stat);/*modfind()里的参数是一个模块的名字*/
  20.         syscall_num = stat.data.intval;
  21.         return syscall (syscall_num);
  22. }
复制代码

编译通过,但不知道怎么运行,还请指教。
自己写了个

  1. #include <sys/param.h>
  2. #include <sys/module.h>
  3. #include <unistd.h>
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. int
  7. main(void)
  8. {
  9.      struct module_stat  stat ;
  10.      if(modstat(modfind("syscall"),&stat)<0) {
  11.             printf("modstat error\n");
  12.             return(1);
  13.      }
  14.      printf("version is %d,name is %s,refs is %d ,modspecific_t is %s \n",
  15.              stat->version,stat->refs,stat->data);
  16.      return(0);
  17. }
复制代码

根据最上面的程序,知道了modfind()里的参数可以是syscall,
但我设置为syscall,snd_ich.ko snd_pcm.ko kernel都输出:modstat error , why ?

如果不能在BSD版解决,请版主把整个主题复制到程序设计版,谢谢!!
发表于 2004-4-6 23:50:08 | 显示全部楼层
简单说吧,在这个目录/usr/share/examples/kld/syscall/下有两个子目录,一个是module,另外一个是test,它们的目的是让大家明白内核怎样调用模块,正确的方法是先编译module下的syscall.c(用Makefile在/usr/share/examples/kld/syscall/也可以,省事儿),编译好后就可以调用,方法如下:

bash-2.05b#kldload /usr/share/examples/kld/syscall/module/syscall.ko
bash-2.05b#kldstat
Id Refs Address    Size     Name
1    9 0xc0400000 5e16d8   kernel
2    1 0xc09e2000 51ac8    acpi.ko
3    1 0xc2235000 19000    linux.ko
4    1 0xc259d000 2000     syscall.ko


然后回到test目录编译好,执行

bash-2.05b# ./call


这样你的程序才不会出错误,因为在call.c里面调用的syscall模块的名字,你没在
系统里加载,call它当然不会顺利。

为了更好的理解,最好的办法是复制几个syscall.c( syscall1, syscall2, syscall3 etc...) 编译好后统统加载到内核里,再改你的程序,打印每一个syscall的ID,name,refs, version,data .... 奇怪的是我以linux.ko,acpi.ko 用call.c都说找不到。。。。其它我加载的却可以。。。

另外你程序有问题,应该是stat.version ...而不是 stat->version。。。

可惜明天我出门,下星期二后才会来,咱们回来再联系。。。
 楼主| 发表于 2004-4-7 14:23:17 | 显示全部楼层
我和你一样,8能分析出KERNEL MODULE ,郁闷。。。。
在/modules/试了,难到在/dev/ *
发表于 2004-4-7 18:19:57 | 显示全部楼层
Use kldstat to display the  dynamic modules you have loaded.Under FreeBSD,the loadable modules are in this directory:/boot/kernel,you can load any of those by the command kldload xxxx.ko.By the way,Modules must have an extension of .ko.

Good Luck!^_^
 楼主| 发表于 2004-4-12 20:20:26 | 显示全部楼层
help me !!thank
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表