文稿案例講稿_第1頁
文稿案例講稿_第2頁
文稿案例講稿_第3頁
文稿案例講稿_第4頁
已閱讀5頁,還剩6頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

用戶空間與內(nèi)核空間之間的通研究它們。例如,在本章中,你會了解到,如何在/proc文件系統(tǒng)中增加一個;內(nèi)核如何處理ioctl令;netlink提供了哪些接口函數(shù)(netlink是目前用戶空間程序配ifconfigroute等應用空間程序與內(nèi)核通信的接口和內(nèi)核如何方法,請參考UnderstandingtheLinuxKernel(O'Reilly)。概這是一個虛擬文件系統(tǒng),通常掛接在/proc下,內(nèi)核通過文件的形式將內(nèi)部信息展現(xiàn)給用戶空間程序。這些文件都不是磁盤文件,但是可以使用cat或者more是不可寫的(任何用戶都不能在/proc下創(chuàng)建或者刪除一個文件或大多數(shù)(但不是全部)LINUX版的內(nèi)核都缺省包含了procfs的支持。procfs不能被編譯成內(nèi)核模塊。內(nèi)核中與此相關(guān)的編譯項在“Filesystems-->Pseudofilesystems-->/procfilesystemsupport”中。sysctl,種是通過procfs。如果內(nèi)核支持procfs,它會/proc (/poc/sys,這 里面包含了sysctl導出變量的列表procps包里的sysctl命令可以用于配置sysctl 大多數(shù)但不是部)LINUX版的內(nèi)核都省含了syscl的支持。sysctl不GnralseupSyclsuppo”目sysfs(/sysprocfs和sysctl已經(jīng)被誤用了很多年,這導致了新的文件系統(tǒng)sysfs的出現(xiàn)。sysfs量都已經(jīng)移植到了sysfs上。sysfs的支持。sysfs不能被編譯成內(nèi)核模塊。內(nèi)核中與此相關(guān)的編譯項在“Filesystems-->Pseudofilesystems-->sysfsfilesystemsupportNEW)”中。這個選項只有在開啟“Generalsetup-->Configurestandardkernelfeatures(forsmall你可以在版的LinuxDeviceDrivers中看到關(guān)于sysfs的詳細分析。在第17章中,ioctl系統(tǒng)調(diào)socket描述符由socket系統(tǒng)調(diào)用返回,并被網(wǎng)絡代碼使用。這個接口在一些舊的網(wǎng)絡程序中使用,比如ifconfig和route等。Netlink令都使用這個接口。LINUX的netlink與BSD的routingsocket功能相似。大部分的網(wǎng)絡功能都可以用netlink和ioctl,procfsprocfs和sysctl都可以導出內(nèi)核內(nèi)部信息,但是procfs是導出簡單的變量或者數(shù)據(jù)結(jié)構(gòu),那么應該使用sysctl。反之,如果導出大量復雜的數(shù)大多數(shù)的網(wǎng)絡功能在初始化時,都會在/proc中一個或多個文件,不管初始化動作輸出相應的信息。網(wǎng)絡代碼的文件一般位于/proc/net下。/proc文件系統(tǒng)中創(chuàng)建可以調(diào)用proc_mkdir。創(chuàng)建和刪除文件可以分別調(diào)用proc_net_fops_create和proc_net_remove,這兩個函數(shù)在include/linux/proc_fs.h中定義。這兩個函數(shù)分別包裝了函數(shù)create_proc_entry和remove_proc_enty。需要注意的是這是arp協(xié)議在/proc/net下arp文件的例子staticstructfile_operationsarp_seq_fops=........ =........ =........ =........ =........ =staticint init{if(!proc_net_fops_create("arp",S_IRUGO,&arp_seq_fops))return--ENOMEM;return}proc_net_fops_creaearparp_seq_opsfie_operations結(jié)構(gòu)里面的函數(shù)會以的數(shù)回。同據(jù)很。,可以一arp緩存,或者次個路表。open函數(shù)(arp_seq_open)會做另一個重要的初始化:它staticstructseq_operationsarp_seq_ops=........ =........ =........ =........ =staticintarp_seq_open(structinode*inode,structfile{rc=seq_open(file,}用戶在 把它放在/proc/sys的什么地方。同一組件或功能的變量一般放在同一個下。例如,/proc/sys/net/ipv4下放的是與IPv4相關(guān)的變量。 過sysctl系統(tǒng)調(diào)用接口直接。 (在第36章討論)和/proc/sys/net/ipv4/neigh(在第29章討論) /proc/sys下的文件和都可以用ctl_table結(jié)構(gòu)來定義。ctl_table結(jié)構(gòu)可以用register_sysctl_table和unregister_sysctl_table來分別和卸載,這兩個函數(shù)的定義在kernel/sysctl.c中。下面是ctl_tableconstchar*/proc/sys中的文件名。intmaxlenmode_t 這是用戶在讀寫/proc/sys中的文件時,內(nèi)核調(diào)用的函數(shù)。與文件相關(guān)的ctl_instances必須初始化這個函數(shù)指針。與相關(guān)的函數(shù)指針由內(nèi)核賦一個缺省這個函數(shù)在使用sysctl系統(tǒng)調(diào)用/proc/sys 對于不同的文件,proc_handlerstrategy被初始化成不同的函數(shù)。例如,如果內(nèi)核變量包含一個或多個整數(shù),那么proc_handler就被初始化為proc_ntvec。表3-1和表3-2kernel/sysctl.c中。讀寫一個讀寫一個讀寫一個與proc_ntvec類似,但是會檢如果不是,就會這個輸入值。jiffies成jiffiesjiffies轉(zhuǎn)換成jiffies與proc_ntvec_minmax,但是數(shù)值jiffies小、最大范圍之3-2可以strategy的函FnnDst讀寫一個讀寫整型數(shù)組,數(shù)組在最小最大范圍讀寫jiffies值,并把它讀寫jiffies值,并把它轉(zhuǎn)換成和ctl_table讓我們先來看看一個文件或如何ctl_table結(jié)構(gòu),以及它們是如何被使用的。這是net/ipv4/devinet.c中定義的/proc/sys/net/ipv4/conf/default/forwarding文件初始化ctl_table的例子。這個文件的應用在第36章中有描述。{............. = =............. =............. =............. =.............proc_handler=}到這個問題。上面的結(jié)構(gòu)所描述的信息是:文件名forwarding,與文件相關(guān)聯(lián)的內(nèi)核變量是ipv4_devconf.forwarding(是一個復雜數(shù)據(jù)結(jié)構(gòu)中的一項,參數(shù)的類型是整型,文件的權(quán)限是0644(任何人可讀,只有超級用戶可寫)proc_handler被初始化成 {............ = =............. =............. =}這是 都提供了一個缺省的函數(shù)需child項。child是指向另一個ctl_table實例的指針,這個實例僅僅是一個ctl_table表中的第一個元素(net下的每個文件和目在/proc/sys中一個文我們/proc/sys目錄下的文件可以用register_sysctl_tableunregister_sysctl_table和卸載。函數(shù),需要兩個輸入?yún)?shù)一個指向ctl_table一個標記,用于說明把這個新元素加入元素所 ctl_table表的什么位置需要注意的是,register_sysctl_table的輸入?yún)?shù)中并沒有包含/proc/sys 中加入一個文件,你需要創(chuàng)建一個完整路徑的樹(ctl_tablechild指我們來看兩個例子,首先是一個簡單的。這段代碼來自drivers/scsi/scsi_sysctl.c,它展示了logging_level如何被定義并放到/proc/sys/dev/scsi/ staticctl_tablescsi_table[]={.ctl_name =DEV_SCSI_LOGGING_LEVEL, ="logging_level",............ =............ =............ =............proc_handler= ntvec{staticctl_tablescsi_dir_table[]={... = =............ =............ =scsi_table{staticctl_tablescsi_root_table[]={... = =............ =............ =scsi_dir_table{int init{scsi_table_header=register_sysctl_table(scsi_root_table,1)}register_sysctl_tablescsi_root_table,它是上面代碼中的根ctl_table。最后的結(jié)果如圖3-1所示:圖3-1/proc/sys/dev/scsi/logging_level文如果你想在相同的下添加另一個文件abc,你需要定義一個相同的樹(相同的,代devscsi的ctl_table,和新的,代表文件abcctl_table。樹的代碼(scs_ro_abe和scsi_dir_table(。在第29章中,我們可以看到,ne/core/neighbour.c中的neigh_sysctl_register使用neigh_sysctl_template重要的網(wǎng)絡代碼源文件圖3-2展示了網(wǎng)絡代碼在/proc/sys下的主要。每個,都有相應的章節(jié)來描圖3-2/proc/sys/net讓我們來看看,根據(jù)前面描述的信息,/proc/sys/net下的是如何定義并在系統(tǒng)啟動圖3-2中所示的每一個,以及下的每一個文件都有一個與之對應的ctl_table。3-33-2中所示的大多數(shù)是在哪里定義的,以及它們的父子關(guān)系。圖中沒有包含所有的。圖3-3的三個方框里面的代碼展示了三個ctl_tablenetdev_max_backlog文件有proc_handler函數(shù),但沒有strategy函數(shù)。因為netdev_max_backlog是一個整數(shù),用戶輸入通過proc_ntvec。min_delay文件同時擁有proc_handler和strategy函數(shù)。因為ip_rt_min_delay以兩個函數(shù)都需要做秒與jiffies之間的轉(zhuǎn)換。個值是一個范圍。范圍用最小、最大值來表示。所以,strategy和proc_handler函數(shù)需要處理一個整型數(shù)組(在這里是一個兩個元素的數(shù)組。ctl_table的兩在圖3-4中,你可以看到ioctl是如何被調(diào)用的。讓我們來看看ifconfig我們前面,ifconfig使用ioctl接口與內(nèi)核通信。例如,如果系統(tǒng)管理員輸入命令ifconfigeth0mtu1250eth0mtu。ifconfig首先打開一個socket,并根據(jù)系統(tǒng)管理員的輸入初始化一個數(shù)據(jù)結(jié)構(gòu),然后把這個數(shù)據(jù)結(jié)構(gòu)傳遞給ioctl。修改mtu令標識是SIOCSIFMTU。structifreqfd=socket(PF_INET,SOCK_DGRAM,<...initialize err=ioctl(fd,SIOCSIFMTU,ioctl命令在內(nèi)核的不同地方被處理。圖3-4展示了網(wǎng)絡代碼使用的ioctl命令如何被sock_ioctl分派并路由到正確的處理函數(shù)上。我們沒有看到sock_ioctl是如何被調(diào)用,還圖3-3在 圖中所示的ioctl命令的名字可以根據(jù)自己的需要(與模塊相關(guān))來解析。例如,在路由表中添加路由令,SIOCADDRT,可以被分解為SIOCADDRT。它強調(diào)兩件重要的事情:ADD強調(diào)添加一些東西,而RT強調(diào)添加的是路由表項。大多數(shù)令都遵循G代表,而S代表設置。例如,在接口上添加和刪除ip地址令就分別是SIOCGIFADDRSIOCSIFADDR。前面ifconfig例子里面提到的SIOCSIFMTU是設置接口的最大傳輸單元(MTU。SIOCSIFMTU被dev_ioctl分派,所以沒有在3-4中出現(xiàn)。3-4ioctl命令的與網(wǎng)絡相關(guān)的ioctl命令的定義在include/linux/sockios.h中。設備驅(qū)動可以定義新的(私有)命令,命令編號的范圍是SIOCDEVPRIVATE到SIOCDEVPRIVATE+15。可以參考 可以定義有命令,命令編號的是SIOCPROTOPRIVATESIOCPROTOPRIVATE+15

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論