某网上书店系统分析报告书(带图)_第1页
某网上书店系统分析报告书(带图)_第2页
某网上书店系统分析报告书(带图)_第3页
某网上书店系统分析报告书(带图)_第4页
某网上书店系统分析报告书(带图)_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、某网上书店系统分析报告书 报告简介本报告在某网上书店系统规划报告的基础上,对要实现的电子商务系统进行需求调查,使用UML用例图和活动图来描述调查得到的需求。然后,对调查得到的需求进行详细的分析和描述,编写需求模型报告。 本报告还要根据形成的需求模型一步步得到分析模型,使用类图和协作图来分析各个用例,画出系统的分析类和用例实现过程,编写分析模型报告。2 建立需求模型概述2.1 建立用例模型的体系结构图根据对某网上书店系统规划报告中功能模块的分析,结合对实际电子商务系统的调查,最终得出系统的体系结构图。该网上书店体系结构图如下图所示。订单管理订单管理图书管理管理员登录图书选购用户注册用户登录购物车

2、管理查看订购网上书店用户子系统管理员子系统图1 “网上书店”体系结构图在UML中,这种体系结构的表现方式是通过分组元素(即包元素)来实现的,在Rational Rose中应该按如下步骤建立该需求体系结构。首先在Rational Rose的Use Case View中的Main用例图中使用 建立“网上书店系统”包,如下图2所示。图2 “网上书店系统”包然后双击该包图,进入下一级用例图中,建立“管理员子系统 ”和“用户子系统 ”两个包,再分别双击两个包,进入相应的包以建立下一级结构,最终得到系统的体系结构。用例模型的体系结构图如图3所示。图3 用例模型的体系结构图2.2 用例图的画法建立了用例模型

3、的体系结构图之后,下面以用户子系统的“图书选购”功能为例介绍用例图的画法。在“图书选购”上单击右键,建立“图书选购”用例图,如图4所示。图4 创建“图书选购”用例图在这个用例中,有一个参与者(即顾客)和一个用例(即图书选购),根据分析可知,“图书选购”用例可以分解成两个用例,即“浏览图书”和“加入购物车”,最终得到用例图“图书选购”,如图5所示。图5 “图书选购”用例图创建“图书选购”活动图 在上述步骤中仅仅画出“图书选购”的用例图,是不能够准确地表达“图书选购”这一用例的商业流程的,还需要对这一用例进行解释和说明,活动图就是一个对用例进行解释说明的很好的工具,下面是创建“图书选购”活动图的过

4、程。 首先在“图书选购”包中通过单击右键创建“图书选购”活动图,如图6所示。图6 创建“图书选购”活动图然后根据需求调查的结果,画出活动图。使用泳道 来区分活动的发出者,如图7所示。图中的 和 分别表示用例的启动和终止。要注意区分图中状态机的图标 和活动图中活动图标 的不同, 用来表示一个个的活动。图7 “图书选购”活动图接下来的工作是对用例进行描述,也就是对需求进行文档化描述。事实上有许多种描述方法,既可以只用一段自然文字和使用结构化的一段文字描述,也可以使用图形进行描述(事实上,活动图就是对用例的一种描述)。下面通过使用给出的用例的文档化模版对用例进行描述,用例描述如下: 3 图书选购3.

5、1 简单描述 本用例允许用户在线选购图书3.2 前置条件 用户选书前必须登陆3.3 后置条件 用户选择自己需要的图书,并将其添加到购物车中3.4 事件流 3.4.1 基流 当用户想要进行图书选购时,用例启动 (1)用户单击选择选书页面 (2)系统显示图书列表 (3)用户提出选购图书 (4)系统检查是否缺货(E-1),购物车中加入相应的图书信息 3.4.2 替代流 E-1:缺货时,屏幕显示缺货信息页面。用户选择缺货策略(放弃还是等待直到有货)在给出的用例文档化模版中,前置条件说明了用例开始前应该使系统所处的状态,后置条件说明了用例结束后对系统的改变。基流也叫做事件的成功流,说明了在整个过程中没有

6、任何错误的情况下用例的事件流程。实际上,作为用例描述,应该可以在用例模型中显示,Rational Rose在用例中添加了用例描述的功能。用户双击用例“图书选购”图标,得到它的细节界面,如图8所示。图8 添加用例描述在Documentation文本框中添加用例的描述和非功能性需求。对体系结构中的每个包的每个元素都做完以上几项(即用例图、活动图和用例)描述之后,就基本完成了需求模型的建立。这里说基本并不是完全的意思,即在系统的开发进程中发现一些新的需求和描述不正确的需求时,可继续在此基础上对其进行修改和维护。 建立需求模型的详细步骤3.1 “用户注册”模块1)使用用例图“用户注册”用例图如图9所示

7、图9 “用户注册”用例图2)使用活动图“用户注册”活动图如图10所示图10 “用户注册”活动图3)进行需求描述1 “用户注册” 1.1 简单描述 本用例用于用户的注册和个人信息的填写 1.2 前置条件 无 1.3 后置条件 用例成功后,添加一名新用户 1.4 “事件流” 1.4.1 基流 当用户希望注册个人信息以使用本系统时,用例启动 (1)系统转到用户注册页面,提示用户输入个人信息 (2)用户输入个人信息 (3)系统检查信息是否由有效(E-1)(是否已注册,邮箱是否可用,密码是否过于简单),将信息存入数据库 1.4.2 替代流 E-1:如果用户输入的注册信息无效,系统显示错误信息并转到错误页

8、面,用户重新填写信息;或者取消注册,用例结束 3.2 “用户登陆”模块1)使用用例图“用户登陆”用例图如图11所示图11 “用户登陆”用例图2)使用活动图“用户登陆”活动图如图10所示图12“用户登陆”活动图3)进行需求描述2 “用户登陆” 2.1 简单描述 本用例用于用户登陆系统 2.2 前置条件 无 2.3 后置条件 用例成功后,用户登陆进入系统 2.4 事件流 2.4.1 基流 当用户提出登陆进入系统请求时,用例启动 (1)系统转到用户登陆页面,提示用户输入用户名和密码 (2)用户填写用户名和密码信息 (3)系统验证输入的用户名和密码,若正确(E-1),则转到首页,系统激活这一用户 2.

9、4.2 替代流 E-1:如果用户输入无效的用户名和(/或)密码,系统显示错误信息。用户可以选择返回基流的起始点,重新输入正确的用户名和(/或)密码;或者取消登陆,用例结束 “图书选购”模块1)使用用例图“图书选购”用例图如图13所示图13“图书选购”用例图2)使用活动图“图书选购”活动图如图14所示图14“图书选购”活动图3)进行需求描述3 图书选购3.1 简单描述 本用例允许用户在线选购图书3.2 前置条件 用户选书前必须登陆3.3 后置条件 用户选择自己需要的图书,并将其添加到购物车中3.4 事件流 3.4.1 基流 当用户想要进行图书选购时,用例启动 (1)用户单击选择选书页面 (2)系

10、统显示图书列表 (3)用户提出选购图书 (4)系统检查是否缺货(E-1),购物车中加入相应的图书信息 3.4.2 替代流 E-1:缺货时,屏幕显示缺货信息页面。用户选择缺货策略(放弃还是等待直到有货) “购物车管理”模块 1)使用用例图“购物车管理”用例图如图15所示图15“购物车管理”用例图2)使用活动图“购物车管理”活动图如图16所示图16“购物车管理”活动图3)进行需求描述4 “购物车管理” 4.1 简单描述 本用例用于用户管理购物车 4.2 前置条件 用户需登陆系统 4.3 后置条件 用例成功后,购物车中商品状态发生变化 4.4 事件流 4.4.1 基流 当用户提出管理购物车时,用例启

11、动 (1)系统转到购物车管理页面 (2)用户提出所要执行的操作 如果用户需要添加图书,则执行分支流S-1:添加图书 如果用户需要删除图书,则执行分支流S-2:删除图书 4.4.2 分支流 S-1:添加图书 用户输入书号,购物车中加入相应图书 S-2:删除图书 用户单击删除按钮,相应的图书被删除 “查看订单”模块 1)使用用例图“查看订单”用例图如图17所示图17“查看订单”用例图2)使用活动图“查看订单”活动图如图18所示图18“查看订单”活动图3)进行需求描述 5 “查看订单”5.1 简单描述 本用例用于用户查看订单5.2 前置条件 用户登陆5.3 后置条件 用例成功后,列出所有符合该用户的

12、订单5.4 事件流 5.4.1 基流 当用户提出查看订单时,用例启动 系统列出所有符合该用户要求的订单“管理员登陆”模块 1)使用用例图“管理员登陆”用例图如图19所示图19“管理员登陆”用例图2)使用活动图“管理员登陆”活动图如图20所示图20“管理员登陆”活动图3)进行需求描述8 “管理员登陆” 8.1 简单描述 本用例用于管理员登陆系统 8.2 前置条件 无 8.3 后置条件 用例成功后,管理员登陆进入系统 8.4 事件流 8.4.1 基流 当管理员提出登陆进入系统请求时,用例启动 (1)系统转到管理员登陆页面,提示用户输入用户名和密码 (2)管理员填写用户名和密码信息 (3)系统验证输

13、入的用户名和密码,若正确(E-1),则转到首页,系统激活这一用户 8.4.2 替代流 E-1:如果管理员输入无效的用户名和(/或)密码,系统显示错误信息。管理员可以选择返回基流的起始点,重新输入正确的用户名和(/或)密码;或者取消登陆,用例结束“图书管理”模块 1)使用用例图“图书管理”用例图如图21所示图21“图书管理”用例图2)使用活动图“图书管理”活动图如图22所示图22“图书管理”活动图3)进行需求描述6 “图书管理”6.1 简单描述 本用例用于管理员管理图书信息6.2 前置条件 管理员登陆6.3 后置条件 用例成功后,图书信息被添加、改变或删除6.4 事件流 6.4.1 基流 管理员

14、提出查看图书时,用例启动 (1)系统列出所有符合该管理员要求的图书 (2)管理员提出所要执行的操作 如果管理员需要修改图书信息,则执行分支流S-1:修改图书信息 如果管理员需要删除图书信息,则执行分支流S-2:删除图书信息 如果管理员需要添加图书信息,则执行分支流S-3:添加图书信息 6.4.2 分支流 S-1:修改图书信息 进入图书信息修改界面,修改并保存图书信息 S-2:删除图书信息 管理员单击删除按钮,相应的图书被删除并更新数据库 S-3:添加图书信息 进入图书信息添加页面,添加并保存图书信息 “订单管理”模块 1)使用用例图“订单管理”用例图如图23所示图23“订单管理”用例图2)使用

15、活动图“订单管理”活动图如图24所示图24“订单管理”活动图3)进行需求描述7 “订单管理” 7.1 简单描述 本用例用于管理员管理订单 7.2 前置条件 管理员登陆 7.3 后置条件 用例成功后,订单信息被修改或被删除 7.4 事件流 7.4.1 基流 管理员提出符合该管理员要求的订单时,用例启动 (1)系统列出所有符合该管理员要求的订单 (2)管理员提出所要执行的操作 管理员修改订单,执行分支流S-1:修改订单 管理员删除订单,执行分支流S-2:删除订单 7.4.2 分支流 S-1:修改订单 进入订单修改界面,修改并保存 S-2:删除订单 管理员单击删除按钮,相应的订单被删除建立分析模型概

16、述 在前述内容中,我们使用用例图、活动图和用例的一种结构化文档描述方法对系统的需求进行了分析。需求模型表现了业务人员眼中系统存在的状态和工作的流程,而分析工作流程的目的是在于找出实体类、控制类和边界类。这些类是业务活动中应该存在的一些实体概念,将其提取出来抽象成为类,然后再使用协作图分析它们之间的交互情况,从而不仅又一次明确了功能需求,也为在设计阶段设计出真正的可编程的类打下了基础,因此这是一个承前启后的过程。 仍以“图书选购”这一个功能为例,下图是对它进行功能结构的描述。3 图书选购3.1 简单描述 本用例允许用户在线选购图书3.2 前置条件 用户选书前必须登陆3.3 后置条件 用户选择自己

17、需要的图书,并将其添加到购物车中3.4 事件流 3.4.1 基流 当用户想要进行图书选购时,用例启动 (1)用户单击选择选书页面 (2)系统显示图书列表 (3)用户提出选购图书 (4)系统检查是否缺货(E-1),购物车中加入相应的图书信息 3.4.2 替代流 E-1:缺货时,屏幕显示缺货信息页面。用户选择缺货策略(放弃还是等待直到有货) 4.1 筛选得到分析类现在需要从上述功能结构的描述中找出可以作为分析类存在的功能实体,进而通过筛选得到分析类。发现类一般要依靠用例描述中的名词或者动宾短语。从上面的功能描述中筛选出所有的名词和动宾短语,如“图书”、“选购图书”、“用户”、“购物车”、“选书页面

18、”等。现在假设这5个词就是分析模型中要找的类,下面分析它们的职责。“图书”:其职责是很好界定的,即是客观世界的图书在软件系统中的映射,用来保存图书的基本信息。“选购图书” :其他的职责在于接收用户选择的图书信息,并将信息转移到购物车类中,是一个控制其他类运行的类。“用户”:是客观世界中书店的顾客,在软件系统中的映射。“购物车”:是顾客的购物车或者是顾客挑完书后拿着书的手在软件系统中的映射。“选书页面” :从语言中可以看出它是一个用来交互的类,是用来浏览图书信息的。实际上,分析类可以分为实体类、控制类和边界类3类。从名字中可以看出:实体类对应现实生活中的物体,是它们在软件系统中的映射;控制类用来

19、对各个类之间进行协调和控制;边界类是软件系统用来与参与者进行交互的类。下面介绍3种类的不同表示方法。 下面介绍3 种类的不同表示方法。单击创建一个类图,然后点选 创建三个类1、2、3。双击打开各自的细节选项卡(class specification),在stereotype下拉条中选择entity、control或者boundary,从而分别将其改变成实体类、控制类和边界类,如图25所示。图25 实体类、控制类和边界类画出分析类图 筛选得到分析类后就要画出分析类图了。 首先要弄清楚各类之间的关系,这时采用一个小技术CRC卡片就十分有效。CRC(Class Responsibility Card

20、)是一种如图26所示的卡片。图书用来保存图书的基本信息选购图书图26 CRC卡片卡片的上面为类的名称,左面为类的职责,右面标示出与其有关系的类。因此,在一个存在很多类的系统中,可以逐个地考虑该类与其他所有类是否有关系、有什么样的关系,保证不会遗漏类之间的关系。从而在完成了对发现的类之间的关系判断之后,就可以画出类图了。当然,在此之前还是要像上个实验一样建立体系结构。在logic view中加入包 “网上书店系统分析模型”,然后按照各自的功能模块分包,最终得到体系结构。通过以上步骤,得到“图书选购”用例的分析类图,如图27所示。图27 “图书选购”用例分析类图在画出分析类图后,仍然需要对类图中的

21、每个类进行描述,说明其各自的职责。这些可以添加在细节选项卡(class specification)的documentation中。 进行分析模型中的用例实现 画出分析类图后,就需要进行分析模型中的用例实现了。所谓用例实现是指使用已经发现的类并进行交互,从而使其完成用例所应该完成的功能。用例实现的关键就是弄清楚分析类是怎样交互而完成任务的。用例实现是使用交互图中的协作图来完成的,以“选购图书”为例,在“选购图书”包上创建“选购图书”协作图,如图28所示。图28 创建“图书选购”协作图在图中创建类对象以及它们之间的交互过程,如图29所示。 图29 “图书选购”协作图建立分析模型的详细步骤5.1

22、“用户注册” 模块1)使用分析类图“用户注册”分析类图如图30所示:图30 “用户注册”分析类图2)使用协作图“用户注册”协作图如图31所示:图31 “用户注册”协作图5.2 “用户登陆” 模块1)使用分析类图“用户登陆”分析类图如图32所示:图32 “用户登陆”分析类图2)使用协作图“用户登陆”协作图如图33所示:图33 “用户登陆”协作图5.3 “图书选购” 模块1)使用分析类图“图书选购”分析类图如图34所示:图34 “图书选购”分析类图2)使用协作图“图书选购”协作图如图35所示:图35 “图书选购”协作图5.4 “购物车管理” 模块1)使用分析类图“购物车管理”分析类图如图36所示:

23、图36 “购物车管理”分析类图2)使用协作图“购物车管理”协作图如图37所示:图37 “购物车管理”协作图5.5“查看订单” 模块1)使用分析类图“查看订单”分析类图如图38所示:图38 “查看订单”分析类图2)使用协作图“查看订单”协作图如图39所示:图39 “查看订单”协作图5.6“管理员登陆” 模块1)使用分析类图“管理员登陆”分析类图如图40所示:图40 “管理员登陆”分析类图2)使用协作图“管理员登陆”协作图如图41所示:图41 “管理员登陆”协作图5.7 “图书管理” 模块1)使用分析类图“图书管理”分析类图如图42所示:图42 “图书管理”分析类图2)使用协作图“图书管理”协作图

24、如图43所示:图43 “图书管理”协作图5.8 “订单管理” 模块1)使用分析类图“订单管理”分析类图如图44所示:图44 “订单管理”分析类图2)使用协作图“订单管理”协作图如图45所示:图45 “订单管理”协作图附录资料:不需要的可以自行删除 busybox详解制作根文件系统详解制作根文件系统 一、FHS(Filesystem Hierarchy Standard)标准介绍当我们在linux下输入ls / 的时候,见到的目录结构以及这些目录下的内容都大同小异,这是因为所有的linux发行版在对根文件系统布局上都遵循FHS标准的建议规定。该标准规定了根目录下各个子目录的名称及其存放的内容:目

25、录名存放的内容/bin必备的用户命令,例如ls、cp等/sbin必备的系统管理员命令,例如ifconfig、reboot等/dev设备文件,例如mtdblock0、tty1等/etc系统配置文件,包括启动文件,例如inittab等/lib必要的链接库,例如C链接库、内核模块/home普通用户主目录/rootroot用户主目录/usr/bin非必备的用户程序,例如find、du等/usr/sbin非必备的管理员程序,例如chroot、inetd等/usr/lib库文件/var守护程序和工具程序所存放的可变,例如日志文件/proc用来提供内核与进程信息的虚拟文件系统,由内核自动生成目录下的内容/s

26、ys用来提供内核与设备信息的虚拟文件系统,由内核自动生成目录下的内容/mnt文件系统挂接点,用于临时安装文件系统/tmp临时性的文件,重启后将自动清除制作根文件系统就是要建立以上的目录,并在其中建立完整目录内容。其过程大体包括:编译安装busybox,生成/bin、/sbin、/usr/bin、/usr/sbin目录 利用交叉编译工具链,构建/lib目录 手工构建/etc目录 手工构建最简化的/dev目录 创建其它空目录 配置系统自动生成/proc目录 利用udev构建完整的/dev目录 制作根文件系统的jffs2映像文件 下面就来详细介绍这个过程。二、编译安装busybox,生成/bin、/

27、sbin、/usr/bin、/usr/sbin目录这些目录下存储的主要是常用命令的二进制文件。如果要自己编写这几百个常用命令的源程序,my god, 这简直是一个噩梦!好在我们有嵌入式Linux系统的瑞士军刀busybox,事情就简单很多。1、从 HYPERLINK / / 下载busybox-1.7.0.tar.bz22、tar xjvf busybox-1.7.0.tar.bz2解包3、修改Makefile文件175 ARCH ?= arm176 CROSS_COMPILE ?= arm-linux- 4、make menuconfig配置busyboxbusybox配置主要分两部分。第一

28、部分是Busybox Settings,主要编译和安装busybox的一些选项。这里主要需要配置:1)、Build Options - Build BusyBox as a static binary (no shared libs),表示编译busybox时,是否静态链接C库。我们选择动态链接C库。2)、Installation Options - Applets links (as soft-links) - (X) as soft-links,表示安装busybox时,将各个命令安装为指向busybox的软链接还是硬链接。我们选择软链接。3)、Installation Options -

29、 (/work/nfs_root/fs_mini3) BusyBox installation prefix,表示busybox的安装位置。我们选择/work/nfs_root/fs_mini34)Busybox Library Tuning。保留Command line editing以支持命令行编辑;保留History size以支持记忆历史命令;选中Tab completion和Username completion以支持命令自动补全 第二部分是Applets,他将busybox的支持的几百个命令分门别类。我们只要在各个门类下选择想要的命令即可。这里我们基本保持默认设置。1)选中Netw

30、orking Utilities - httpd下的Enable -u option,以启用http服务器的功能allows the server to run as a specific user5、编译busyboxmake6、安装busyboxmake install安装完成后,可以看到在/work/nfs_root/fs_mini3目录下生成了binsbinusr/binusr/sbin目录,其下包含了我们常用的命令,这些命令都是指向bin/busybox的软链接,而busybox本身的大小不到800K:dennisdennis-desktop:/work/nfs_root/fs_mi

31、ni3$ lsbin linuxrc sbin usrdennisdennis-desktop:/work/nfs_root/fs_mini3$ ls -l bintotal 740lrwxrwxrwx 1 dennis dennis 7 2010-04-03 23:57 addgroup - busyboxlrwxrwxrwx 1 dennis dennis 7 2010-04-03 23:57 adduser - busyboxlrwxrwxrwx 1 dennis dennis 7 2010-04-03 23:57 ash - busybox-rwxr-xr-x 1 dennis den

32、nis 749632 2010-04-03 23:57 busyboxlrwxrwxrwx 1 dennis dennis 7 2010-04-03 23:57 cat busybox 而普通PC机上的ls命令就有差不多80K的大小: dennisdennis-desktop:/work/nfs_root/fs_mini3$ ls -l /bin/ls-rwxr-xr-x 1 root root 78004 2007-09-29 20:51 /bin/ls busybox以它娇小的身躯容纳了数以百计的命令代码,实在是让人佩服不已,其不愧嵌入式系统瑞士军刀之美誉。据说,busybox的作者身患绝

33、症,这更让人钦佩GNU开源软件的作者们。 三、利用交叉编译工具链,构建/lib目录 光有应用程序(命令)是不够的,因为应用程序本身需要使用C库的库函数,因此还必需制作for ARM的C库,并将其放置于/lib目录。my god,要自己写C库的源代码吗?不用!还记得交叉编译工具链的3个组成部分吗?交叉编译器、for ARM的C库和二进制工具。哈哈,for ARM的C库是现成的,我们只需要拷贝过来就可以了。遗憾的是:整个C库目录下的文件总大小有26M。而我们根文件系统所在分区不过区区16M而已,根本放不下。怎么办呢? dennisdennis-desktop:/work/nfs_root/fs_m

34、ini3$ du -s -si /work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib26M /work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib 需要C库目录下所有的文件吗?no,absolutely no! 让我们来分析一下glibc库目录下内容的组成。该目录下的子目录和文件共分8类: 目标文件,如crtn.o,用于gcc链接可执行文件 libtool库文件(.la),在链接库文件时这些文件会被用到,比如他们列出了当前库文件所依赖的其它库文件,程序运行时无需这些文件 gconv目录,里面是各种链接脚本,在编译

35、应用程序时,他们用于指定程序的运行地址,各段的位置等 静态库文件(.a),例如libm.a,libc.a 动态库文件 (.so、.so.0-9*) 动态链接库加载器ld-2.3.6.so、ld-linux.so.2 其它目录及文件很显然,第1、2、3、4、7类文件和目录是不需要拷贝的。由于动态链接的应用程序本身并不含有它所调用的C库函数的代码,因此执行时需要动态链接库加载器来为它加载相应的C库文件,所以第6类文件是需要拷贝的。除此之外,第5类文件当然要拷贝。但第5类文件的大小也相当大。dennisdennis-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/

36、arm-linux/lib$ du -c -si *.so* 7.2M total 需要全部拷贝吗?非也,非也!其实,需要哪些库完全取决于要运行的应用程序使用了哪些库函数。如果我们只制作最简单的系统,那么我们只需要运行busybox这一个应用程序即可。通过执行 dennisdennis-desktop:/work/nfs_root/fs_mini3$ arm-linux-readelf -a bin/busybox | grep Shared0 x00000001 (NEEDED) Shared library: libcrypt.so.10 x00000001 (NEEDED) Shared

37、 library: libm.so.60 x00000001 (NEEDED) Shared library: libc.so.6 可知:busybox只用到了3个库:通用C库(libc)、数学库(libm)、加密库(libcrypt),因此我们只需要拷贝这3个库的库文件即可。但是每个库都有4个文件,4个文件都要拷贝吗?当然不是。 dennisdennis-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$ ls -l libcrypt.-*-rwxr-xr-x 1 dennis dennis 30700 2008-01-22 05

38、:32 libcrypt-2.3.6.so-rw-r-r- 1 dennis dennis 23118 2008-01-22 05:32 libcrypt.alrwxrwxrwx 1 dennis dennis 13 2008-12-22 15:38 libcrypt.so - libcrypt.so.1lrwxrwxrwx 1 dennis dennis 17 2008-12-22 15:38 libcrypt.so.1 - libcrypt-2.3.6.sodennisdennis-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/li

39、b$ ls -l libm.-*-rwxr-xr-x 1 dennis dennis 779096 2008-01-22 05:31 libm-2.3.6.so-rw-r-r- 1 dennis dennis 1134282 2008-01-22 05:32 libm.alrwxrwxrwx 1 dennis dennis 9 2008-12-22 15:38 libm.so - libm.so.6lrwxrwxrwx 1 dennis dennis 13 2008-12-22 15:38 libm.so.6 - libm-2.3.6.sodennisdennis-desktop:/work/

40、tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$ ls -l libc.-*-rwxr-xr-x 1 dennis dennis 1435660 2008-01-22 05:48 libc-2.3.6.so-rw-r-r- 1 dennis dennis 2768280 2008-01-22 05:31 libc.a-rw-r-r- 1 dennis dennis 195 2008-01-22 05:34 libc.solrwxrwxrwx 1 dennis dennis 13 2008-12-22 15:38 libc.so.6 - libc-2.3.6.

41、so 4个文件中的.a文件是静态库文件,是不需要拷贝的。另外3个文件是: 实际的共享链接库:libLIBRARY_NAME-GLIBC_VERSION.so。当然需要拷贝。 主修订版本的符号链接,指向实际的共享链接库:libLIBRARY_NAME.so.MAJOR_REVISION_VERSION,程序一旦链接了特定的链接库,将会参用该符号链接。程序启动时,加载器在加载程序前,会检索该文件。所以需要拷贝。 与版本无关的符号链接,指向主修订版本的符号连接(libc.so是唯一的例外,他是一个链接命令行:libLIBRARY_NAME.so,是为编译程序时提供一个通用条目)。这些文件在程序被编译

42、时会被用到,但在程序运行时不会被用到,所以不必拷贝它。关于共享库的2个符号链接的作用的特别说明:当我们使用gcc hello.c -o hello -lm编译程序时,gcc会根据-lm的指示,加头(lib)添尾(.so)得到libm.so,从而沿着与版本无关的符号链接(libm.so - libm.so.6)找到libm.so.6并记录在案(hello的ELF头中),表示hello需要使用libm.so.6这个库文件所代表的数学库中的库函数。而当hello被执行的时候,动态链接库加载器会从hello的ELF头中找到libm.so.6这个记录,然后沿着主修订版本的符号链接(libm.so.6 -

43、 libm-2.3.6.so)找到实际的共享链接库libm-2.3.6.so,从而将其与hello作动态链接。可见,与版本无关的符号链接是供编译器使用的,主修订版本的符号链接是供动态链接库加载器使用的,而实际的共享链接库则是供应用程序使用的。通过以上分析,我们只需要拷贝3个库(每个库各1个主修订版本的符号链接和1个实际的共享链接库)以及动态链接库加载器(1个符号链接和1个实体文件)。步骤如下:dennisdennis-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$ mkdir /work/nfs_root/fs_mini3/li

44、b dennisdennis-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$ cp libcrypt-* /work/nfs_root/fs_mini3/libdennisdennis-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$ cp -l libcrypt.so.* /work/nfs_root/fs_mini3/libdennisdennis-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$

45、cp libm-* /work/nfs_root/fs_mini3/libdennisdennis-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$ cp -l libm.so.* /work/nfs_root/fs_mini3/libdennisdennis-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$ cp libc-* /work/nfs_root/fs_mini3/libdennisdennis-desktop:/work/tools/gcc-3.4.5-

46、glibc-2.3.6/arm-linux/lib$ cp -l libc.so.* /work/nfs_root/fs_mini3/lib dennisdennis-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$ cp -l ld-* /work/nfs_root/fs_mini3/lib 四、手工构建/etc目录 /etc目录存放的是系统程序的主配置文件,因此需要哪些配置文件取决于要运行哪些系统程序。即使最小的系统也一定会运行1号用户进程init,所以我们至少要手工编写init的主配置文件inittab。busybox的in

47、ittab文件的语法、语义与传统的SYSV的inittab有所不同。 inittab文件中每个条目用来定义一个需要init启动的子进程,并确定它的启动方式,格式为:。例如:ttySAC0:askfirst:-/bin/sh 表示子进程要使用的控制台,若省略则使用与init进程一样的控制台 表示运行级别,busybox init程序这个字段没有意义 表示init进程如何控制这个子进程 sysinit:系统启动后最先执行,只执行一次,init进程等待它结束后才继续执行其它动作 wait:系统执行完sysinit条目后执行,只执行一次,init进程等待它结束后才继续执行其它动作 once:系统执行完

48、wait条目后执行,只执行一次,init进程不等待它结束 respawn:启动完once进程后,init进程监测发现子进程退出时,重新启动它 askfirst:启动完respawn进程后,与respawn类似,不过init进程先输出” Please press Enter to activate this console“,等用户输入回车后才启动子进程 shutdown:当系统关机时 restart:Busybox中配置了CONFIG_FEATURE_USE_INITAB,并且init进程接收到SIGUP信号时执行,先重新读取、解析/etc/inittab文件,再执行restart程序 ctr

49、laltdel:按下ctrl+alt+del键时执行,不过在串口控制台中无法输入它 表示进程对应的二进制文件。如果前面有-号,表示该程序是“可以与用户进行交互的”我们制作最简单的/etc/inittab文件,其内容如下::sysinit:/etc/init.d/rcS:askfirst:-/bin/sh:ctrlaltdel:/sbin/reboot:shutdown:/bin/umount -a r 制作最简单的脚本程序文件/etc/init.d/rcS,其内容如下: #!/bin/shifconfig eth0 7修改shell脚本文件/etc/init.d/rcS的权限,以使其可被执行:

50、# chmod a+x /etc/init.d/rcS五、手工构建最简化的/dev目录 在linux机器上,执行ls /dev可看到几百个设备文件,我需要手工创建它们吗?maybe,我只需要手工创建几个设备文件!我怎么知道我应该创建哪几个设备文件呢?管它呢,先看看开发板上可爱的linux的反应再说。 启动Linux操作系统,显示: VFS: Mounted root (nfs filesystem).Freeing init memory: 112KWarning: unable to open an initial console. 这说明,内核已经成功挂载根文件系统,但却未能成功启动第1个

51、用户进程init。通过错误消息“unable to open an initial console”搜索内核源代码,找到init/main.c文件。748 static int noinline init_post(void)749 750 free_initmem();751 unlock_kernel();752 mark_rodata_ro();753 system_state = SYSTEM_RUNNING;754 numa_default_policy();755 756 if (sys_open(const char _user *) /dev/console, O_RDWR,

52、0) 0)757 printk(KERN_WARNING Warning: unable to open an initial console.n);758 759 (void) sys_dup(0);760 (void) sys_dup(0);761 762 if (ramdisk_execute_command) 763 run_init_process(ramdisk_execute_command);764 printk(KERN_WARNING Failed to execute %sn,765 ramdisk_execute_command);766 767 768 /*769 *

53、 We try each of these until one succeeds.770 *771 * The Bourne shell can be used instead of init if we are772 * trying to recover a really broken machine.773 */774 if (execute_command) 775 run_init_process(execute_command);776 printk(KERN_WARNING Failed to execute %s. Attempting 777 defaults.n, exec

54、ute_command);778 779 run_init_process(/sbin/init);780 run_init_process(/etc/init);781 run_init_process(/bin/init);782 run_init_process(/bin/sh);783 784 panic(No init found. Try passing init= option to kernel.);785 显然,内核错误是由175行不能打开/dev/console所致。通过查看已经安装好的linux机器的/dev/console设备文件,可知其是字符设备文件,主设备号为5,次

55、设备号为1: dennisdennis-desktop:/work/nfs_root/fs_mini3/etc$ ls -l /dev/consolecrw- 1 root root 5, 1 2010-04-08 08:40 /dev/console 因此,我们使用下面的命令创建它: HYPERLINK mailto:dennisdennis-desktop:/work/nfs_root/fs_mini3/dev$ dennisdennis-desktop:/work/nfs_root/fs_mini3/dev$ sudo mknod console c 5 1 还需要创建其它设备文件吗?只

56、有天知道!再看看linux的反应。 VFS: Mounted root (nfs filesystem).Freeing init memory: 112Kinit: cant open /dev/null: No such file or directory 这次我们有经验了,如法炮制,创建/dev/null设备文件:dennisdennis-desktop:/work/nfs_root/fs_mini3/dev$ sudo mknod null c 1 3 再次重启开发板上的linux,显示 VFS: Mounted root (nfs filesystem).Freeing init m

57、emory: 112Kinit started: BusyBox v1.7.0 (2010-04-03 23:53:55 CST)starting pid 229, tty : /etc/init.d/rcS Please press Enter to activate this console.starting pid 231, tty : /bin/sh# 哈哈,我们成功了,终于可以K歌去了。六、创建其它空目录K完歌回来,继续战斗。dennisdennis-desktop:/work/nfs_root/fs_mini3$ mkdir home root proc sys tmp mnt var再次重启动开发板上的linux。咦,似乎有些问题。VFS: Mounted root (nfs filesystem).Freeing init memory: 112Kinit started: BusyBox v1.7.0 (2010-04-03 23:53:55 CST)starting pid 229, tty : /etc/init.d/r

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论