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.
版权声明:本文标题:Linux管理工具在嵌入式系统中一种轻量级的实现方法 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.roclinux.cn/p/1735255799a1642271.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论