freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內容

linux系統(tǒng)內核空間與用戶空間通信的實現(xiàn)與分析(參考版)

2025-06-28 22:00本頁面
  

【正文】 4. 內核文檔,Documentation/sysctl/*。 2. 內核文檔,Documentation/filesystems/。該系列文章的第二篇將詳細地講解另外三種用戶態(tài)與內核態(tài)的數(shù)據(jù)交換方式,包括 procfs、seq_file、debugfs 和 relayfs,有興趣的讀者請參看該系列文章第二篇。netlink 是一種雙向的數(shù)據(jù)交換方式,它使用起來非常簡單高效,特別是它的廣播特性在一些應用中非常方便。內核模塊必須先插入到內核,然后在一個終端上運行用戶態(tài)接收程序,在另一個終端上運行用戶態(tài)發(fā)送程序,發(fā)送程序讀取參數(shù)指定的文本文件并把它作為 netlink 消息的內容發(fā)送給內核模塊,內核模塊接受該消息保存到內核緩存中,它也通過proc接口出口到 procfs,因此用戶也能夠通過 /proc/netlink_exam_buffer 看到全部的內容,同時內核也把該消息發(fā)送給用戶態(tài)接收程序,用戶態(tài)接收程序將把接收到的內容輸出到屏幕上。sk為函數(shù)netlink_kernel_create()的返回值。在內核中使用函數(shù)sock_release來釋放函數(shù)netlink_kernel_create()創(chuàng)建的netlink socket:void sock_release(struct socket * sock)。前面的三個參數(shù)與netlink_unicast相同,參數(shù)group為接收消息的多播組,該參數(shù)的每一個代表一個多播組,因此如果發(fā)送給多個多播組,就把該參數(shù)設置為多個多播組組ID的位或。參數(shù)sk為函數(shù)netlink_kernel_create()返回的socket,參數(shù)skb存放消息,它的data字段指向要發(fā)送的netlink消息結構,而skb的控制塊保存了消息的地址信息,前面的宏NETLINK_CB(skb)就用于方便設置該控制塊, 參數(shù)pid為接收消息進程的pid,參數(shù)nonblock表示該函數(shù)是否為非阻塞,如果為1,該函數(shù)將在沒有接收緩存可利用時立即返回,而如果為0,該函數(shù)在沒有接收緩存可利用時睡眠。字段pid表示消息發(fā)送者進程ID,也即源地址,對于內核,它為 0, dst_pid 表示消息接收者進程 ID,也即目標地址,如果目標為組或內核,它設置為 0,否則 dst_group 表示目標組地址,如果它目標為某一進程或內核,dst_group 應當設置為 0。NETLINK_CB(skb).dst_pid = 0。((skb)cb))來方便消息的地址設置。下面的函數(shù)input就是這種使用的示例:void input (struct sock *sk, int len){ wake_up_interruptible(sksk_sleep)。skreceive_queue)用于取得socket sk的接收隊列上的消息,返回為一個struct sk_buff的結構,skbdata指向實際的netlink消息。 /* process netlink message with header pointed by * nlh and data pointed by data */ } }函數(shù)input()會在發(fā)送進程執(zhí)行sendmsg()時被調用,這樣處理消息比較及時,但是,如果消息特別長時,這樣處理將增加系統(tǒng)調用sendmsg()的執(zhí)行時間,對于這種情況,可以定義一個內核線程專門負責消息接收,而函數(shù)input的工作只是喚醒該內核線程,這樣sendmsg將很快返回。skreceive_queue)) != NULL) { /* process netlink message pointed by skbdata */ nlh = (struct nlmsghdr *)skbdata。 u8 *data = NULL。下面是一個input函數(shù)的示例:void input (struct sock *sk, int len){ struct sk_buff *skb。參數(shù)unit表示netlink協(xié)議類型,如NETLINK_MYTEST,參數(shù)input則為內核模塊定義的netlink消息處理函數(shù),當有消息到達這個netlink socket時,該input函數(shù)指針就會被引用。前面講到,為了增加新的netlink協(xié)議類型,用戶僅需增加如下定義到linux/: define NETLINK_MYTEST 17只要增加這個定義之后,用戶就可以在內核的任何地方引用該協(xié)議。內核使用netlink需要專門的API,這完全不同于用戶態(tài)應用對netlink的使用。函數(shù)close用于關閉打開的netlink socket。 \ (nlh)nlmsg_len = (len))宏NLMSG_OK(nlh,len)用于判斷消息是否有l(wèi)en這么長。 \ (nlh)nlmsg_len = sizeof(struct nlmsghdr) amp。define NLMSG_OK(nlh,len) ((len) = (int)sizeof(struct nlmsghdr) amp。define NLMSG_DATA(nlh) ((void*)(((char*)nlh) + NLMSG_LENGTH(0)))宏NLMSG_DATA(nlh)用于取得消息的數(shù)據(jù)部分的首地址,設置和讀取消息數(shù)據(jù)部分時需要使用該宏。它一般用于分配消息緩存。 ~(NLMSG_ALIGNTO1) )宏NLMSG_ALIGN(len)用于得到不小于len且字節(jié)對齊的最小數(shù)值。在消息接收后,nlhdr指向接收到的消息的消息頭,nladdr保存了接收到的消息的目標地址,宏NLMSG_DATA(nlhdr)返回指向消息的數(shù)據(jù)部分的指針。msg, 0)。 = 1。 = amp。(nladdr)。 = MAX_NL_MSG_LEN。nlhdr = (struct nlmsghdr *)malloc(MAX_NL_MSG_LEN)。struct iovec iov。define MAX_NL_MSG_LEN 1024struct sockaddr_nl nladdr。msg, 0)。 = 1。 = amp。 = (void *)nlhdr。 /* self pid */nlhdrnlmsg_flags = 0。nlhdrnlmsg_len = NLMSG_LENGTH(strlen(buffer))。nlhdr = (struct nlmsghdr *)malloc(NLMSG_SPACE(MAX_MSGSIZE))。下面是一個示例:define MAX_MSGSIZE 1024char buffer[] = An example message。標志 NLM_F_APPEND 指示在表末尾添加新的條目。標志 NLM_F_EXCL_ 用于和 CREATE 和 APPEND 配合使用,如果條目已經(jīng)存在,將失敗。標志 NLM_F_DUMP 未實現(xiàn)。標志 NLM_F_MATCH 表示該協(xié)議特定的請求只需要一個數(shù)據(jù)子集,數(shù)據(jù)子集由指定的協(xié)議特定的過濾器來匹配。有該標志的請求通常導致響應消息設置NLM_F_MULTI標志。標志NLM_F_ECHO表示該消息是相關的一個包的回傳。標志NLM_F_MULTI 用于指示該消息是一個多部分消息的一部分,后續(xù)的消息可以通過宏NLMSG_NEXT來獲得。 /* Sending process PID */}。 /* Additional flags */ __u32 nlmsg_seq。 /* Length of message */ __u16 nlmsg_type。因此,應用在發(fā)送 netlink 消息時必須提供該消息頭。其中 nladdr 為消息接收者的 netlink 地址。(nladdr)。msg, 0, sizeof(msg))。使用函數(shù) sendmsg 發(fā)送 netlink 消息時還需要引用結構 struct msghdr、struct nlmsghdr 和 struct iovec,結構 struct msghdr 需如下設置:struct msghdr msg。為了發(fā)送一個 netlink 消息給內核或其他用戶態(tài)應用,需要填充目標 netlink socket 地址,此時,字段 nl_pid 和 nl_groups 分別表示接收消息者的進程 ID 與多播組。nladdr, sizeof(struct sockaddr_nl))。因此字段 nl_pid 實際上未必是進程 ID,它只是用于區(qū)分不同的接收者或發(fā)送者的一個標識,用戶可以根據(jù)自己需要設置該字段。傳遞給 bind 函數(shù)的地址的 nl_pid 字段應當設置為本進程的進程 ID,這相當于 netlink socket 的本地地址。字段 nl_family 必須設置為 AF_NETLINK 或著 PF_NETLINK,字段 nl_pad 當前沒有使用,因此要總是設置為 0,字段 nl_pid 為接收或發(fā)送消息的進程的 ID,如果希望內核處理消息或多播消息,就把該字段設置為 0,否則設置為處理消息的進程 ID。 __u32 nl_groups。 unsigned short nl_pad。函數(shù) bind() 用于把一個打開的 netlink socket 與 netlink 源 socket 地址綁定在一起。為了創(chuàng)建一個 netlink socket,用戶需要使用如下參數(shù)調用 socket():socket(AF_NETLINK, SOCK_RAW, netlink_type)第一個參數(shù)必須是 AF_NETLINK 或 PF_NETLINK,在 Linux 中,它們倆實際為一個東西,它表示要使用netlink,第二個參數(shù)必須是SOCK_RAW或SOCK_DGRAM, 第三個參數(shù)指定netlink協(xié)議類型,如前面講的用戶自定義協(xié)議類型NETLINK_MYTEST, NETLINK_GENERIC是一個通用的協(xié)議類型,它是專門為用戶使用的,因此,用戶可以直接使用它,而不必再添加新的協(xié)議類型。注意,使用 netlink 的應用必須包含頭文件 linux/。6.netlink 使用標準的 socket API,因此很容易使用,但系統(tǒng)調用和 ioctl則需要專門的培訓才能使用。4.netlink 支持多播,內核模塊或應用可以把消息多播給一個netlink組,屬于該neilink 組的任何內核模塊或應用都能接收到該消息,內核事件向用戶態(tài)的通知機制就使用了這一特性,任何對內核事件感興趣的應用都能收到該子系統(tǒng)發(fā)送的內核事件,在后面的文章中將介紹這一機制的使用。2. netlink是一種異步通信機制,在內核與用戶態(tài)應用之間傳遞的消息保存在socket緩存隊列中,發(fā)送消息只是把消息保存在接收者的socket的接收隊列,而不需要等待接收者收到消息,但系統(tǒng)調用與 ioctl 則是同步通信機制,如果傳遞的數(shù)據(jù)太長,將影響調度粒度。Netlink 相對于系統(tǒng)調用,ioctl 以及 /proc 文件系統(tǒng)而言具有以下優(yōu)點:1,為了使用 netlink,用戶僅需要在 include/linux/ 中增加一個新類型的 netlink 協(xié)議定義即可, 如 define NETLINK_MYTEST 17 然后,內核和用戶態(tài)應用就可以立即通過 socket API 使用該 netlink 協(xié)議類型進行數(shù)據(jù)交換。` 0$ cat /dev/mychrdev$ echo abcdefghijklmnopqrstuvwxyz /dev/mychrdev$ cat /dev/mychrdevabcdefghijklmnopqrstuvwxyz$ ./syscallexamuserUser process: syscallexamus(1433)Available space: 65509 bytesData len: 27 bytesOffset in physical: cc0 bytesmychrdev content by mmap:abcdefghijklmnopqrstuvwxyz$ cat /dev/mychrdevabcde$回頁首六、netlinkNetlink 是一種特殊的 socket,它是 Linux 所特有的,類似于 BSD 中的AF_ROUTE 但又遠比它的功能強大,目前在最新的 Linux 內核()中使用netlink 進行應用與內核通信的應用很多,包括:路由 daemon(NETLINK_ROUTE),1wire 子系統(tǒng)(NETLINK_W1),用戶態(tài) socket 協(xié)議(NETLINK_USERSOCK),防火墻(NETLINK_FIREWALL),socket 監(jiān)視(NETLINK_INET_DIAG),netfilter 日志(NETLINK_NFLOG),ipsec 安全策略(NETLINK_XFRM),SELinux 事件通知(NETLINK_SELINUX),iSCSI 子系統(tǒng)(NETLINK_ISCSI),進程審計(NETLINK_AUDIT),轉發(fā)信息表查詢(NETLINK_FIB_LOOKUP),netlink connector(NETLINK_CONNECTOR),netfilter 子系統(tǒng)(NETLINK_NETFILTER),IPv6 防火墻(NETLINK_IP6_FW),DECnet 路由信息(NETLINK_DNRTMSG),內核事件向用戶態(tài)通知(NETLINK_KOBJECT_UEVENT),通用 netlink(NETLINK_GEN
點擊復制文檔內容
環(huán)評公示相關推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1