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

下載本文檔

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

文檔簡介

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

評論

0/150

提交評論