欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
使用/proc文件系統來(lái)訪(fǎng)問(wèn)Linux內核(中)
 清單 4. 編譯 LKM
代碼:
[root@plato]# make -C /usr/src/linux-`uname -r` SUBDIRS=$PWD modules
make: Entering directory `/usr/src/linux-2.6.11‘
  CC [M]  /root/projects/misc/module2.6/simple/simple-lkm.o
  Building modules, stage 2.
  MODPOST
  CC      /root/projects/misc/module2.6/simple/simple-lkm.mod.o
  LD [M]  /root/projects/misc/module2.6/simple/simple-lkm.ko
make: Leaving directory `/usr/src/linux-2.6.11‘
[root@plato]#




  結果會(huì )生成一個(gè) simple-lkm.ko文件。這個(gè)新的命名約定可以幫助將這些內核對象(LKM)與標準對象區分開(kāi)來(lái)?,F在可以加載或卸載這個(gè)模塊了,然后可以查看它的輸出。要加載這個(gè)模塊,請使用 insmod 命令;反之,要卸載這個(gè)模塊,請使用 rmmod 命令。lsmod 可以顯示當前加載的 LKM(參見(jiàn)清單 5)。

清單 5. 插入、檢查和刪除 LKM
代碼:
[root@plato]# insmod simple-lkm.ko
[root@plato]# lsmod
Module                  Size  Used by
simple_lkm              1536  0
autofs4                26244  0
video                  13956  0
button                  5264  0
battery                 7684  0
ac                      3716  0
yenta_socket           18952  3
rsrc_nonstatic          9472  1 yenta_socket
uhci_hcd               32144  0
i2c_piix4               7824  0
dm_mod                 56468  3
[root@plato]# rmmod simple-lkm
[root@plato]#




注意,內核的輸出進(jìn)到了內核回環(huán)緩沖區中,而不是打印到 stdout 上,這是因為 stdout是進(jìn)程特有的環(huán)境。要查看內核回環(huán)緩沖區中的消息,可以使用 dmesg 工具(或者通過(guò) /proc 本身使用 cat /proc/kmsg命令)。清單 6 給出了 dmesg 顯示的最后幾條消息。


清單 6. 查看來(lái)自 LKM 的內核輸出
代碼:
[root@plato]# dmesg | tail -5
cs: IO port probe 0xa00-0xaff: clean.
eth0: Link is down
eth0: Link is up, running at 100Mbit half-duplex
my_module_init called.  Module is now loaded.
my_module_cleanup called.  Module is now unloaded.
[root@plato]#




可以在內核輸出中看到這個(gè)模塊的消息?,F在讓我們暫時(shí)離開(kāi)這個(gè)簡(jiǎn)單的例子,來(lái)看幾個(gè)可以用來(lái)開(kāi)發(fā)有用 LKM 的內核 API。

集成到 /proc 文件系統中

內核程序員可以使用的標準 API,LKM 程序員也可以使用。LKM 甚至可以導出內核使用的新變量和函數。有關(guān) API 的完整介紹已經(jīng)超出了本文的范圍,因此我們在這里只是簡(jiǎn)單地介紹后面在展示一個(gè)更有用的 LKM 時(shí)所使用的幾個(gè)元素。

創(chuàng )建并刪除 /proc 項

要在 /proc 文件系統中創(chuàng )建一個(gè)虛擬文件,請使用 create_proc_entry函數。這個(gè)函數可以接收一個(gè)文件名、一組權限和這個(gè)文件在 /proc 文件系統中出現的位置。create_proc_entry 的返回值是一個(gè)proc_dir_entry 指針(或者為 NULL,說(shuō)明在 create時(shí)發(fā)生了錯誤)。然后就可以使用這個(gè)返回的指針來(lái)配置這個(gè)虛擬文件的其他參數,例如在對該文件執行讀操作時(shí)應該調用的函數。create_proc_entry 的原型和 proc_dir_entry 結構中的一部分如清單 7 所示。


清單 7. 用來(lái)管理 /proc 文件系統項的元素
代碼:
struct proc_dir_entry *create_proc_entry( const char *name, mode_t mode,
                                             struct proc_dir_entry *parent );

struct proc_dir_entry {
   const char *name;         // virtual file name
   mode_t mode;            // mode permissions
   uid_t uid;            // File‘s user id
   gid_t gid;            // File‘s group id
   struct inode_operations *proc_iops;   // Inode operations functions
   struct file_operations *proc_fops;   // File operations functions
   struct proc_dir_entry *parent;      // Parent directory
   ...
   read_proc_t *read_proc;         // /proc read function
   write_proc_t *write_proc;      // /proc write function
   void *data;            // Pointer to private data
   atomic_t count;            // use count
   ...
};

void remove_proc_entry( const char *name, struct proc_dir_entry *parent );




稍后我們就可以看到如何使用 read_proc 和 write_proc 命令來(lái)插入對這個(gè)虛擬文件進(jìn)行讀寫(xiě)的函數。

要從 /proc 中刪除一個(gè)文件,可以使用 remove_proc_entry 函數。要使用這個(gè)函數,我們需要提供文件名字符串,以及這個(gè)文件在 /proc 文件系統中的位置(parent)。這個(gè)函數原型如清單 7 所示。

parent 參數可以為 NULL(表示 /proc 根目錄),也可以是很多其他值,這取決于我們希望將這個(gè)文件放到什么地方。表 1 列出了可以使用的其他一些父 proc_dir_entry,以及它們在這個(gè)文件系統中的位置。


表 1. proc_dir_entry 快捷變量
代碼:
proc_dir_entry 在文件系統中的位置
proc_root_fs /proc
proc_net /proc/net
proc_bus /proc/bus
proc_root_driver /proc/driver


回調函數

我們可以使用 write_proc 函數向 /proc 中寫(xiě)入一項。這個(gè)函數的原型如下:

代碼:
  int mod_write( struct file *filp, const char __user *buff,
               unsigned long len, void *data );




  filp 參數實(shí)際上是一個(gè)打開(kāi)文件結構(我們可以忽略這個(gè)參數)。buff參數是傳遞給您的字符串數據。緩沖區地址實(shí)際上是一個(gè)用戶(hù)空間的緩沖區,因此我們不能直接讀取它。len 參數定義了在 buff中有多少數據要被寫(xiě)入。data 參數是一個(gè)指向私有數據的指針(參見(jiàn) 清單 7)。在這個(gè)模塊中,我們聲明了一個(gè)這種類(lèi)型的函數來(lái)處理到達的數據。

Linux 提供了一組 API 來(lái)在用戶(hù)空間和內核空間之間移動(dòng)數據。對于 write_proc 的情況來(lái)說(shuō),我們使用了 copy_from_user 函數來(lái)維護用戶(hù)空間的數據。

讀回調函數

我們可以使用 read_proc 函數從一個(gè) /proc 項中讀取數據(從內核空間到用戶(hù)空間)。這個(gè)函數的原型如下:

代碼:
  int mod_read( char *page, char **start, off_t off,
              int count, int *eof, void *data );
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
使用 /proc 文件系統來(lái)訪(fǎng)問(wèn) Linux 內核的內容
使用/proc實(shí)現內核與用戶(hù)空間通信
在 Linux 下用戶(hù)空間與內核空間數據交換的方式,第 2 部分: procfs、seq_file、debugfs和relayfs
使用proc文件系統和內核交互
create_proc_read_entry 說(shuō)明
對proc文件系統的分析(三)
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久