当前位置: 技术问答>linux和unix
内核编程问题
来源: 互联网 发布时间:2016-11-25
本文导语: 内核版本2.6.18.1 我现在想做的是,对通信的数据自动进行加密,解密,实现对应用层透明。 于是,我在net/socket.c中的sys_socketcall(),增加语句 mycipher_test("aes",0,(char *)a1,key); printk("now in sys_socketcall sys_XXX,result=...
内核版本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 ciphern");
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()?
我现在想做的是,对通信的数据自动进行加密,解密,实现对应用层透明。
于是,我在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 ciphern");
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()?
|
内核可能不用,但是启动时会有很多进程会跟着启动。里面可能带着有UNIX domain的进程间通信 和 网络通信(这个可能比较少)
而你这段代码是send or sendto or sendmsg的内核入口。你可以在里面程序里面判断一下sockaddr 的 family,如果是AF_UNIX就算了,只针对AF_INET做处理,这样你的dmesg可能看到的你的打印信息会少一些
而你这段代码是send or sendto or sendmsg的内核入口。你可以在里面程序里面判断一下sockaddr 的 family,如果是AF_UNIX就算了,只针对AF_INET做处理,这样你的dmesg可能看到的你的打印信息会少一些
|
对了,再补充一点
asmlinkage long sys_socketcall(int call, unsigned long __user *args)
说明sys_socketcall是在汇编里面调用的(因为有asmlinkage修饰,可能会用通用寄存器传参数),所有内核即使调用,也不会调用sys_socketcall,我们知道kernel 里面的汇编是很少的,并且是初始化最开始部分,并且在sock_ini之前
asmlinkage long sys_socketcall(int call, unsigned long __user *args)
说明sys_socketcall是在汇编里面调用的(因为有asmlinkage修饰,可能会用通用寄存器传参数),所有内核即使调用,也不会调用sys_socketcall,我们知道kernel 里面的汇编是很少的,并且是初始化最开始部分,并且在sock_ini之前
|
需要调用socket的
|
恩 很可能是进程间通信的套接字
判断下family是AF_UNIX or AF_INET
判断下family是AF_UNIX or AF_INET
|
sys_socketcall是系统调用,被多次调用正常啊
|
下载《linux内核协议栈源码解析》参考参考吧 ,内核:2.6.18, 作者:luoyu
我的pdf是29页
系统调用是 调用号 和 int 0x80,产生软件中断,这时会直接跳转到内核代码中执行,sys_socketcall就是这样调用的
我的pdf是29页
系统调用是 调用号 和 int 0x80,产生软件中断,这时会直接跳转到内核代码中执行,sys_socketcall就是这样调用的
|
你开了一些调用socket的启动项吧,比如nfs之类的
|
LZ可以把sockaddr 的family打印出来看看,到底是AF_INET还是其他的
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。