内核编程问题

翔云123456 2011-04-25 10:54:14
内核版本2.6.18.1
我现在想做的是,对通信的数据自动进行加密,解密,实现对应用层透明。
于是,我在net/socket.c中的sys_socketcall(),增加语句



mycipher_test("aes",0,(char *)a1,key);
printk("now in sys_socketcall sys_XXX,result=\n",);


说明:
mycipher_test("aes",0,(char *)a1,key);是加密函数,目前出于测试,mycipher_test只有语句printk("in cipher\n");



case SYS_SEND:

mycipher_test("aes",0,(char *)a1,key);
printk("now in sys_socketcall sys_send,result=\n");

err = sys_send(a0, (void __user *)a1, a[2], a[3]);
break;
case SYS_SENDTO:
mycipher_test("aes",0,(char *)a1,key);
printk("now in sys_socketcall sys_sendto,result=\n");
err = sys_sendto(a0,(void __user *)a1, a[2], a[3],
(struct sockaddr __user *)a[4], a[5]);
break;
case SYS_RECV:
mycipher_test("aes",0,(char *)a1,key);
printk("now in sys_socketcall sys_recv,result=\n");

err = sys_recv(a0, (void __user *)a1, a[2], a[3]);
break;
case SYS_RECVFROM:
mycipher_test("aes",0,(char *)a1,key);
printk("now in sys_socketcall sys_recvfrom,result=\n",);

err = sys_recvfrom(a0, (void __user *)a1, a[2], a[3],
(struct sockaddr __user *)a[4], (int __user *)a[5]);
break;





添加语句完成后,我编译内核,启动新内核,启动过程中就输出很多很多的下列语句

in cipher
now in sys_socketcall sys_recv,result=
in cipher
now in sys_socketcall sys_recv,result=
in cipher
now in sys_socketcall sys_recv,result=
in cipher
now in sys_socketcall sys_recv,result=

启动完成后,进入到终端,使用命令#dmesg ,输出的也全部是这些语句。

我现在有很多疑问:
1. 内核启动过程中,要调用sys_socketcall()?我查过内核启动的资料,有sock_init()初始化函数,不太懂。
2. 内核启动过程中和启动后,为什么一直在调用sys_socketcall()?


...全文
216 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
翔云123456 2011-04-29
  • 打赏
  • 举报
回复

感谢两位keywie007 zaghost ,我也这么想,试试看去
zaghost 2011-04-26
  • 打赏
  • 举报
回复
恩 很可能是进程间通信的套接字
判断下family是AF_UNIX or AF_INET
玩世不恭 2011-04-26
  • 打赏
  • 举报
回复
LZ可以把sockaddr 的family打印出来看看,到底是AF_INET还是其他的
ww2000e 2011-04-25
  • 打赏
  • 举报
回复
sys_socketcall是系统调用,被多次调用正常啊
翔云123456 2011-04-25
  • 打赏
  • 举报
回复
使用ntsysv查看启动项后,nfs没有开机启动,我在想是不是keywie007说的那样,存在进程间通信,使用sys_socketcall()
ww2000e 2011-04-25
  • 打赏
  • 举报
回复
你开了一些调用socket的启动项吧,比如nfs之类的
翔云123456 2011-04-25
  • 打赏
  • 举报
回复
感谢 ww2000e ,smilestone322 ,
恩,是的,sys_socketcall()属于系统调用的,我想问的是内核启动过程中和启动后,为什么会一直在调用sys_socketcall()?

ww2000e 2011-04-25
  • 打赏
  • 举报
回复
下载《linux内核协议栈源码解析》参考参考吧 ,内核:2.6.18, 作者:luoyu
我的pdf是29页

系统调用是 调用号 和 int 0x80,产生软件中断,这时会直接跳转到内核代码中执行,sys_socketcall就是这样调用的
翔云123456 2011-04-25
  • 打赏
  • 举报
回复

多谢 keywie007的指点,非常感谢,我试试看去
玩世不恭 2011-04-25
  • 打赏
  • 举报
回复
对了,再补充一点
asmlinkage long sys_socketcall(int call, unsigned long __user *args)

说明sys_socketcall是在汇编里面调用的(因为有asmlinkage修饰,可能会用通用寄存器传参数),所有内核即使调用,也不会调用sys_socketcall,我们知道kernel 里面的汇编是很少的,并且是初始化最开始部分,并且在sock_ini之前
玩世不恭 2011-04-25
  • 打赏
  • 举报
回复
内核可能不用,但是启动时会有很多进程会跟着启动。里面可能带着有UNIX domain的进程间通信 和 网络通信(这个可能比较少)

而你这段代码是send or sendto or sendmsg的内核入口。你可以在里面程序里面判断一下sockaddr 的 family,如果是AF_UNIX就算了,只针对AF_INET做处理,这样你的dmesg可能看到的你的打印信息会少一些
翔云123456 2011-04-25
  • 打赏
  • 举报
回复
各位大侠,给点看法啊,先谢啦
smilestone322 2011-04-25
  • 打赏
  • 举报
回复
需要调用socket的

4,469

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧