生活随笔
收集整理的這篇文章主要介紹了
使用proc文件系统
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
以下是內核提供的幾個重要的proc文件系統接口:
(1)read_proc
int?(*read_proc)(char?*page,?char?**start,?off_t?offset,?int?count,?int?*eof,?void?*data);?
read_proc是proc文件輸出信息接口,page是將要寫入數據的緩沖區指針,start是數據將要寫入的頁面位置,offset是頁面中的偏移量;count是寫入的字節數,eof是一個整形數,當沒有更多數據時,必須配置這個參數,data是驅動程序特定的數據指針,可用于內部使用。函數的返回值表示實際放入頁面緩沖區的數據字節數。
(2)create_proc_entry
struct?proc_dir_entry?*create_proc_entry(const?char?*name,?mode_t?mode,struct?proc_dir_entry?*parent);?
create_proc_entry用來創建proc目錄。其中name為文件名稱;mode為文件權限;parent為文件的父目錄的指針,它為null時代表父目錄為/proc。
(3)remove_proc_entry
void?remove_proc_entry(const?char?*name,?struct?proc_dir_entry?*parent);?
remove_proc_entry用于刪除上面函數創建的proc條目,參數name給出要刪除的proc條目的名稱,參數parent指定建立的proc條目所在的目錄。
(4)proc_mkdir
struct?proc_dir_entry?*proc_mkdir(const?char?*?name,?struct?proc_dir_entry?*parent);?
該函數用于創建一個proc目錄,參數name用于指定要創建的proc目錄的名稱,參數parent為該proc目錄所在的目錄。
在驅動程序中使用proc文件系統,就要了解proc_dir_entry結構:
struct?proc_dir_entry?{ ?????unsigned?int?low_ino; ?????unsigned?short?namelen; ?????const?char?*name; ?????mode_t?mode; ?????nlink_t?nlink; ?????uid_t?uid;?gid_t?gid;???????????????//進程ID ?????loff_t?size; ?????const?struct?inode_operations?*proc_iops;???//結點操作 ?????const?struct?file_operations?*proc_fops;????//文件操作 ?????get_info_t?*get_info; ?????struct?module?*owner;???????????????//擁有者 ?????struct?proc_dir_entry?*next,?*parent,?*subdir; ?????void?*data; ?????read_proc_t?*read_proc;?????????//讀接口 ?????write_proc_t?*write_proc;???????????//寫接口 ?????atomic_t?count;/*?引用計數*/ ?????int?pde_users; ?????spinlock_t?pde_unload_lock; ?????struct?completion?*pde_unload_completion; ?????shadow_proc_t?*shadow_proc; ?}; ?
例1.9? proc文件系統驅動程序實例
下面的例子演示了如何訪問 proc 文件系統。代碼見光盤\src\1drivermodel\1-9proc。核心代碼如下所示:
//結點操作 ?static?struct?inode_operations?simple_inode_operations?=?{ ?????.permission?=?simple_permission, ?}; ?int?init_simple_module(?void?) ?{ ?????int?ret?=?0; ?????simple_buffer?=?(char?*)vmalloc(?MAX_simple_LENGTH?); ?????if?(!simple_buffer)? ?????{ ?????????ret?=?-ENOMEM; ?????}? ?????else? ?????{ ?????????memset(?simple_buffer,?0,?MAX_LENGTH?); ?????????proc_entry?=?create_proc_entry(?"demo",?0644,?NULL?); ?????????if?(proc_entry?==?NULL) ?????????{ ?????????????ret?=?-ENOMEM; ?????????????vfree(simple_buffer); ?????????????printk(KERN_INFO?"demo:?Couldn't?create?proc?entry\n"); ?????????}? ?????????else ?????????{ ?????????????proc_entry->proc_iops?=?&simple_inode_operations;//結點操作 ?????????????proc_entry->read_proc?=?simple_read; ?????????????proc_entry->write_proc?=?simple_write; ?????????????proc_entry->owner?=?THIS_MODULE; ?????????????printk(KERN_INFO?"demo:?Module?loaded.\n"); ?????????} ?????} ?????return?ret; ?} ?以下是讀寫操作的框架:
int?simple_read(?char?*page,?char?**start,?off_t?off,int?count,?int?*eof,?void?*data?) ?{ ?????int?size?=?0; ?????struct?task_struct?*p; ?????char?state; ?????size+=sprintf(page+size, ?????????"%5s%7s%7s%7s%7s%7s%7s??%s\n\n", ?????????"PID","UID","PRIO","POLICY", ?????????"STATE","UTIME","STIME","COMMAND"); ?????for_each_process(p) ?????{ ?????????switch((int)p->state) ?????????{ ?????????case?-1:?state='Z';?break; ?????????case?0:?state='R';?break; ?????????default:?state='S';?break; ?????????} ?????????size+=sprintf(page+size, ?????????????"%5d%7d%7d%7d%7c%7d%7d??%s\n", ?????????????(int)p->pid, ?????????????(int)p->uid, ?????????????(int)p->rt_priority, ?????????????(int)p->policy, ?????????????state, ?????????????(int)p->utime, ?????????????(int)p->stime, ?????????????p->comm); ?????} ?????return?(size); ?} ?ssize_t?simple_write(?struct?file?*filp,?const?char?__user?*buff,unsigned?long?len,?void?*data?) ?{ ?????if(len>MAX_LENGTH)len=MAX_LENGTH; ?????if?(copy_from_user(simple_buffer,?buff,?len?)) ?????{ ?????????return?-EFAULT; ?????} ?????simple_buffer[len]?=?0; ?????printk(KERN_INFO?"simple_write:?%s\n",simple_buffer); ?????return?len; ?} ?proc文件的操作權限控制代碼:static?int?simple_permission(struct?inode?*inode,?int?op,?struct?nameidata?*foo) ?{ ?????printk(KERN_INFO?"simple_permission?op?%d\n",op); ?????if(itype==op) ?????{ ?????????return?-EACCES; ?????} ?????return?0; ?} ?運行結果如下:[root@urbetter?/home]#?insmod?demo.ko? ?demo:?Module?loaded. ?[root@urbetter?/home]#?cat?/proc/demo ?simple_permission?op?36 ???PID????UID???PRIO?POLICY??STATE??UTIME??STIME??COMMAND ?????1??????0??????0??????0??????S??????1????398??init ?????2??????0??????0??????0??????S??????0??????0??kthreadd ?????3??????0??????0??????0??????S??????0??????0??ksoftirqd/0 ?????4??????0?????99??????1??????S??????0??????0??watchdog/0 ?????5??????0??????0??????0??????S??????0??????0??events/0 ?????6??????0??????0??????0??????S??????0?????41??khelper ???145??????0??????0??????0??????S??????0??????0??kblockd/0 ???156??????0??????0??????0??????S??????0??????0??khubd ???159??????0??????0??????0??????S??????0??????0??kseriod ???163??????0??????0??????0??????S??????0??????4??kmmcd ???187??????0??????0??????0??????S??????0??????0??pdflush ???188??????0??????0??????0??????S??????0??????0??pdflush ???189??????0??????0??????0??????S??????0??????0??kswapd0 ???236??????0??????0??????0??????S??????0??????0??aio/0 ???244??????0??????0??????0??????S??????0?????18??nfsiod ???924??????0??????0??????0??????S??????0??????0??mtdblockd ???957??????0??????0??????0??????S??????0??????0??kpsmoused ??1011??????0??????0??????0??????S??????0?????78??rpciod/0 ??1042??????0??????0??????0??????S??????0??????0??syslogd ??1045??????0??????0??????0??????S??????1??????7??inetd ??1079??????0??????0??????0??????S????707????468??qpe ??1088??????0??????0??????0??????S??????2?????13??sh ??1089??????0??????0??????0??????S??????0??????1??init ??1090??????0??????0??????0??????S??????0??????0??init ??1091??????0??????0??????0??????S??????0??????2??init ??1109??????0??????0??????0??????S?????41?????20??qss ??1110??????0??????0??????0??????S????141?????42??quicklauncher ??1118??????0??????0??????0??????R??????0??????2??cat ?[root@urbetter?/home]#?echo?"fgj">/proc/demo ?simple_permission?op?34 ?simple_write:?fgj ?如果將itype配置為34,則屏蔽對/proc/demo的寫操作。[root@urbetter?/home]#?insmod?demo.ko?itype=34?[root@urbetter?/home]#?echo?"fgj">/proc/demo ?simple_permission?op?34 ?-/bin/sh:?can't?create?/proc/demo:?Permission?denied ?
總結
以上是生活随笔為你收集整理的使用proc文件系统的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。