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

正文內(nèi)容

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

2025-06-22 22:00 本頁面
   

【正文】 3. Linux Device Drivers, Third Edition, 。作者認(rèn)為,它是所有這些用戶態(tài)與內(nèi)核態(tài)數(shù)據(jù)交換方式中最有效的最強(qiáng)大的方式。在源代碼包中給出了一個使用 netlink 的示例,它包括一個內(nèi)核模塊 和兩個應(yīng)用程序 , 。參數(shù)allocation為內(nèi)核內(nèi)存分配類型,一般地為GFP_ATOMIC或GFP_KERNEL,GFP_ATOMIC用于原子的上下文(即不可以睡眠),而GFP_KERNEL用于非原子上下文。在內(nèi)核中,模塊調(diào)用函數(shù) netlink_unicast 來發(fā)送單播消息:int netlink_unicast(struct sock *sk, struct sk_buff *skb, u32 pid, int nonblock)。下面是一個消息地址設(shè)置的例子:NETLINK_CB(skb).pid = 0。函數(shù)skb_recv_datagram(nl_sk)也用于在netlink socket nl_sk上接收消息,與skb_dequeue的不同指出是,如果socket的接收隊列上沒有消息,它將導(dǎo)致調(diào)用進(jìn)程睡眠在等待隊列nl_sksk_sleep,因此它必須在進(jìn)程上下文使用,剛才講的內(nèi)核線程就可以采用這種方式來接收消息。 data = NLMSG_DATA(nlh)。 struct nlmsghdr *nlh = NULL。在內(nèi)核中,為了創(chuàng)建一個netlink socket用戶需要調(diào)用如下函數(shù):struct sock *netlink_kernel_create(int unit, void (*input)(struct sock *sk, int len))。netlink內(nèi)核API,內(nèi)核模塊要想使用netlink,也必須包含頭文件linux/。amp。define NLMSG_NEXT(nlh,len) ((len) = NLMSG_ALIGN((nlh)nlmsg_len), \ (struct nlmsghdr*)(((char*)(nlh)) + NLMSG_ALIGN((nlh)nlmsg_len)))宏NLMSG_NEXT(nlh,len)用于得到下一個消息的首地址,同時len也減少為剩余消息的總長度,該宏一般在一個消息被分成幾個部分發(fā)送或接收時使用。define NLMSG_LENGTH(len) ((len)+NLMSG_ALIGN(sizeof(struct nlmsghdr)))宏NLMSG_LENGTH(len)用于計算數(shù)據(jù)部分長度為len時實際的消息長度。 注意:fd為socket調(diào)用打開的netlink socket描述符。iov。 = (void *)amp。struct nlmsghdr * nlhdr。應(yīng)用接收消息時需要首先分配一個足夠大的緩存來保存消息頭以及消息的數(shù)據(jù)部分,然后填充消息頭,添完后就可以直接調(diào)用函數(shù) recvmsg() 來接收。iov。結(jié)構(gòu) struct iovec 用于把多個消息通過一次系統(tǒng)調(diào)用來發(fā)送,下面是該結(jié)構(gòu)使用示例:struct iovec iov。strcpy(NLMSG_DATA(nlhdr),buffer)。內(nèi)核需要讀取和修改這些標(biāo)志,對于一般的使用,用戶把它設(shè)置為 0 就可以,只是一些高級應(yīng)用(如 netfilter 和路由 daemon 需要它進(jìn)行一些復(fù)雜的操作),字段 nlmsg_seq 和 nlmsg_pid 用于應(yīng)用追蹤消息,前者表示順序號,后者為消息來源進(jìn)程 ID。標(biāo)志 NLM_F_REPLACE 用于取代在數(shù)據(jù)表中的現(xiàn)有條目。注意,當(dāng)設(shè)置了該標(biāo)志時,請求是協(xié)議特定的,因此,需要在字段 nlmsg_type 中指定協(xié)議類型。宏NLM_F_ACK表示該消息是前一個請求消息的響應(yīng),順序號與進(jìn)程ID可以把請求與響應(yīng)關(guān)聯(lián)起來。 /* Sequence number */ __u32 nlmsg_pid。struct nlmsghdr{ __u32 nlmsg_len。 = sizeof(nladdr)。memset(amp。fd為前面的 socket 調(diào)用返回的文件描述符,參數(shù) nladdr 為 struct sockaddr_nl 類型的地址。但是,對于一個進(jìn)程的多個線程使用 netlink socket 的情況,字段 nl_pid 則可以設(shè)置為其它的值,如:pthread_self() 16 | getpid()。}。netlink socket 的地址結(jié)構(gòu)如下: struct sockaddr_nl{ sa_family_t nl_family。當(dāng)然 socket 需要的頭文件也必不可少,sys/。5.內(nèi)核可以使用 netlink 首先發(fā)起會話,但系統(tǒng)調(diào)用和 ioctl 只能由用戶應(yīng)用發(fā)起調(diào)用。但系統(tǒng)調(diào)用需要增加新的系統(tǒng)調(diào)用,ioctl 則需要增加設(shè)備或文件, 那需要不少代碼,proc 文件系統(tǒng)則需要在 /proc 下添加新的文件或目錄,那將使本來就混亂的 /proc 更加混亂。s/.*major is //g39。為了正確運行應(yīng)用程序 syscallexamuser,需要在插入模塊 syscallexamkern 后創(chuàng)建該實現(xiàn)的偽字符設(shè)備,用戶可以使用下面命令來正確創(chuàng)建設(shè)備:$ mknod /dev/mychrdev c `dmesg | grep char device mychrdev | sed 39。注意,函數(shù) register_chrdev 的第一個參數(shù)如果為 0,表示由內(nèi)核來確定該注冊偽字符設(shè)備的主設(shè)備號,這是該函數(shù)的返回為實際分配的主設(shè)備號,如果返回小于 0,表示注冊失敗。這些函數(shù)的原型示例如下:ssize_t exam_read (struct file * file, char __user * buf, size_t count, loff_t * ppos){…}ssize_t exam_write(struct file * file, const char __user * buf, size_t count, loff_t * ppos){…}int exam_ioctl(struct inode * inode, struct file * file, unsigned int cmd, unsigned long argv){…}int exam_mmap(struct file *, struct vm_area_struct *){…}int exam_open(struct inode * inode, struct file * file){…}int exam_release(struct inode * inode, struct file * file){…}在定義了這些操作函數(shù)后需要定義并設(shè)置結(jié)構(gòu)struct file_operationsstruct file_operations exam_file_ops = { .owner = THIS_MODULE, .read = exam_read, .write = exam_write, .ioctl = exam_ioctl, .mmap = exam_mmap, .open = exam_open, .release = exam_release,}。下面是作者運行該模塊與應(yīng)用的輸出結(jié)果示例:$ insmod ./$ cat /proc/sys/mysysctl/myint0$ cat /proc/sys/mysysctl/mystring$ ./sysctlexamuser = 0 = $ ./sysctlexamuser 100 Hello, Worldold value: = 0new value: = 100old vale: = new value: = Hello, World$ cat /proc/sys/mysysctl/myint100$ cat /proc/sys/mysysctl/mystringHello, World$回頁首五、系統(tǒng)調(diào)用系統(tǒng)調(diào)用是內(nèi)核提供給應(yīng)用程序的接口,應(yīng)用對底層硬件的操作大部分都是通過調(diào)用系統(tǒng)調(diào)用來完成的,例如得到和設(shè)置系統(tǒng)時間,就需要分別調(diào)用 gettimeofday 和 settimeofday 來實現(xiàn)。Sysctl 條目可以是目錄,此時 mode 字段應(yīng)當(dāng)設(shè)置為 0555,否則通過 sysctl 系統(tǒng)調(diào)用將無法訪問它下面的 sysctl 條目,child 則指向該目錄條目下面的所有條目,對于在同一目錄下的多個條目,不必一一注冊,用戶可以把它們組織成一個 struct ctl_table 類型的數(shù)組,然后一次注冊就可以,但此時必須把數(shù)組的最后一個結(jié)構(gòu)設(shè)置為NULL,即{ .ctl_name = 0}注冊sysctl條目使用函數(shù)register_sysctl_table(struct ctl_table *, int),第一個參數(shù)為定義的struct ctl_table結(jié)構(gòu)的sysctl條目或條目數(shù)組指針,第二個參數(shù)為插入到sysctl條目表中的位置,如果插入到末尾,應(yīng)當(dāng)為0,如果插入到開頭,則為非0。內(nèi)核模塊在文件 中實現(xiàn),在該內(nèi)核模塊中,每一個 sysctl 條目對應(yīng)一個 struct ctl_table 結(jié)構(gòu),該結(jié)構(gòu)定義了要注冊的 sysctl 條目的 ID(字段 ctl_name),在 proc 下的名稱(字段proame),對應(yīng)的內(nèi)核變量(字段data,注意該該字段的賦值必須是指針),條目允許的最大長度(字段maxlen,它主要用于字符串內(nèi)核變量,以便在對該條目設(shè)置時,對超過該最大長度的字符串截掉后面超長的部分),條目在proc文件系統(tǒng)下的訪問權(quán)限(字段mode),在通過proc設(shè)置時的處理函數(shù)(字段proc_handler,對于整型內(nèi)核變量,應(yīng)當(dāng)設(shè)置為amp。下面是使用 sysctl 工具來獲取和設(shè)置內(nèi)核配置參數(shù)的例子:$ sysctl = 0$ sysctl w =1 = 1$ sysctl = 1注意,參數(shù) 實際被轉(zhuǎn)換到對應(yīng)的 proc 文件/proc/sys/net/ipv4/ip_forward,選項 w 表示設(shè)置該內(nèi)核配置參數(shù),沒有選項表示讀內(nèi)核配置參數(shù),用戶可以使用 sysctl a 來讀取所有的內(nèi)核配置參數(shù),對應(yīng)更多的 sysctl 工具的信息,請參考手冊頁 sysctl(8)。$ ls /sys/module/module_param_exam/parameters/mystring my_visible_int$ cat /sys/module/module_param_exam/parameters/mystringHello,World$ cat /sys/module/module_param_exam/parameters/my_visible_int20$ echo 2000 /sys/module/module_param_exam/parameters/my_visible_int$ cat /sys/module/module_param_exam/parameters/my_visible_int2000$ echo abc /sys/module/module_param_exam/parameters/mystring$ cat /sys/module/module_param_exam/parameters/mystringabc$ rmmod module_param_exammy_invisible_int = 10my_visible_int = 2000mystring = 39。該宏的第三個參數(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è)置是一致的?;仨撌兹⒛K參數(shù)與sysfs內(nèi)核子系統(tǒng)或設(shè)備驅(qū)動可以直接編譯到內(nèi)核,也可以編譯成模塊,如果編譯到內(nèi)核,可以使用前一節(jié)介紹的方法通過內(nèi)核啟動參數(shù)來向它們傳遞參數(shù),如果編譯成模塊,則可以通過命令行在插入模塊時傳遞參數(shù),或者在運行時,通過sysfs來設(shè)置或讀取模塊數(shù)據(jù)。該程序列舉了參數(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)核啟動參數(shù)Linux 提供了一種通過 bootloader 向其傳輸啟動參數(shù)的功能,內(nèi)核開發(fā)者可以通過這種方式來向內(nèi)核傳輸數(shù)據(jù),從
點擊復(fù)制文檔內(nèi)容
環(huán)評公示相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖片鄂ICP備17016276號-1