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

正文內(nèi)容

linux系統(tǒng)內(nèi)核空間與用戶空間通信的實(shí)現(xiàn)與分析-閱讀頁(yè)

2025-07-10 22:00本頁(yè)面
  

【正文】 */define NETLINK_NFLOG 5 /* netfilter/iptables ULOG */define NETLINK_XFRM 6 /* ipsec */define NETLINK_SELINUX 7 /* SELinux event notifications */define NETLINK_ISCSI 8 /* OpeniSCSI */define NETLINK_AUDIT 9 /* auditing */define NETLINK_FIB_LOOKUP 10define NETLINK_CONNECTOR 11define NETLINK_NETFILTER 12 /* netfilter subsystem */define NETLINK_IP6_FW 13define NETLINK_DNRTMSG 14 /* DECnet routing messages */define NETLINK_KOBJECT_UEVENT 15 /* Kernel messages to userspace */define NETLINK_GENERIC 16對(duì)于每一個(gè)netlink協(xié)議類型,可以有多達(dá) 32多播組,每一個(gè)多播組用一個(gè)位表示,netlink 的多播特性使得發(fā)送消息給同一個(gè)組僅需要一次系統(tǒng)調(diào)用,因而對(duì)于需要多撥消息的應(yīng)用而言,大大地降低了系統(tǒng)調(diào)用的次數(shù)。netlink socket 的地址結(jié)構(gòu)如下: struct sockaddr_nl{ sa_family_t nl_family。 __u32 nl_pid。}。字段 nl_groups 用于指定多播組,bind 函數(shù)用于把調(diào)用進(jìn)程加入到該字段指定的多播組,如果設(shè)置為 0,表示調(diào)用者不加入任何多播組。但是,對(duì)于一個(gè)進(jìn)程的多個(gè)線程使用 netlink socket 的情況,字段 nl_pid 則可以設(shè)置為其它的值,如:pthread_self() 16 | getpid()。函數(shù) bind 的調(diào)用方式如下:bind(fd, (struct sockaddr*)amp。fd為前面的 socket 調(diào)用返回的文件描述符,參數(shù) nladdr 為 struct sockaddr_nl 類型的地址。如果字段 nl_pid 設(shè)置為 0,表示消息接收者為內(nèi)核或多播組,如果 nl_groups為 0,表示該消息為單播消息,否則表示多播消息。memset(amp。 = (void *)amp。 = sizeof(nladdr)。struct nlmsghdr 為 netlink socket 自己的消息頭,這用于多路復(fù)用和多路分解 netlink 定義的所有協(xié)議類型以及其它一些控制,netlink 的內(nèi)核實(shí)現(xiàn)將利用這個(gè)消息頭來(lái)多路復(fù)用和多路分解已經(jīng)其它的一些控制,因此它也被稱為netlink 控制塊。struct nlmsghdr{ __u32 nlmsg_len。 /* Message type*/ __u16 nlmsg_flags。 /* Sequence number */ __u32 nlmsg_pid。字段 nlmsg_len 指定消息的總長(zhǎng)度,包括緊跟該結(jié)構(gòu)的數(shù)據(jù)部分長(zhǎng)度以及該結(jié)構(gòu)的大小,字段 nlmsg_type 用于應(yīng)用內(nèi)部定義消息的類型,它對(duì) netlink 內(nèi)核實(shí)現(xiàn)是透明的,因此大部分情況下設(shè)置為 0,字段 nlmsg_flags 用于設(shè)置消息標(biāo)志,可用的標(biāo)志包括:/* Flags values */define NLM_F_REQUEST 1 /* It is request message. */define NLM_F_MULTI 2 /* Multipart message, terminated by NLMSG_DONE */define NLM_F_ACK 4 /* Reply with ack, with zero or error code */define NLM_F_ECHO 8 /* Echo this request *//* Modifiers to GET request */define NLM_F_ROOT 0x100 /* specify tree root */define NLM_F_MATCH 0x200 /* return all matching */define NLM_F_ATOMIC 0x400 /* atomic GET */define NLM_F_DUMP (NLM_F_ROOT|NLM_F_MATCH)/* Modifiers to NEW request */define NLM_F_REPLACE 0x100 /* Override existing */define NLM_F_EXCL 0x200 /* Do not touch, if it exists */define NLM_F_CREATE 0x400 /* Create, if it does not exist */define NLM_F_APPEND 0x800 /* Add to end of list */標(biāo)志NLM_F_REQUEST用于表示消息是一個(gè)請(qǐng)求,所有應(yīng)用首先發(fā)起的消息都應(yīng)設(shè)置該標(biāo)志。宏NLM_F_ACK表示該消息是前一個(gè)請(qǐng)求消息的響應(yīng),順序號(hào)與進(jìn)程ID可以把請(qǐng)求與響應(yīng)關(guān)聯(lián)起來(lái)。標(biāo)志NLM_F_ROOT 被許多 netlink 協(xié)議的各種數(shù)據(jù)獲取操作使用,該標(biāo)志指示被請(qǐng)求的數(shù)據(jù)表應(yīng)當(dāng)整體返回用戶應(yīng)用,而不是一個(gè)條目一個(gè)條目地返回。注意,當(dāng)設(shè)置了該標(biāo)志時(shí),請(qǐng)求是協(xié)議特定的,因此,需要在字段 nlmsg_type 中指定協(xié)議類型。標(biāo)志 NLM_F_ATOMIC 指示請(qǐng)求返回的數(shù)據(jù)應(yīng)當(dāng)原子地收集,這預(yù)防數(shù)據(jù)在獲取期間被修改。標(biāo)志 NLM_F_REPLACE 用于取代在數(shù)據(jù)表中的現(xiàn)有條目。標(biāo)志 NLM_F_CREATE 指示應(yīng)當(dāng)在指定的表中創(chuàng)建一個(gè)條目。內(nèi)核需要讀取和修改這些標(biāo)志,對(duì)于一般的使用,用戶把它設(shè)置為 0 就可以,只是一些高級(jí)應(yīng)用(如 netfilter 和路由 daemon 需要它進(jìn)行一些復(fù)雜的操作),字段 nlmsg_seq 和 nlmsg_pid 用于應(yīng)用追蹤消息,前者表示順序號(hào),后者為消息來(lái)源進(jìn)程 ID。struct nlmsghdr nlhdr。strcpy(NLMSG_DATA(nlhdr),buffer)。nlhdrnlmsg_pid = getpid()。結(jié)構(gòu) struct iovec 用于把多個(gè)消息通過(guò)一次系統(tǒng)調(diào)用來(lái)發(fā)送,下面是該結(jié)構(gòu)使用示例:struct iovec iov。 = nlhnlmsg_len。iov。在完成以上步驟后,消息就可以通過(guò)下面語(yǔ)句直接發(fā)送:sendmsg(fd, amp。應(yīng)用接收消息時(shí)需要首先分配一個(gè)足夠大的緩存來(lái)保存消息頭以及消息的數(shù)據(jù)部分,然后填充消息頭,添完后就可以直接調(diào)用函數(shù) recvmsg() 來(lái)接收。struct msghdr msg。struct nlmsghdr * nlhdr。 = (void *)nlhdr。 = (void *)amp。 = sizeof(nladdr)。iov。recvmsg(fd, amp。 注意:fd為socket調(diào)用打開(kāi)的netlink socket描述符。在linux/,這些宏包括:define NLMSG_ALIGNTO 4define NLMSG_ALIGN(len) ( ((len)+NLMSG_ALIGNTO1) amp。define NLMSG_LENGTH(len) ((len)+NLMSG_ALIGN(sizeof(struct nlmsghdr)))宏NLMSG_LENGTH(len)用于計(jì)算數(shù)據(jù)部分長(zhǎng)度為len時(shí)實(shí)際的消息長(zhǎng)度。define NLMSG_SPACE(len) NLMSG_ALIGN(NLMSG_LENGTH(len))宏NLMSG_SPACE(len)返回不小于NLMSG_LENGTH(len)且字節(jié)對(duì)齊的最小數(shù)值,它也用于分配消息緩存。define NLMSG_NEXT(nlh,len) ((len) = NLMSG_ALIGN((nlh)nlmsg_len), \ (struct nlmsghdr*)(((char*)(nlh)) + NLMSG_ALIGN((nlh)nlmsg_len)))宏NLMSG_NEXT(nlh,len)用于得到下一個(gè)消息的首地址,同時(shí)len也減少為剩余消息的總長(zhǎng)度,該宏一般在一個(gè)消息被分成幾個(gè)部分發(fā)送或接收時(shí)使用。amp。amp。define NLMSG_PAYLOAD(nlh,len) ((nlh)nlmsg_len NLMSG_SPACE((len)))宏NLMSG_PAYLOAD(nlh,len)用于返回payload的長(zhǎng)度。netlink內(nèi)核API,內(nèi)核模塊要想使用netlink,也必須包含頭文件linux/。如果用戶需要增加新的netlink協(xié)議類型,必須通過(guò)修改linux/,當(dāng)然,目前的netlink實(shí)現(xiàn)已經(jīng)包含了一個(gè)通用的協(xié)議類型NETLINK_GENERIC以方便用戶使用,用戶可以直接使用它而不必增加新的協(xié)議類型。在內(nèi)核中,為了創(chuàng)建一個(gè)netlink socket用戶需要調(diào)用如下函數(shù):struct sock *netlink_kernel_create(int unit, void (*input)(struct sock *sk, int len))。函數(shù)指針input的參數(shù)sk實(shí)際上就是函數(shù)netlink_kernel_create返回的struct sock指針,sock實(shí)際是socket的一個(gè)內(nèi)核表示數(shù)據(jù)結(jié)構(gòu),用戶態(tài)應(yīng)用創(chuàng)建的socket在內(nèi)核中也會(huì)有一個(gè)struct sock結(jié)構(gòu)來(lái)表示。 struct nlmsghdr *nlh = NULL。 while ((skb = skb_dequeue(amp。 data = NLMSG_DATA(nlh)。函數(shù)skb = skb_dequeue(amp。函數(shù)skb_recv_datagram(nl_sk)也用于在netlink socket nl_sk上接收消息,與skb_dequeue的不同指出是,如果socket的接收隊(duì)列上沒(méi)有消息,它將導(dǎo)致調(diào)用進(jìn)程睡眠在等待隊(duì)列nl_sksk_sleep,因此它必須在進(jìn)程上下文使用,剛才講的內(nèi)核線程就可以采用這種方式來(lái)接收消息。}當(dāng)內(nèi)核中發(fā)送netlink消息時(shí),也需要設(shè)置目標(biāo)地址與源地址,而且內(nèi)核中消息是通過(guò)struct sk_buff來(lái)管理的, linux/:define NETLINK_CB(skb) (*(struct netlink_skb_parms*)amp。下面是一個(gè)消息地址設(shè)置的例子:NETLINK_CB(skb).pid = 0。NETLINK_CB(skb).dst_group = 1。在內(nèi)核中,模塊調(diào)用函數(shù) netlink_unicast 來(lái)發(fā)送單播消息:int netlink_unicast(struct sock *sk, struct sk_buff *skb, u32 pid, int nonblock)。內(nèi)核模塊或子系統(tǒng)也可以使用函數(shù)netlink_broadcast來(lái)發(fā)送廣播消息:void netlink_broadcast(struct sock *sk, struct sk_buff *skb, u32 pid, u32 group, int allocation)。參數(shù)allocation為內(nèi)核內(nèi)存分配類型,一般地為GFP_ATOMIC或GFP_KERNEL,GFP_ATOMIC用于原子的上下文(即不可以睡眠),而GFP_KERNEL用于非原子上下文。注意函數(shù)netlink_kernel_create()返回的類型為struct sock,因此函數(shù)sock_release應(yīng)該這種調(diào)用:sock_release(sksk_socket)。在源代碼包中給出了一個(gè)使用 netlink 的示例,它包括一個(gè)內(nèi)核模塊 和兩個(gè)應(yīng)用程序 , 。小結(jié)本文是系列文章的第一篇,它詳細(xì)介紹了五種用戶空間與內(nèi)核空間的數(shù)據(jù)交換方式,并通過(guò)實(shí)際例子程序向讀者講解了如何在內(nèi)核開(kāi)發(fā)中使用這些技術(shù),其中內(nèi)核啟動(dòng)參數(shù)方式是單向的,即只能向內(nèi)核傳遞,而不能從內(nèi)核獲取,其余的均可以進(jìn)行雙向數(shù)據(jù)交換,即既可以從用戶應(yīng)用傳遞給內(nèi)核,有可以從內(nèi)核傳遞給應(yīng)用態(tài)應(yīng)用。作者認(rèn)為,它是所有這些用戶態(tài)與內(nèi)核態(tài)數(shù)據(jù)交換方式中最有效的最強(qiáng)大的方式。參考資料 1. Linux 。 3. Linux Device Drivers, Third Edition, 。 5. Linux Kernel Module Programming Guide,
點(diǎn)擊復(fù)制文檔內(nèi)容
環(huán)評(píng)公示相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1