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

正文內(nèi)容

linux系統(tǒng)內(nèi)核空間與用戶空間通信的實現(xiàn)與分析-文庫吧

2025-06-10 22:00 本頁面


【正文】 h = (*pskb)。 struct packet_info info。 if(iphprotocol == IPPROTO_ICMP) /*若傳輸層協(xié)議為 ICMP*/ { read_lock_bh(amp。)。 if( != 0) { read_unlock_bh(amp。)。 = iphsaddr。 /*記錄源地址*/ = iphdaddr。 /*記錄目的地址*/ send_to_user(amp。info)。 /*發(fā)送數(shù)據(jù)*/ } else read_unlock_bh(amp。)。 } return NF_ACCEPT。}(四)發(fā)送數(shù)據(jù)static int send_to_user(struct packet_info *info){ int ret。 int size。 unsigned char *old_tail。 struct sk_buff *skb。 struct nlmsghdr *nlh。 struct packet_info *packet。 size = NLMSG_SPACE(sizeof(*info))。 /*開辟一個新的套接字緩存*/ skb = alloc_skb(size, GFP_ATOMIC)。 old_tail = skbtail。 /*填寫數(shù)據(jù)報相關(guān)信息*/ nlh = NLMSG_PUT(skb, 0, 0, IMP2_K_MSG, sizesizeof(*nlh))。 packet = NLMSG_DATA(nlh)。 memset(packet, 0, sizeof(struct packet_info))。 /*傳輸?shù)接脩艨臻g的數(shù)據(jù)*/ packetsrc = infosrc。 packetdest = infodest。 /*計算經(jīng)過字節(jié)對其后的數(shù)據(jù)實際長度*/ nlhnlmsg_len = skbtail old_tail。 NETLINK_CB(skb).dst_groups = 0。 read_lock_bh(amp。)。 ret = netlink_unicast(nlfd, skb, , MSG_DONTWAIT)。 /*發(fā)送數(shù)據(jù)*/ read_unlock_bh(amp。)。 return ret。 nlmsg_failure: /*若發(fā)送失敗,則撤銷套接字緩存*/ if(skb) kfree_skb(skb)。 return 1。}片斷(四)中所使用的宏參考如下:/*字節(jié)對齊*/define NLMSG_ALIGN(len) ( ((len)+NLMSG_ALIGNTO1) amp。 ~(NLMSG_ALIGNTO1) )/*計算包含報頭的數(shù)據(jù)報長度*/define NLMSG_LENGTH(len) ((len)+NLMSG_ALIGN(sizeof(struct nlmsghdr)))/*字節(jié)對齊后的數(shù)據(jù)報長度*/define NLMSG_SPACE(len) NLMSG_ALIGN(NLMSG_LENGTH(len))/*填寫相關(guān)報頭信息,這里使用了nlmsg_failure標(biāo)簽,所以在程序中要定義*/define NLMSG_PUT(skb, pid, seq, type, len) \({ if (skb_tailroom(skb) (int)NLMSG_SPACE(len)) goto nlmsg_failure。 \ __nlmsg_put(skb, pid, seq, type, len)。 })static __inline__ struct nlmsghdr *__nlmsg_put(struct sk_buff *skb, u32 pid, u32 seq, int type, int len){ struct nlmsghdr *nlh。 int size = NLMSG_LENGTH(len)。 nlh = (struct nlmsghdr*)skb_put(skb, NLMSG_ALIGN(size))。 nlhnlmsg_type = type。 nlhnlmsg_len = size。 nlhnlmsg_flags = 0。 nlhnlmsg_pid = pid。 nlhnlmsg_seq = seq。 return nlh。}/*跳過報頭取實際數(shù)據(jù)*/define NLMSG_DATA(nlh) ((void*)(((char*)nlh) + NLMSG_LENGTH(0)))/*取 netlink 控制字段*/define NETLINK_CB(skb) (*(struct netlink_skb_parms*)amp。((skb)cb))運(yùn)行示例時,先編譯 模塊,然后使用 insmod 將模塊加載入內(nèi)核。再運(yùn)行編譯好的 imp2_u 命令,此時就會顯示出本機(jī)當(dāng)前接收的 ICMP 數(shù)據(jù)報的源地址和目的地址。用戶可以使用 Ctrl+C 來終止用戶空間的進(jìn)程,再次啟動也不會帶來問題?;仨撌? 總結(jié)本文從內(nèi)核態(tài)代碼的不同運(yùn)行環(huán)境來實現(xiàn)不同方法的內(nèi)核空間與用戶空間的通信,并分析了它們的實際效果。最后推薦使用 netlink 套接字實現(xiàn)中斷環(huán)境與用戶態(tài)進(jìn)程通信,因為 netlink 套接字是專為此類通信定制的。參考資料 Linux 及后續(xù)版本內(nèi)核源代碼; ; RFC 3549;在 Linux 下用戶空間與內(nèi)核空間數(shù)據(jù)交換的方式,第 1 部分: 內(nèi)核啟動參數(shù)、模塊參數(shù)與sysfs、sysctl、系統(tǒng)調(diào)用和netlink級別: 初級燚 楊 (@), 計算機(jī)科學(xué)碩士2006 年 2 月 16 日本系列文章包括兩篇,它們文詳細(xì)地介紹了 Linux 系統(tǒng)下用戶空間與內(nèi)核空間數(shù)據(jù)交換的九種方式,包括內(nèi)核啟動參數(shù)、模塊參數(shù)與 sysfs、sysctl、系統(tǒng)調(diào)用、netlink、procfs、seq_file、debugfs和relayfs,并給出具體的例子幫助讀者掌握這些技術(shù)的使用。本文是該系列文章的第一篇,它介紹了內(nèi)核啟動參數(shù)、模塊參數(shù)與sysfs、sysctl、系統(tǒng)調(diào)用和netlink,并結(jié)合給出的例子程序詳細(xì)地說明了它們?nèi)绾问褂?。一、引言一般地,在使用虛擬內(nèi)存技術(shù)的多任務(wù)系統(tǒng)上,內(nèi)核和應(yīng)用有不同的地址空間,因此,在內(nèi)核和應(yīng)用之間以及在應(yīng)用與應(yīng)用之間進(jìn)行數(shù)據(jù)交換需要專門的機(jī)制來實現(xiàn),眾所周知,進(jìn)程間通信(IPC)機(jī)制就是為實現(xiàn)應(yīng)用與應(yīng)用之間的數(shù)據(jù)交換而專門實現(xiàn)的,大部分讀者可能對進(jìn)程間通信比較了解,但對應(yīng)用與內(nèi)核之間的數(shù)據(jù)交換機(jī)制可能了解甚少,本文將詳細(xì)介紹 Linux 系統(tǒng)下內(nèi)核與應(yīng)用進(jìn)行數(shù)據(jù)交換的各種方式,包括內(nèi)核啟動參數(shù)、模塊參數(shù)與 sysfs、sysctl、系統(tǒng)調(diào)用、netlink、procfs、seq_file、debugfs 和 relayfs?;仨撌锥?、內(nèi)核啟動參數(shù)Linux 提供了一種通過 bootloader 向其傳輸啟動參數(shù)的功能,內(nèi)核開發(fā)者可以通過這種方式來向內(nèi)核傳輸數(shù)據(jù),從而控制內(nèi)核啟動行為。通常的使用方式是,定義一個分析參數(shù)的函數(shù),而后使用內(nèi)核提供的宏 __setup把它注冊到內(nèi)核中,該宏定義在 linux/ 中,因此要使用它必須包含該頭文件:__setup(para_name=, parse_func)para_name 為參數(shù)名,parse_func 為分析參數(shù)值的函數(shù),它負(fù)責(zé)把該參數(shù)的值轉(zhuǎn)換成相應(yīng)的內(nèi)核變量的值并設(shè)置那個內(nèi)核變量。內(nèi)核為整數(shù)參數(shù)值的分析提供了函數(shù) get_option 和 get_options,前者用于分析參數(shù)值為一個整數(shù)的情況,而后者用于分析參數(shù)值為逗號分割的一系列整數(shù)的情況,對于參數(shù)值為字符串的情況,需要開發(fā)者自定義相應(yīng)的分析函數(shù)。 說明了三種情況的使用。該程序列舉了參數(shù)為一個整數(shù)、逗號分割的整數(shù)串以及字符串三種情況,讀者要想測試該程序,需要把該程序拷貝到要使用的內(nèi)核的源碼目錄樹的一個目錄下,為了避免與內(nèi)核其他部分混淆,作者建議在內(nèi)核源碼樹的根目錄下創(chuàng)建一個新目錄,如 examples,然后把該程序拷貝到 examples 目錄下并重新命名為 ,并且為該目錄創(chuàng)建一個 Makefile 文件:objy = Makefile 僅許這一行就足夠了,然后需要修改源碼樹的根目錄下的 Makefile文件的一行,把下面行corey := usr/修改為corey := usr/ examples/注意:如果讀者創(chuàng)建的新目錄和重新命名的文件名與上面不同,需要修改上面所說 Makefile 文件相應(yīng)的位置。做完以上工作就可以按照內(nèi)核構(gòu)建步驟去構(gòu)建新的內(nèi)核,在構(gòu)建好內(nèi)核并設(shè)置好lilo或grub為該內(nèi)核的啟動條目后,就可以啟動該內(nèi)核,然后使用lilo或grub的編輯功能為該內(nèi)核的啟動參數(shù)行增加如下參數(shù)串:setup_example_int=1234 setup_example_int_array=100,200,300,400 setup_example_string=Thisisatest當(dāng)然,該參數(shù)串也可以直接寫入到lilo或grub的配置文件中對應(yīng)于該新內(nèi)核的內(nèi)核命令行參數(shù)串中。讀者可以使用其它參數(shù)值來測試該功能。下面是作者系統(tǒng)上使用上面參數(shù)行的輸出:setup_example_int=1234setup_example_int_array=100,200,300,400setup_example_int_array includes 4 intergerssetup_example_string=Thisisatest讀者可以使用dmesg | grep setup來查看該程序的輸出?;仨撌兹⒛K參數(shù)與sysfs內(nèi)核子系統(tǒng)或設(shè)備驅(qū)動可以直接編譯到內(nèi)核,也可以編譯成模塊,如果編譯到內(nèi)核,可以使用前一節(jié)介紹的方法通過內(nèi)核啟動參數(shù)來向它們傳遞參數(shù),如果編譯成模塊,則可以通過命令行在插入模塊時傳遞參數(shù),或者在運(yùn)行時,通過sysfs來設(shè)置或讀取模塊數(shù)據(jù)。Sysfs是一個基于內(nèi)存的文件系統(tǒng),實際上它基于ramfs,sysfs提供了一種把內(nèi)核數(shù)據(jù)結(jié)構(gòu),它們的屬性以及屬性與數(shù)據(jù)結(jié)構(gòu)的聯(lián)系開放給用戶態(tài)的方式,它與kobject子系統(tǒng)緊密地結(jié)合在一起,因此內(nèi)核開發(fā)者不需要直接使用它,而是內(nèi)核的各個子系統(tǒng)使用它。用戶要想使用 sysfs 讀取和設(shè)置內(nèi)核參數(shù),僅需裝載 sysfs 就可以通過文件操作應(yīng)用來讀取和設(shè)置內(nèi)核通過 sysfs 開放給用戶的各個參數(shù):$ mkdir p /sysfs$ mount t sysfs sysfs /sysfs注意,不要把 sysfs 和 sysctl 混淆,sysctl 是內(nèi)核的一些控制參數(shù),其目的是方便用戶對內(nèi)核的行為進(jìn)行控制,而 sysfs 僅僅是把內(nèi)核的 kobject 對象的層次關(guān)系與屬性開放給用戶查看,因此 sysfs 的絕大部分是只讀的,模塊作為一個 kobject 也被出口到 sysfs,模塊參數(shù)則是作為模塊屬性出口的,內(nèi)核實現(xiàn)者為模塊的使用提供了更靈活的方式,允許用戶設(shè)置模塊參數(shù)在 sysfs 的可見性并允許用戶在編寫模塊時設(shè)置這些參數(shù)在 sysfs 下的訪問權(quán)限,然后用戶就可以通過sysfs 來查看和設(shè)置模塊參數(shù),從而使得用戶能在模塊運(yùn)行時控制模塊行為。對于模塊而言,聲明為 static 的變量都可以通過命令行來設(shè)置,但要想在 sysfs下可見,必須通過宏 module_param 來顯式聲明,該宏有三個參數(shù),第一個為參數(shù)名,即已經(jīng)定義的變量名,第二個參數(shù)則為變量類型,可用的類型有 byte, short, ushort, int, uint, long, ulong, charp 和 bool 或 invbool,分別對應(yīng)于 c 類型 char, short, unsigned short, int, unsigned int, long, unsigned long, char * 和 int,用戶也可以自定義類型 XXX(如果用戶自己定義了 param_get_XXX,param_set_XXX 和 param_check_XXX)。該宏的第三個參數(shù)用于指定訪問權(quán)限,如果為 0,該參數(shù)將不出現(xiàn)在 sysfs 文件系統(tǒng)中,允許的訪問權(quán)限為 S_IRUSR, S_IWUSR,S_IRGRP,S_IWGRP,S_IROTH 和 S_IWOTH 的組合,它們分別對應(yīng)于用戶讀,用戶寫,用戶組讀,用戶組寫,其他用戶讀和其他用戶寫,因此用文件的訪問權(quán)限設(shè)置是一致的。在源代碼包中的內(nèi)核模塊 是一個利用模塊參數(shù)和sysfs來進(jìn)行用戶態(tài)與內(nèi)核態(tài)數(shù)據(jù)交互的例子。該模塊有三個參數(shù)可以通過命令行設(shè)置,下面是作者系統(tǒng)上的運(yùn)行結(jié)果示例:$ insmod ./ my_invisible_int=10 my_visible_int=20 mystring=Hello,Worldmy_invisible_int = 10my_visible_int = 20mystring = 39。Hello,World39。$ ls /sys/module/module_param_exam/parameters/mystring my_visible_int$ cat /sys/mod
點擊復(fù)制文檔內(nèi)容
環(huán)評公示相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1