- 论坛徽章:
- 0
|
目前自己在模块编程方面做一些研究,试着基于一个最基本的样例做一点改动,以实现一个简单的功能:\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.如果我坚持要实现上面想要达成的功能,我该如何做呢? |
|