关于linux的一点小困惑。。求解。。

[复制链接]
查看11 | 回复1 | 2011-6-10 21:17:57 | 显示全部楼层 |阅读模式
在加载一个内核模块的时候,有一个用 module_init 处理的函数,这个函数是被哪个进程执行的呢?是 insmod 吗?如果是的话,他怎么能够使用内核空间的 printk 函数呢?
现实貌似是的,因为在这个函数中加入这行代码
printk(KERN_ALERT "current->pid: %d, %s\n", current->pid, current->comm);
的结果如下:
[ 6862.284178] current->pid: 5551, insmod
不理解。。。

回复

使用道具 举报

千问 | 2011-6-10 21:17:57 | 显示全部楼层
进程一般涉及到具体的进程上下文,用户空间的进程执行流程走到内核空间时,一般都是通过系统调用来实现的 ,系统调用使用int $80h或者sysenter指令使得执行流程走到内核态(int 80就是调用80h中断),进程的执行流程到这里就等待系统调用的返回(比如你的),但是此时执行流程走到内核空间的时候,上下文还应该是发起系统调用的那个进程的内核上下文。module_init这个函数是被哪个进程执行的呢?首先我觉得这个肯定不是insmod或者任何进程,insmod怎么说都是一个工具,一个普通的应用程序。我觉得它的工作就是做一些常规的检查,比如模块依赖、驱动对应内核版本等等,搞定这些,加载模块到内存,剩下的肯定是它启动了系统的服务,后面的代码它不可能 ...
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行