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

正文內(nèi)容

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

2025-07-01 22:00本頁面
  

【正文】 ERIC)。下面是作者運(yùn)行該模塊的結(jié)果示例:$ insmod ./char device mychrdev is registered, major is 254$ mknod /dev/mychrdev c `dmesg | grep char device mychrdev | sed 39。s/.*major is //g39。在源代碼包中給出了一個使用這種方式實現(xiàn)用戶態(tài)與內(nèi)核態(tài)數(shù)據(jù)交換的典型例子,它包含了三個文件:頭文件 定義了 ioctl 命令,.c 文件 ,它通過文件系統(tǒng)操作函數(shù) mmap 和 ioctl 來與內(nèi)核態(tài)模塊交換數(shù)據(jù),.c 文件 為內(nèi)核模塊,它實現(xiàn)了一個偽字符設(shè)備,以便與用戶態(tài)應(yīng)用進(jìn)行數(shù)據(jù)交換。因此,用戶在使用該函數(shù)時必須判斷返回值以便處理失敗情況。exam_file_ops)。2. 注冊定義的偽字符設(shè)備并把它和上面的 struct file_operations 關(guān)聯(lián)起來:int exam_char_dev_major。一般地,用戶可以建立一個偽設(shè)備來作為應(yīng)用與內(nèi)核之間進(jìn)行數(shù)據(jù)交換的渠道,最通常的做法是使用偽字符設(shè)備,具體實現(xiàn)方法是:1.定義對字符設(shè)備進(jìn)行操作的必要函數(shù)并設(shè)置結(jié)構(gòu) struct file_operations結(jié)構(gòu) struct file_operations 非常大,對于一般的數(shù)據(jù)交換需求,只定義 open, read, write, ioctl, mmap 和 release 函數(shù)就足夠了,它們實際上對應(yīng)于用戶態(tài)的文件系統(tǒng)操作函數(shù) open, read, write, ioctl, mmap 和 close。事實上,所有的系統(tǒng)調(diào)用都涉及到內(nèi)核與應(yīng)用之間的數(shù)據(jù)交換,如文件系統(tǒng)操作函數(shù) read 和 write,設(shè)置和讀取網(wǎng)絡(luò)協(xié)議棧的 setsockopt 和 getsockopt。(當(dāng)然如果用戶的系統(tǒng)內(nèi)核已經(jīng)支持proc文件系統(tǒng),可以直接使用文件操作應(yīng)用如cat, echo等直接查看和設(shè)置這些sysctl條目)。內(nèi)核把所有的sysctl條目都組織成sysctl表。sysctl_string)。proc_dointvec,而對于字符串內(nèi)核變量,則設(shè)置為 amp。頭文件 定義了 sysctl 條目 ID,用戶態(tài)應(yīng)用和內(nèi)核模塊需要這些 ID 來操作和注冊 sysctl 條目。但是 proc 文件系統(tǒng)對 sysctl 不是必須的,在沒有 proc 文件系統(tǒng)的情況下,仍然可以,這時需要使用內(nèi)核提供的系統(tǒng)調(diào)用 sysctl 來實現(xiàn)對內(nèi)核配置參數(shù)的設(shè)置和讀取。一般地,所有的 Linux 發(fā)布也提供了一個系統(tǒng)工具 sysctl,它可以設(shè)置和讀取內(nèi)核的配置參數(shù),但是該工具依賴于 proc 文件系統(tǒng),為了使用該工具,內(nèi)核必須支持 proc 文件系統(tǒng)。abc39。Hello,World39。在源代碼包中的內(nèi)核模塊 是一個利用模塊參數(shù)和sysfs來進(jìn)行用戶態(tài)與內(nèi)核態(tài)數(shù)據(jù)交互的例子。對于模塊而言,聲明為 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)。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)使用它。下面是作者系統(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來查看該程序的輸出。做完以上工作就可以按照內(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ù)的函數(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ù)的多任務(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。 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ù)的使用。 Linux 及后續(xù)版本內(nèi)核源代碼;最后推薦使用 netlink 套接字實現(xiàn)中斷環(huán)境與用戶態(tài)進(jìn)程通信,因為 netlink 套接字是專為此類通信定制的。用戶可以使用 Ctrl+C 來終止用戶空間的進(jìn)程,再次啟動也不會帶來問題。((skb)cb))運(yùn)行示例時,先編譯 模塊,然后使用 insmod 將模塊加載入內(nèi)核。 return nlh。 nlhnlmsg_pid = pid。 nlhnlmsg_len = size。 nlh = (struct nlmsghdr*)skb_put(skb, NLMSG_ALIGN(size))。 })static __inline__ struct nlmsghdr *__nlmsg_put(struct sk_buff *skb, u32 pid, u32 seq, int type, int len){ struct nlmsghdr *nlh。 ~(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。 return 1。 return ret。 /*發(fā)送數(shù)據(jù)*/ read_unlock_bh(amp。)。 NETLINK_CB(skb).dst_groups = 0。 packetdest = infodest。 memset(packet, 0, sizeof(struct packet_info))。 /*填寫數(shù)據(jù)報相關(guān)信息*/ nlh = NLMSG_PUT(skb, 0, 0, IMP2_K_MSG, sizesizeof(*nlh))。 /*開辟一個新的套接字緩存*/ skb = alloc_skb(size, GFP_ATOMIC)。 struct packet_info *packet。 struct sk_buff *skb。 int size。 } return NF_ACCEPT。 /*發(fā)送數(shù)據(jù)*/ } else read_unlock_bh(amp。 /*記錄目的地址*/ send_to_user(amp。 = iphsaddr。 if( != 0) { read_unlock_bh(amp。 if(iphprotocol == IPPROTO_ICMP) /*若傳輸層協(xié)議為 ICMP*/ { read_lock_bh(amp。(三)截獲 IP 數(shù)據(jù)報static unsigned int get_icmp(unsigned int hook, struct sk_buff **pskb, const struct net_device *in, const struct net_device *out, int (*okfn)(struct sk_buff *)){ struct iphdr *iph = (*pskb)。因為考慮到 SMP,所以在這里使用了讀寫鎖來避免不同 CPU 訪問臨界區(qū)的問題。在框架中主要是從套接字緩存中取出全部的數(shù)據(jù),然后分析是不是合法的數(shù)據(jù)報,合法的 netlink 數(shù)據(jù)報必須有nlmsghdr 結(jié)構(gòu)的報頭。 nlfd)。37: }while(nlfd amp。35: }36: up(amp。)。28: if(nlhnlmsg_pid == ) = 0。24: }25: else if(nlhnlmsg_type == IMP2_CLOSE)26: {27: write_lock_bh(amp。23: write_unlock_bh(amp。)。amp。13: if(skblen = sizeof(struct nlmsghdr))14: {15: nlh = (struct nlmsghdr *)skbdata。08:09: while((skb = skb_dequeue(amp。06: if(down_trylock(amp。(二)接收用戶空間的數(shù)據(jù)DECLARE_MUTEX(receive_sem)。其實片斷(一)的工作很簡單,模塊加載階段先在內(nèi)核空間創(chuàng)建一個 netlink 套接字,再將一個函數(shù)掛接在 netfilter 框架的 NF_IP_PRE_ROUTING 鉤子點上。}module_init(init)。 } nf_unregister_hook(amp。imp2_ops)。 return 1。 /*在內(nèi)核創(chuàng)建一個 netlink socket,并注明由 kernel_recieve() 函數(shù)接收數(shù)據(jù) 這里協(xié)議 NL_IMP2 是自定的*/ nlfd = netlink_kernel_create(NL_IMP2, kernel_receive)。static int __init init(void){ rwlock_init(amp。}user_proc。struct{ __u32 pid。源碼在文件 。圖【4】以下舉一個 netlink 套接字的應(yīng)用示例。當(dāng) netlink 套接字用于內(nèi)核空間與用戶空間的通信時,在用戶空間的創(chuàng)建方法和一般套接字使用類似,但內(nèi)核空間的創(chuàng)建方法則不同。工作原理如圖【3】。但通信雙方有一端是中斷過程,使用方法則不同。當(dāng)通信的一端處于中斷過程時,該標(biāo)識為 0。內(nèi)核的幫助文檔和其他一些 Linux 相關(guān)文章都沒有對 ne
點擊復(fù)制文檔內(nèi)容
環(huán)評公示相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1