audit
作者:互联网
一、socket系统调用创建socket/sock
系统调用参数family为PF_NETLINK,protocol为NETLINK_AUDIT
186 int audit_open() { 187 return socket(PF_NETLINK, SOCK_RAW | SOCK_CLOEXEC, NETLINK_AUDIT); 188 }
1.创建struct socket
2. 创建struct sock(struct netlink_sock)
调用net_proto_family类型里的create函数指针创建netlink_sock,family为PF_NETLINK,所以net_families[family]即指向netlink_family_ops,所以是调用netlink_create()。netlink_sock里包含了struct sock,并且把它放置在第一个field,所以创建了netlink_sock也即创建了sock,因为netlink_proto里的slab成员没有设置,所以是调用的kmalloc(netlink_proto.obj_size)来分配的netlink_sock,netlink_proto.obj_size即为netlink_sock struct size;
设置socket的proto_ops类型成员ops为netlink_ops,这个后面user space使用这个socket调用sendto、recvfrom等系统调用将会调用到这个函数集里的对应函数(netlink_sendmsg/netlink_recvmsg等);
调用sock_init_data()绑定socket和sock,设置sock struct的一些成员,比如sk_rcvbuf、sk_sndbuf两个buffer的size、sk_data_ready成员设置为sock_def_readable(有数据发给这个socket,调用这个函数唤醒在这个socket上等待的线程);
设置sock的sk_protocol成员为NETLINK_AUDIT
3.为socket创建fd
创建fd,这个fd将会返回给user space,之后user space调用socket相关的系统调用都将根据这个fd来操作,在kernel里根据这个fd再找到对应的socket
二、sendto系统调用设置user space的audit线程
标签:audit,netlink,调用,socket,sock,NETLINK,struct 来源: https://www.cnblogs.com/aspirs/p/16030964.html