admin 管理员组

文章数量: 1087649


2024年12月26日发(作者:开源cms系统排名)

维普资讯

Vo1.23 No.3 

安徽工业大学学报 

第23卷第3期 

July 2006 

J.of Anhui University of Technology 

2006年7月 

文章编号:1671—7872(2006)03-43320—04 

Linux管理工具在嵌入式系统中一种轻量 

级的实现方法 

阮越 

(安徽工业大学计算机学院,安徽马鞍山243002) 

摘要:基于unux系统的嵌入式开发中,桌面系统中的一些常用工具消耗资源严重,不适用于嵌入式环境。文中分析了proc虚拟 

文件系统,利用proc文件系统和内核模块技术实现这些工具的一个轻量级版本,最后讨论了这种方法的优缺点。 

关键词:proe文件系统;内核模块;嵌入式系统;内核空间;用户空间 

中图分类号:TP316 文献标识码:B 

Light Weight Implementation of Linux Administrative Tools in Embedded System 

RUAN Yue 

(School of Computer Science,Anhui University of Technology,Ma'anshan 243002,China) 

Abstract:In the development of embedded system based on Linux,some useful administrative tools,which ale 

often used in desktop environment,are too heavy weight for embedded system.Proc virtual system is analyzed 

ifsrtly,and then a light weight implementation of administrative tools is given,finally the advantages and 

disadvantages of this method is discussed. 

Key words:proc file system;LKM;embedded system;kernd space;user space 

引 言 

Linux系统中为了方便用户查询、管理或者操纵系统状态以及一些内核数据结构,在用户空间提供了很 

多管理工具,如top,sysctl,ifconfig等。在基于Linux系统的嵌入式开衰1 Linux常用系统管理命令所需系统调用 

发中。用户空间同样需要提供一些类似的管理工具。这些工具在桌面 

环境(Linux的正式发行版)中的功能很强大,但往往需要大量的系统 

调用。表1给出了一些命令(Redhat Linux 9.0,kernel 2.4.20)所需的系 

统调用个数。系统调用需要用户空间和内核空间的模式切换,消耗较 

多的时空资源。而且这些管理命令还会增加诸如文件系统、界面控制 

等方面的开销(如一些lib库所占的空间)。 

造成这些管理命令资源消耗严重的原因主要有:高度的可配置性;丰富和复杂的配置选项;通用性,即和 

具体的应用环境无关;占用CPU的时问不是考虑的主要因素。 

般来讲,前3个方面是程序员开发时追求的目标,他们总是希望程序功能完善,可以处理所有情况,完 

成更多的工作。但事实上,其中很多功能很少用到甚至根本用不到。而且,熟悉这些复杂的管理工具需要大量 

的时间,在文档不充分的情况下,很容易出现错误配置。在资源相对紧张的嵌入式Linux环境中,开发和使用 

这样的管理工具是得不偿失的。 

在嵌入式环境中,管理工具的开发原则:一个确实需要的功能的最小集合;针对具体的应用环境;跟具体 

应用紧密相关并包含错误信息;尽量减少CPU和空间的占用率。 

依据上述开发原则,可以借助/proc文件系统【 ,21以及内核模块(Linux Kenrel Module,LKM)技术D—l实现这 

收稿日期:2005一ll—O7 

作者简介:阮越(1972一),男,湖北红安人,安徽工业大学计算机学院讲师。 

维普资讯

第3期 阮越:Linux管理工具在嵌入式系统中一种轻量级的实现方法 321 

些工具适应嵌入式环境的一个轻量级版本。 

1 proc文件系统 

I.I特殊性及其建立过程 

proc最早出现在Linux kernel 0.99.X的正式发行版中,开始主要应用在网络相关方面,后来为了简化系 

统管理和调试,逐渐把它应用到其它方面。现在,proc已经成为Linux内核中使用最广泛和最成功的特性之 

。pr0c借用文件系统的概念,在Linux kernel 2.0以后,用户可以直接使用文件系统中的标准系统调用去访 

问proc下的信息,内部实现中也使用与文件和文件系统相关的内核数据结构。但proc是一种虚拟文件系统, 

只存在内存当中,并不占用外存空间,与其它任何设备也没有对应关系。proc下文件节点的内容,是用户发 

出访问/proc下的”文件”请求时,由系统动态生成的。 

proc文件系统的超级块是在内核初始化的过程中由系统生成的,在将其挂载到安装点(mount point)”/ 

proc”上后,就生成一个proc—dir entry结构的树。proc下的一个文件节点对应一个proc_diLentry结构, 

proc—dir entry结构中包含了建立对应文件inode和dentry结构所必需的信息。在具体的文件操作时(主要是 

path walk0函数),才生成具体文件的dentry和inode结构,逐渐建立起真正意义上的proc文件系统。 

1.2核心数据结构proc dir entry 

proc dir entyr构成了proc树形目录结构的一个节点,是proc文件系统中最重要的数据结构,它的主要 

域及含义如下所示。 

struct proc dir entyr{ 

const char name; 

mode

_

t mode;/*/proc目录下文件节点的名称与权限,I‘/ 

struct file

operations*proe

fops;/*文件操作表,主要是read和write方法 / 

get_info

t*get

_

_

info;/*有较多限定的特殊类型的read方法 / 

struct module*owner; 

如果将owner指针设置成THIS—MODULE,那么创建这个proe dir_entyr的内核模块不用时,将被卸载; 

如果将owner指针设置成其它内核模块,那么它可以保证在其它模块没被卸载之前,不会被卸掉 

术, 

strue't proc

dir entry next, parent, subdir;//描述了proc文件系统的树形链接结构 

void*data;/*proc的read方法的返回值,I‘/ 

read

_

proc_t read proc; 

wrie

_

proc_t*write

_

proc;/*proc中的read方法和write方法,I‘/ 

} 

1.3 proe文件系统的文件读,写流程 

以内核2.4.20(redhat 9.0)为例讨论proc文件系统的读写流程。 

①用户进程通过系统调用read(读文件)或write(写文件)陷入内核,分别执行sys

_

read,sys

_

write两个内 

核函数(文件./linux/fs/read_write.c),在这两个函数中执行6le结构中函数跳转表f_op中的read,write指针所 

指的函数; 

②file一>f op函数跳转表的值来源于inode结构中的i_fop,在访问文件的过程中,dentry_open函数将文 

件索引节点中函数跳转表i_fop值赋给file结构中的f op(文件./linux/fs/open.c); 

( ̄)inode结构中i fop值来源于proc dir—entyr中的proc—fops,在创建proe文件系统中文件inode节点时, 

函数proc_get_inode将文件对应的proc_dir_entry中proc—fops值赋给inode结构中i fop(文件./linux/fs/proe/ 

inode.c); 

@proc_dir_entry结构中proc_fops值来源于proc_file—operations,在创建文件proc dir entyr结构时,函数 

维普资讯

322 安徽工业大学学报 2006年 

proc_register将proc_file—operations值赋给proc—dir_entry结构中proc—fops,(文件./linux]fs/proc/generie.e); 

( ̄proc_file operation中proc file—read和proc_file_write两个函数,分别执行的是proc_dir_entry结构中 

函数指针(proc_read,proc_write)所指的函数(文件./linux/fs/proc/generic.c); 

@proc_dir entry结构中proc_read和proc_write函数指针赋值是在创建文件的proc dir entry结构时由 

函数create_proc_entry(),create—proc_read—entry(),create_proc—info—entyr()等函数进行的(文件./include/ 

linux/proc

fs.h,create

proc_read

_

——

entyr()等函数实际是create_proc—entyr()的打包函数); 

⑦文件读/写流程最后落到了内核函数create—proc—entyr()中read—procO和write—proc0两个方法上。两 

个函数的原形如下: 

static int proc

_

read(char*page,char *start,loff t off,int count,int eof,void data) 

proc read函数将内核变量信息收集到page所指的缓冲区中; 

static ssize

_

t proc_write(struct file file,const char buff,size_t count,loff_t ppos) 

proc write函数将buff所指的缓冲区中的数据赋给 le所对应的内核变量。 

2设计思路及其实现 

2.1设计思路 

T0p等工具是访问系统的内部信息,读取或设置内部数据结构的值。这些工具的实现完全可以基于,proc 

文件系统来实现,在清楚T/proc文件系统的工作过程后,这种技术变得简单易行。可以借助LKM技术在内 

核空间编写代码,填写proc dir entyr结构体,建 ̄/proc文件系统下的”文件节点”,实现read_proe O和 

write

_

proc0等函数,收集感兴趣的数据到内核的缓冲区page中。 

2.2 Top实现示例 

下面的代码是top工具一个轻量级版本,在Linux2.4.20(Redhat 9.O)中编译实现。 

……………………………: 

struct proc dir entyr proc_top; 

int list tasks(char page,char start,off_t off,int count,int eof,void data) 

( 

int size=O: 

struct task struct p; 

char state; 

size+=sprintf(page+size,”%5s%7s%7s%7s%7s%7s%s\nknII flPIDIf flUID”,”PRIOII IiSTATEII IIUSERt","SYSt” 

COMMAND”); 

read lock(&tasklist lock);/*同步控制,加锁读取进程链 , 

for_each

process(p) 扫描整个进程链表 , 

{ 

if((int)p一>state==一1)state= ;/ 进程状态,僵死 / 

else if((int)p->state==o)state=,R ;/ 运行 / 

else state= ;/ 挂起 / 

size+=sprintf(page+size,"%5d%7d%7d%c%7d%7d%sha”,(inOp一>pid,(int)p一>uid,(int)p一>rt_priority,state, 

(int)p->times.tms—utime,(int)p一>times.tms stime,P一>comm); 

………………………。 …。; 

l 将感兴趣的所有进程信息写到page所指的缓冲区中 / 

read

_

unlock(&tasklist_lock);/*解锁 / 

return(size); 

J 

int init module(void) 

维普资讯

第3期 阮越:Linux管理工具在嵌入式系统中一种轻量级的实现方法 

323 

{ 

pr0c—top->read

pr。c=list

_

tasks;/*将我们编写的函数赋给proc_dir_entry中的读函数 / 

_

printk(”。u 。f here\f1”); PID uID PRIO sTATE USER

t sYst…COMMAND 

23 

目录下高二出

面 码经过编 等璧 孳篓 ∞c

现一个 要 文top

过编译后生成内核模块p

 箨件慧 节点

 0c  ?top.。 0:,利 12 0 U: 0:U s三: 1 4 :… ‘,18 …inil  

这时可以使用标准的文件 

蓑 磊 3。。。S u。u.o.. 

~ … 

evendtd

Linux文件操作命令访问它,命令的执行结果大致如图 。:

4 1o 

16: 

0 0 s 

三 

0 o.

…b

..mi

 h

nget

 

ty

3结 论 4 

00 

, 

p 执 

流内核版本中t0p和嵌入式环境d ̄/proc/ 

t0p所需资源的比较,从表2明显可以看 top 

 ̄/proc/top的优势。 Libncurses库,289k—— 

不需要Libncurses库 

/proc/top的局限主要有两点:(1)/proc/文件系统,352 k(54 k/usr/bin/top+298 k libs) 

文件系统,2k(内核2.4.20) 

t0p需要在内核空间编写代码,如果出现错 些二夏 墨 塑旦 

43个系统调用 

误,对整个系统可能是致命的;(2)/proc在不同的内核版本中差别较大,移植需要较多的工作。但只要对内 

核代码和结构有清晰地了解,这两个局限是完全可以克服的。 

参考文献: 

[11] Alessandro Rubini.Linux设备驱动程序【M].第二版.北京:中国电力出版社,2002. 

[2】Terrehon Bowden.The proc-howto[EB/OL].http://www.1inuxfomm.com/llnux—filesystem/proc.html,200401—10/2005—09—20. 

【3】Peter Jay Salzman,Michael Burian,Ori Pomerantz.The Linux Kernel Module Programming Guide【EWOE].http://www.tldp.org, 

guides.html,2005-05-12/2005-09-20. 

[4][美】博韦&西斯特.深入理解Linux内核【M].第二版.北京:中国电力出版社,2004. 


本文标签: 系统 文件 内核 空间 函数