Cat /proc/sys/net/ipv4/ip_forward
来得知内核IP层是否允许转发IP包,用户可以通过
echo 1 > /proc/sys/net/ipv4/ip_forward
**
系统调用(2.6.25):
1. linux/kernel/sys.c
在该文件里增加了 一个自己的函数:
asmlinkage void sys_hello(void)
{
printk("Hello world!\n");
return ;
}
2. linux/include/asm/unistd_32.h
添加系统调用号: #define __NR_hello 325
并且把 #define __NR_syscalls 325 改为 #define __NR_syscalls 326
3. linux/arch/x86/kernel/syscall_table_32.S
添加指向自己增加函数的指针
.long sys_hello
4. linux/syscalls.h
添加自己的系统调用的函数声明:
asmlinkage void sys_hello (void);
接下来编译内核:
动态截取系统调用:?ca=dwcn-newsletter-linux
netlink
是一种双向的数据交换方式,它使用起来非常简单高效,特别是它的广播特性在一些应用中非常方便。它是所有这些用户态与内核态数据交换方式中最有效的最强大的方式。
seq_file是单向的,即只能向内核传递,而不能从内核获取,而另外三种方式均可以进行双向数据交换,即既可以从用户应用传递给内核,又可以从内核传递给应用态应用。
procfs一般用于向用户出口少量的数据信息,或用户通过它设置内核变量从而控制内核行为。
seq_file实际上依赖于 procfs,因此为了使用seq_file,必须使内核支持procfs。
debugfs用于内核开发者调试使用,它比其他集中方式都方便,但是仅用于简单类型的变量处理。
relayfs是一种非常复杂的数据交换方式,要想准确使用并不容易,但是如果使用得当,它远比procfs和seq_file功能强大。
**
__________________________________________________________________________________________
解决IP地址到__be32转换问题
__ue32 inet_addr(const char *);//不过是在用户态用的,内核态还没找到
如:
message.packet_ip_info.ip_addr=inet_addr("192.168.0.1");
____________________________________________________________
解决NL读取用户空间传来的自定义数据结构问题
memcpy(void*,void*,size_t);
如:这里用到了NLMSG常用的宏来提取数据大小
memcpy(&packet_from_user,NLMSG_DATA(nlh), sizeof(struct packet_info));
_________________________________________________________________
解决JNI与C参数传递
java 对象与 c结构体进行交互:
jobjectArray args=0;
//array size
jsize len=20;
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-36628-10.html
支持台湾人民
去不了好想去我凡~