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

正文內(nèi)容

linux系統(tǒng)內(nèi)核空間與用戶空間通信的實(shí)現(xiàn)與分析(編輯修改稿)

2024-07-22 22:00 本頁面
 

【文章內(nèi)容簡(jiǎn)介】 ule/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。abc39?;仨撌姿?、sysctlSysctl是一種用戶應(yīng)用來設(shè)置和獲得運(yùn)行時(shí)內(nèi)核的配置參數(shù)的一種有效方式,通過這種方式,用戶應(yīng)用可以在內(nèi)核運(yùn)行的任何時(shí)刻來改變內(nèi)核的配置參數(shù),也可以在任何時(shí)候獲得內(nèi)核的配置參數(shù),通常,內(nèi)核的這些配置參數(shù)也出現(xiàn)在proc文件系統(tǒng)的/proc/sys目錄下,用戶應(yīng)用可以直接通過這個(gè)目錄下的文件來實(shí)現(xiàn)內(nèi)核配置的讀寫操作,例如,用戶可以通過Cat /proc/sys/net/ipv4/ip_forward來得知內(nèi)核IP層是否允許轉(zhuǎn)發(fā)IP包,用戶可以通過echo 1 /proc/sys/net/ipv4/ip_forward把內(nèi)核 IP 層設(shè)置為允許轉(zhuǎn)發(fā) IP 包,即把該機(jī)器配置成一個(gè)路由器或網(wǎng)關(guān)。一般地,所有的 Linux 發(fā)布也提供了一個(gè)系統(tǒng)工具 sysctl,它可以設(shè)置和讀取內(nèi)核的配置參數(shù),但是該工具依賴于 proc 文件系統(tǒng),為了使用該工具,內(nèi)核必須支持 proc 文件系統(tǒng)。下面是使用 sysctl 工具來獲取和設(shè)置內(nèi)核配置參數(shù)的例子:$ sysctl = 0$ sysctl w =1 = 1$ sysctl = 1注意,參數(shù) 實(shí)際被轉(zhuǎn)換到對(duì)應(yīng)的 proc 文件/proc/sys/net/ipv4/ip_forward,選項(xiàng) w 表示設(shè)置該內(nèi)核配置參數(shù),沒有選項(xiàng)表示讀內(nèi)核配置參數(shù),用戶可以使用 sysctl a 來讀取所有的內(nèi)核配置參數(shù),對(duì)應(yīng)更多的 sysctl 工具的信息,請(qǐng)參考手冊(cè)頁 sysctl(8)。但是 proc 文件系統(tǒng)對(duì) sysctl 不是必須的,在沒有 proc 文件系統(tǒng)的情況下,仍然可以,這時(shí)需要使用內(nèi)核提供的系統(tǒng)調(diào)用 sysctl 來實(shí)現(xiàn)對(duì)內(nèi)核配置參數(shù)的設(shè)置和讀取。在源代碼包中給出了一個(gè)實(shí)際例子程序,它說明了如何在內(nèi)核和用戶態(tài)使用sysctl。頭文件 定義了 sysctl 條目 ID,用戶態(tài)應(yīng)用和內(nèi)核模塊需要這些 ID 來操作和注冊(cè) sysctl 條目。內(nèi)核模塊在文件 中實(shí)現(xiàn),在該內(nèi)核模塊中,每一個(gè) sysctl 條目對(duì)應(yīng)一個(gè) struct ctl_table 結(jié)構(gòu),該結(jié)構(gòu)定義了要注冊(cè)的 sysctl 條目的 ID(字段 ctl_name),在 proc 下的名稱(字段proame),對(duì)應(yīng)的內(nèi)核變量(字段data,注意該該字段的賦值必須是指針),條目允許的最大長(zhǎng)度(字段maxlen,它主要用于字符串內(nèi)核變量,以便在對(duì)該條目設(shè)置時(shí),對(duì)超過該最大長(zhǎng)度的字符串截掉后面超長(zhǎng)的部分),條目在proc文件系統(tǒng)下的訪問權(quán)限(字段mode),在通過proc設(shè)置時(shí)的處理函數(shù)(字段proc_handler,對(duì)于整型內(nèi)核變量,應(yīng)當(dāng)設(shè)置為amp。proc_dointvec,而對(duì)于字符串內(nèi)核變量,則設(shè)置為 amp。proc_dostring),字符串處理策略(字段strategy,一般這是為amp。sysctl_string)。Sysctl 條目可以是目錄,此時(shí) mode 字段應(yīng)當(dāng)設(shè)置為 0555,否則通過 sysctl 系統(tǒng)調(diào)用將無法訪問它下面的 sysctl 條目,child 則指向該目錄條目下面的所有條目,對(duì)于在同一目錄下的多個(gè)條目,不必一一注冊(cè),用戶可以把它們組織成一個(gè) struct ctl_table 類型的數(shù)組,然后一次注冊(cè)就可以,但此時(shí)必須把數(shù)組的最后一個(gè)結(jié)構(gòu)設(shè)置為NULL,即{ .ctl_name = 0}注冊(cè)sysctl條目使用函數(shù)register_sysctl_table(struct ctl_table *, int),第一個(gè)參數(shù)為定義的struct ctl_table結(jié)構(gòu)的sysctl條目或條目數(shù)組指針,第二個(gè)參數(shù)為插入到sysctl條目表中的位置,如果插入到末尾,應(yīng)當(dāng)為0,如果插入到開頭,則為非0。內(nèi)核把所有的sysctl條目都組織成sysctl表。當(dāng)模塊卸載時(shí),需要使用函數(shù)unregister_sysctl_table(struct ctl_table_header *)解注冊(cè)通過函數(shù)register_sysctl_table注冊(cè)的sysctl條目,函數(shù)register_sysctl_table在調(diào)用成功時(shí)返回結(jié)構(gòu)struct ctl_table_header,它就是sysctl表的表頭,解注冊(cè)函數(shù)使用它來卸載相應(yīng)的sysctl條目。(當(dāng)然如果用戶的系統(tǒng)內(nèi)核已經(jīng)支持proc文件系統(tǒng),可以直接使用文件操作應(yīng)用如cat, echo等直接查看和設(shè)置這些sysctl條目)。下面是作者運(yùn)行該模塊與應(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)用對(duì)底層硬件的操作大部分都是通過調(diào)用系統(tǒng)調(diào)用來完成的,例如得到和設(shè)置系統(tǒng)時(shí)間,就需要分別調(diào)用 gettimeofday 和 settimeofday 來實(shí)現(xiàn)。事實(shí)上,所有的系統(tǒng)調(diào)用都涉及到內(nèi)核與應(yīng)用之間的數(shù)據(jù)交換,如文件系統(tǒng)操作函數(shù) read 和 write,設(shè)置和讀取網(wǎng)絡(luò)協(xié)議棧的 setsockopt 和 getsockopt。本節(jié)并不是講解如何增加新的系統(tǒng)調(diào)用,而是講解如何利用現(xiàn)有系統(tǒng)調(diào)用來實(shí)現(xiàn)用戶的數(shù)據(jù)傳輸需求。一般地,用戶可以建立一個(gè)偽設(shè)備來作為應(yīng)用與內(nèi)核之間進(jìn)行數(shù)據(jù)交換的渠道,最通常的做法是使用偽字符設(shè)備,具體實(shí)現(xiàn)方法是:1.定義對(duì)字符設(shè)備進(jìn)行操作的必要函數(shù)并設(shè)置結(jié)構(gòu) struct file_operations結(jié)構(gòu) struct file_operations 非常大,對(duì)于一般的數(shù)據(jù)交換需求,只定義 open, read, write, ioctl, mmap 和 release 函數(shù)就足夠了,它們實(shí)際上對(duì)應(yīng)于用戶態(tài)的文件系統(tǒng)操作函數(shù) open, read, write, ioctl, mmap 和 close。這些函數(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,}。2. 注冊(cè)定義的偽字符設(shè)備并把它和上面的 struct file_operations 關(guān)聯(lián)起來:int exam_char_dev_major。exam_char_dev_major = register_chrdev(0, exam_char_dev, amp。exam_file_ops)。注意,函數(shù) register_chrdev 的第一個(gè)參數(shù)如果為 0,表示由內(nèi)核來確定該注冊(cè)偽字符設(shè)備的主設(shè)備號(hào),這是該函數(shù)的返回為實(shí)際分配的主設(shè)備號(hào),如果返回小于 0,表示注冊(cè)失敗。因此,用戶在使用該函數(shù)時(shí)必須判斷返回值以便處理失敗情況。為了使用該函數(shù)必須包含頭文件 linux/。在源代碼包中給出了一個(gè)使用這種方式實(shí)現(xiàn)用戶態(tài)與內(nèi)核態(tài)數(shù)據(jù)交換的典型例子,它包含了三個(gè)文件:頭文件 定義了 ioctl 命令,.c 文件 ,它通過文件系統(tǒng)操作函數(shù) mmap 和 ioctl 來與內(nèi)核態(tài)模塊交換數(shù)據(jù),.c 文件 為內(nèi)核模塊,它實(shí)現(xiàn)了一個(gè)偽字符設(shè)備,以便與用戶態(tài)應(yīng)用進(jìn)行數(shù)據(jù)交換。為了正確運(yùn)行應(yīng)用程序 syscallexamuser,需要在插入模塊 syscallexamkern 后創(chuàng)建該實(shí)現(xiàn)的偽字符設(shè)備,用戶可以使用下面命令來正確創(chuàng)建設(shè)備:$ mknod /dev/mychrdev c `dmesg | grep char device mychrdev | sed 39。s/.*major is //g39。` 0然后用戶可以通過 cat 來讀寫 /dev/mychrdev,應(yīng)用程序 syscallexamuser則使用 mmap 來讀數(shù)據(jù)并使用 ioctl 來得到該字符設(shè)備的信息以及裁減數(shù)據(jù)內(nèi)容,它只是示例如何使用現(xiàn)有的系統(tǒng)調(diào)用來實(shí)現(xiàn)用戶需要的數(shù)據(jù)交互操作。下面是作者運(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。` 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 但又遠(yuǎn)比它的功能強(qiáng)大,目前在最新的 Linux 內(nèi)核()中使用netlink 進(jìn)行應(yīng)用與內(nèi)核通信的應(yīng)用很多,包括:路由 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),進(jìn)程審計(jì)(NETLINK_AUDIT),轉(zhuǎn)發(fā)信息表查詢(NETLINK_FIB_LOOKUP),netlink connector(NETLINK_CONNECTOR),netfilter 子系統(tǒng)(NETLINK_NETFILTER),IPv6 防火墻(NETLINK_IP6_FW),DECnet 路由信息(NETLINK_DNRTMSG),內(nèi)核事件向用戶態(tài)通知(NETLINK_KOBJECT_UEVENT),通用 netlink(NETLINK_GENERIC)。Netlink 是一種在內(nèi)核與用戶應(yīng)用間進(jìn)行雙向數(shù)據(jù)傳輸?shù)姆浅:玫姆绞剑脩魬B(tài)應(yīng)用使用標(biāo)準(zhǔn)的 socket
點(diǎn)擊復(fù)制文檔內(nèi)容
環(huán)評(píng)公示相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖片鄂ICP備17016276號(hào)-1