免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3063 | 回复: 0
打印 上一主题 下一主题

内核模块编程中关于使用exec_common的疑问 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-10-15 16:57 |只看该作者 |倒序浏览
目前自己在模块编程方面做一些研究,试着基于一个最基本的样例做一点改动,以实现一个简单的功能:\r\n\r\n在这个实验模块被加载时,同时执行一个外部命令(比如生成一个文件),以下是我的代码:\r\n\r\n-----------------------------mod3.c----------------------------------------------\r\n#include <sys/ddi.h>\r\n#include <sys/sunddi.h>\r\n#include <sys/modctl.h>\r\n#include <sys/cmn_err.h>\r\n#include <sys/exec.h>\r\nextern struct mod_ops mod_miscops;\r\n\r\nstatic struct modlmisc modlmisc = {\r\n        &mod_miscops,\r\n        \"Real Loadable Kernel Module\",\r\n};\r\n\r\nstatic struct modlinkage modlinkage = {\r\n         MODREV_1,\r\n         (void *)&modlmisc,\r\n         NULL\r\n};\r\n\r\nint _init(void)\r\n{\r\n     int i,j;\r\n    \r\n     char arg0[] = \"ls \";\r\n     char arg1[] = \"-l \";\r\n     char arg2[] = \"/ \";\r\n     char arg3[] = \">> \";\r\n     char arg4[] = \"/tmp/abc.txt\";\r\n     char arg5[] = \"\\0\";\r\n     const char *argp[6] = {arg0,arg1,arg2,arg3,arg4,arg5};\r\n     \r\n     if ((i=mod_install(&modlinkage))!=0)\r\n         cmn_err(CE_NOTE,\"Could not install module\\n\");\r\n     else\r\n         cmn_err(CE_NOTE,\"mod: successfully installed\");\r\n         exec_common(\"/bin/ls\",argp,NULL);\r\n     return i;\r\n}\r\n\r\nint _info(struct modinfo *modinfop)\r\n{\r\n     return (mod_info(&modlinkage, modinfop));\r\n}\r\n\r\nint _fini(void)\r\n{\r\n     int i;\r\n     if ((i= mod_remove(&modlinkage))!=0)\r\n            cmn_err(CE_NOTE,\"Could not remove module\\n\");\r\n     else\r\n            cmn_err(CE_NOTE,\"mod: successfully removed\");\r\n     return i;\r\n} \r\n--------------------------------end-----------------------------------\r\n\r\n编译、导入、加载过程如下:\r\n# gcc -c -D_KERNEL -D_SYSCALL32 -D_SYSCAL32_IMPL mod3.c\r\n# ld -r -o mod3 mod3.o\r\n# modload mod3\r\n# modinfo |grep mod3\r\n155 f9d2fd3c 210 - l mod3 (Real Loadable Kernel Module)\r\n\r\n控制台也显示:\r\nNOTICE! mod: successfully installed\r\n\r\n一切正常,但这个模块加载之后/tmp下面并没有出现abc.txt\r\n\r\n我没有使用在<unistd.h>中定义的execv,而是试用了<sys/exec.h>中定义的exec,是因为如果我使用前一个,在后面的modload阶段会报“unidentified symbols”的错误;\r\n\r\n我的问题是:\r\n1.exec_common是不是不能这样调用?\r\n2.内核不可以这种方式访问用户空间?或者Solaris从根本上禁止这种调用出现?\r\n3.如果我坚持要实现上面想要达成的功能,我该如何做呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP