Linux内核工程导论——进程:内核与用户空间的进程通信

内核与用户程序通信

netlink

用户端使用

    netlink被纳入socket操作的框架中,确切的说是在socket框架中设计的netlink通信接口。用户态创建、销毁socket的过程:
1、 用socket函数创建,socket(PF_NETLINK, SOCK_DGRAM, NETLINK_XXX);第一个参数必须是PF_NETLINK或者AF_NETLINK,第二个参数用SOCK_DGRAM和SOCK_RAW都没问题,第三个参数就是netlink的协议号。
2、 用bind函数绑定自己的地址。
3、 用close关闭套接字。

     那么这个请求时如何到达内核对应的消息处理函数呢?用户又应该如何组织所传输的数据呢?内核定义了数据结构:

  1. struct tag_rcv_buf  
  2. {  
  3.         struct nlmsghdr hdr;            //netlink的消息头  
  4.         netlink_notify_s my_msg;        //通信实体消息  
  5. }st_snd_buf; 

    所有的netlink数据包实际上都是传送的这个结构体。消息头指出了传送的数据的类型和消息的长度。内核netlink系统根据这个找到对应的处理函数。消息实体是具体消息定义的格式,用户知道其要发送的消息所对应的格式定义(这个定义在内核的使用netlink的具体模块中),因此对应的解析函数也可以正确的解析出传输的数据。

    发送和接收则是通过sendto和recvfrom完成(也可使用其他发送和接收函数)。如此使用socket的操作框架就可以完成用户空间与内核空间的通信。按照这个原理,实现内核线程之间的通信业不是难事,只是内核线程之间的通信更有很多方法,这个方法成本略高。

内核端实现

    

proc

设备节点的read write

ioctrl

系统调用

内存映射map

你可能感兴趣的:(linux,linux,socket,kernel,内核)