其他分享
首页 > 其他分享> > audit

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