当前位置:文档之家› Linux程序设计模式(机制与策略)

Linux程序设计模式(机制与策略)

Linux程序设计模式(机制与策略)
Linux程序设计模式(机制与策略)

Linux程序设计模式—机制与策略

什么是设计模式(Design pattern)?

设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、软件设计经验的总结。使用设计模式是为了提高代码或模块的重用、让程序更容易被他人理解、提高代码可靠性和可维护性。同时,通过学习设计模式可以降低解决一般性问题的开发难度。

Linux程序设计模式的起源和发展

Linux程序的设计模式起源于Unix文化,是Unix哲学的重要组成部分,而Linux本身就是Unix的一个发展分支。Unix哲学说来不算是一种正规设计方法,它是自下而上的,而不是自上而下的。Unix哲学注重实效,立足于丰富的经验。你不会在正规方法学和标准中找到它,它更接近于隐性的半本能的知识,即Unix文化所传播的专业经验。它鼓励那种分清轻重缓急的感觉,以及怀疑一切的态度,并鼓励你以幽默达观的态度对待这些。

什么是Unix哲学?

Unix管道的发明人、Unix传统的奠基人之一Doug McIlroy在[McIlroy78]中曾经说过:

I. 让每个程序就做好一件事。如果有新任务,就重新开始,不要往原程序中加入新功能而搞得复杂。

II. 假定每个程序的输出都会成为另一个程序的输入,哪怕那个程序还是未知的。输出中不要有无关的信息干扰。避免使用严格的分栏格式和二进制格式输入。不要坚持使用交互式输入。

III. 尽可能早地将设计和编译的软件投入试用, 哪怕是操作系统也不例外,理想情况下, 应该是在几星期内。对拙劣的代码别犹豫,扔掉重写。

IV. 优先使用工具而不是拙劣的帮助来减轻编程任务的负担。工欲善其事,必先利其器。后来他这样总结道(引自《Unix的四分之一世纪》):

Unix哲学是这样的:一个程序只做一件事,并做好。程序要能协作。程序要能处理文本流,因为这是最通用的接口。

从整体上来说,可以概括为以下几点:

01.模块原则:使用简洁的接口拼合简单的部件。

02.清晰原则:清晰胜于机巧。

03.组合原则:设计时考虑拼接组合。

04.分离原则:策略同机制分离,接口同引擎分离。

05.简洁原则:设计要简洁,复杂度能低则低。

06.吝啬原则:除非确无它法,不要编写庞大的程序。

07.透明性原则:设计要可见,以便审查和调试。

08.健壮原则:健壮源于透明与简洁。

09.表示原则:把知识叠入数据以求逻辑质朴而健壮。

10.通俗原则:接口设计避免标新立异。

11.缄默原则:如果一个程序没什么好说的,就沉默。

12.补救原则:出现异常时,马上退出并给出足够错误信息。

13.经济原则:宁花机器一分,不花程序员一秒。

14.生成原则:避免手工hack,尽量编写程序去生成程序。

15.优化原则:雕琢前先要有原型,跑之前先学会走。

16.多样原则:决不相信所谓“不二法门”的断言。

17.扩展原则:设计着眼未来,未来总比预想来得快。

给大家推荐一本书《UNIX 编程艺术》————这不是一本讲如何编程的书,而是一本讲UNIX设计哲学的书,当然也适应于Linux。这本书是我来威胜工作后,同事们推荐我读的第二

本书(范律推荐)。第一本书是《UNIX环境高级编程》(邱云松推荐),第三本书是《UNIX网络编程第2卷进程间通信》(张栋推荐),第四本书是《Linux设备驱动程序第三版》(刘利方推荐),第五本书是《linux程序设计第三版》(我推荐)。

什么是机制与策略?

我们通过下面文字来理解什么是机制与策略:

设备驱动程序的作用在于提供机制,而不是提供策略。

X(windows)致力于提供一套机制,而不是策略。

策略相对短寿,而机制才会长存。

前端实现策略,后端实现机制。

策略和机制是按照不同的时间尺度变化的,策略的变化要远远快于机制。

把策略同机制揉成一团有两个负面影响:一来会使策略变得死板,难以适应用户需求的改变,二来也意味着任何策略的改变都极有可能动摇机制。

相反,将两者剥离,就有可能在探索新策略的时候不足以打破机制。另外,我们也可以更容易为机制写出较好的测试(因为策略太短命,不值得花太多精力在这上面)。

机制与策略的实例:

(下面的讲解过程中,我会提出一些问题。如果回答错误将会有一个小小的惩罚)

1.Uboot的环境变量

(bootcmd)

2.Linux驱动程序

(examples/scull)

3.cmdline中的mtdparts解析程序

(linux-2.6.32.2/drivers/mtd/cmdlinepart.c)

4.udev的rules文件自动执行U盘脚本

(60-removable-storage.rules)

5.udev的net.agent,实现USB网卡的自动挂接

(80-drivers.rules)

6.BusyBox工具集介绍

(sed,awk,inetd,chat,crond,find,grep,getty-login-bash,start-stop-daemon,run-parts)

7.嵌入式数据库

(TokyoCabinet,Sqlite3)

8.脚本语言

(SHELL,TCLSH,Lua,TCC,python)

9.图形界面库

(qt,pyGTK)

MCU嵌入式系统中的机制与策略:

MCU(Micro Control Unit,微控制器单元)片上集成外围器件,没有外扩总线,不带MMU 单元是其的主要特征,比如ARM7,Cortex-M3系列等。与之相对的是MPU(Micro Processor Unit,微处理器单元)不带外围器件(例如存储器),是高度集成的通用结构的处理器,比如ARM926,Cortex-A8系列等。

在资源非常紧张的深度嵌入式系统中,同样也有使用机制与策略设计模式的成功案例与成熟方案。例如:

1.p Forth,eForth,RetroForth

Forth是六十年代末期,由Charles H. Moore发展出来在天文台使用的电脑自动控制系统及程序设计语言,允许使用者很容易组合系统已有的简单指令,定义成为功能较复杂的高阶指

令。forth是一种可扩展的,交互式的语言。最初为小型的嵌入式电脑设计的,现在它几乎可以

在任何主流的芯片上解译和编译,甚至已有多种可直接运行forth指令的芯片。

https://www.doczj.com/doc/101727918.html,/

https://www.doczj.com/doc/101727918.html,/~bimu/forth/

https://www.doczj.com/doc/101727918.html,/pforth/

2. Pawn, Pawn+freeRTOS

An embedded scripting language formerly called Small.

pawn is a simple, typeless, 32-bit extension language with a C-like syntax. A pawn "source" program is compiled to a binary file for optimal execution speed. The pawn compiler outputs P-code (or bytecode) that subsequently runs on an abstract machine. Execution speed, stability, simplicity and a small footprint were essential design criteria for both the language and the abstract machine.

https://www.doczj.com/doc/101727918.html,/pawn/pawn.htm

3. eLua, nutlua(Lua+Nut/OS)

eLua stands for Embedded Lua and the project aims to offer the full implementation of the Lua Programming Language to the embedded world, extending it with specific features for efficient and portable software embedded development.

https://www.doczj.com/doc/101727918.html,/

http://www.ethernut.de/en/firmware/nutlua.html

Forth、Pawn和Lua在其他领域的应用:

Atari 的许多投币游戏机都是用 Forth 开发的。他们相信开发高性能代码的最快方法是使

用 Forth ,加上使用汇编语言来重写最内层的循环。按照最近与著名的 Infocom 高级游戏开

发者的谈话,他们的游戏解释器也是用 Forth 写成的。

Unison World 为 CP/M 操作系统开发了许多游戏,全部都是用 FIG-Forth 编写的。按他

们技术总监 Marc de Groot 的说法,把一个基于 Z80 的游戏移植到 6502 或者 MC6809 上,

典型的时间不多于 3 个月。

美国 Federal Express (联邦快递)公司的手持式行李分捡系统的程序是用 Forth 编写的。项目经理 Gene Farrar 说,他可以按需要在几个星期内升级新固件,相比而言,其它的小

组维护 C 语言代码则至少需要 6 个月的时间。

1990 年 11 月哥伦比亚航天飞机的 4 个载荷中有 3 个是用 Forth 编程的。按设计团队

之一Johns Hopkins University's Applied Physics Laboratory的 John Hayes 说法,他们

选择 Forth 来解决飞行中的硬件问题,灵活性是一个主要的因素。

SUN 公司把 Forth 用于它的工作站可编程 Boot ROM 中,以每天 500-1000 台的速度发

货,是可编程 Forth 系统中数量最大的。 1994 年 IEEE 1275-1994 将 Forth 用于 BOOT

(初始配置)固件的标准,这也是 POWER PC 通用硬件平台的基础。

在电影《终结者 II :世界末日》中, Cyberdyne Systems T1000 系统的特技效果是基于Morphing 软件包 Forth 产生的。

Pleo是一只可爱的小恐龙,是由富士康公司研发的电子宠物,所有Pleo的个性都是通过PAWN

的脚本实现。官方网站:https://www.doczj.com/doc/101727918.html,

著名的第一人称射击类游戏《CS反恐精英》就是使用了Pawn脚本语言来控制游戏。

而另两款著名的3D

即时策略类游戏《魔

兽争霸3》和RPG类在线游戏《魔兽世界》中也大量使用lua脚本。

还有在移动设备上

一直很火热的游戏《愤怒的小鸟》也

使用lua脚本。

机制与策略设计模式在游戏中的应用是最为广泛的,常常关卡的设计和场景的变换都是利用脚本语言来完成策略部分。而画面的渲染和动画的着色这交给图形引擎库来完成机制功能。

Terminal中的机制与策略:

Terminal平台大量使用了机制与策略的设计模块。在这些方案中,有些做到很简单,有些则做得很灵活。但不管怎样,它们都为解决实际问题做出了重要的贡献。

1.analysis统计分析模块

实时库中的部分数据是通过分析计算从电表上采集的数据而得来的,Analysis.ini就是用来配置这些数据项以及这些数据项的处理方法。

2.taskmanage任务管理

任务管理的工作是在特定的时间将实时库中的数据转存到数据库中。从而生成对应的日月冻结数据、曲线数据等等。这些数据在376.1规约中被称为二类数据。

3.cparam参数管理

参数管理使用的是gdbm+xml的配置方式,主要实现规约解析要求的各类参数,同时也管理部分内部参数。db2xml和xml2db两个工具实现参数文件格式的转换。

4.dbmanage数据管理

数据管理使用的是sqlite数据库,并且将运行时的数据库创建也做成了配置文件的形式。通过修改和增加配置文件的内容就能扩展终端运行时的数据库。

5.shmemory实时库模块

实时库的创建是通过定义C语言中对应的结构体数组来完成的。它提供了抄表程序、统计分析和任务管理需要使用到的数据项,以及这些数据项在共享内存中保存的空间。

6.readmeter总表抄表模块

抄表模块根据readmeter.ini的配置信息决定哪种电表类型抄读哪些数据项。配置文件中的数据项已扩展成为内部规约,与电表规约中的数据项已无一一对应的关系。

7.menu菜单界面模块

菜单界面显示内容是通过XML文件格式来配置的,其中包括shift-acmp.xml,shift-auto.xml,menu.xml三大部分,各地的差异通过变量LOCALE区分开来。

8.proparse规约解析模块

规约解析使用了两套配置文件ini和xml。前者用于配置AFN&FN的数据解析,后者是根据各地情况使用插件对差异项进行配置。前者配置文件还与实时库和数据库有关联。

9.TaskManage抄表管理

抄表管理模块开始时使用ini文件配置,后转为gdbm+xml方式。配置文件主要是设置定时抄读的数据项,这其中使用了一套内部标识,抄读上来数据直接保存到数据库。

10.T askExecutor抄表执行

抄表执行模块使用了ini文件配置,实现内部标识到电表规约数据标识的转换。抄表程序根据电表标识抄读电表的数据,根据内部标识保存从电表抄读上来的数据。

11.w atchdog运行程序监控

通过watchdog.conf配置文件决定要启动哪些程序,以及这些程序的执行方式。当有程序异常退出时,watchdog需要根据配置文件再次启动这些程序。

尽管从开发技术的角度看,机制与策略在Terminal平台上的应用是成功的,但是从维护管理的角度看,这些应用考虑得却不是很够。有以下几点原因:

1.策略没有形成统一的风格。各模块之间的配置风格迥异,没有一位开发员敢说已经掌

握了所有模块的配置。掌握这些配置的学习曲线很高,有些模块的配置文件甚至比代

码还难搞懂。帮助文档也相当滞后,开发人员基本没有整理这类相关的文档或手册。

所以注定这类策略只能由开发模块的人员自己维护。

2.解析策略的机制各有千秋。我们的配置文件有sqlite格式的、gdbm格式的、xml格

式的、ini格式的、自定义格式的、自定义C语言结构数组等等,这样情况最终导致

了代码的冗余,同时抬高了代码维护的成本。各类配置文件的解析性能也参差不齐,

程序对修改的监控也只是轮询方式,也有些配置文件使用起来还比较麻烦,需要经过

几次转换才能生效。

3.机制与策略分离不够彻底。部分模块的策略没有完全从机制中分离出来,其中或多或

少还是存在一些特殊处理的情况。这些特殊处理是对需求不确定的保留,同时也破坏

了机制与策略模式的设计原则,直接的坏处是影响到代码的维护,有时一个新的功能

需要修改多处代码和配置文件才能实现。

4.策略仅仅是低层次的配置。大部分模块设计的策略仅仅是停留在简单设置,没有什么

逻辑上的功能,或者说它不像是脚本更像是配置,这种思路限制了策略的灵活性。但

是如果要提高策略的处理层次,势必需要设计更复杂的处理程序。而事实上,另外一

个原因是参与开发的人员也缺乏相关的经验。

5.借鉴开源项目的经验不足。设计一套优秀的机制与策略的模式需要花费不少时间和精

力,而一般项目不可能会有如此集中的投入。在此情况下本应该最大可能的借鉴开源

项目的代码,但实际上我们却没有这么做,而是选择重新发明新的轮子,尽管这样做

也可以实现功能,但是我们并没有从中获得好处。

目前的情况并不是项目缺乏机制与策略模式的运用,而是对这种模式运用太多太杂,而且总体技术水平偏低,维护成本又偏高。就好比花了很大的力气和很多的时间,却搞了大量的低层次的重复建设一样。现在terminal平台已经逐渐稳定下来,如果再进行大的改进必定是违背了经济原则,维护成本也会随之陡增。这就是设计规划欠下债,越往后偿还代价越大。而就目前的情况来说,我们最重要的不是忙着考虑如何还债,而是要让大家学会如何才能不欠下新的债。这样终有一日欠债才可能真正还清。

机制与策略的测验:

现在我们开始做一个体验项目,目的是通过这个项目深刻理解机制与策略的特点,并能够将其内涵转化为自己的思想,同时运用到实际的工作中。以下是项目的一些情况:

项目名称:远程升级工具(upgrade)

项目经理:(负责考核成员,以及分配任务)

项目成员:(参与培训的所有员工,分为1~2人一组)

开发时间:(有效工时两周)

项目背景:

刚来公司不久的小蒋最近接到一个棘手的新任务。这一次领导要求他开发一个用于给2000台集中器进行远程升级的软件工具。但由于时间紧迫,他必须在两周时间内完成,并且还要马上出差去现场调试。下面的一段对话描述了当时的情况:

小蒋:“这事看起来很困难,两周时间内完成似乎不可能。”

领导:“是的,所以你要想办法,在现有的测试系统上改,这样做会快一些。”

小蒋:“那套代码我完全不熟,况且系统文档不全,编程也非常不规范,很多地方完全搞不懂。我还是要先好好熟悉一下吧。”

领导:“没有那么多考虑的时间,你赶紧去办吧。”

虽然小蒋很委屈,也给自己找了很多理由,但最后还是得接下这个任务。从上面的对话可以看出,领导可能并不了解事情的真相,要在现有的系统上改一改就能用,那只是在理想状态下,如果开发人员对原有代码不够熟悉,可能会犯更多的错误从而将时间花费在反复调试和修

改中。当然,我们也了解到这个项目确实很麻烦,首先,小蒋对于维护这套代码缺乏必要的自信;其次,抛弃它又更需要足够的勇气。如果这个任务交给你,现在又该如何做呢?

(嗯,我想我别无选择。因为我甚至都不知道那个糟糕的测试系统长啥样。。。)

项目名称:通信报文解析器(msgdump)

项目经理:(负责考核成员,以及分配任务)

项目成员:(参与培训的所有员工,分为1~2人一组)

开发时间:(有效工时两周)

项目背景:

最近新手小赵遇到一个烦心的问题,每次分析或调试终端时都会遇到要解析通信报文的问题。他希望能够有一个这样的小工具:能够解析主站与终端或终端与电表之间的通信报文。这件事很有意义,因为手动分析十六进制通信报文不仅费劲、速度慢而且容易出错。他在自己的日记中是这样描述的:

“我快发疯了。今天同时接到5现场技支人员的电话,其中2个要求分析终端与主站通信的问题,3个要求分析终端抄表的问题。而他们都提供的一堆十六进制通信报文足够我分析2两天了,我简直就成了分析报文的工具。这种事情难道不能交给机器来做吗?“事实上,现场集中器的问题分析离不开通信报文。试想一下,如果这些烦琐的工作交给机器来做将是一件多么美好的事情。甚至不需要我们出马,现场工程人员就能轻松搞定。当然,这样的软件工具应该设计得非常灵活,既可以在PC机上使用,又可以在终端中运行。而终端中的应用也只要提供接口或者管道连接,就能将分析报文的工作交给这个小工具来完成。这就是我们想要的:一款通用的报文解析器。

开发步骤:

第一步,确定目标。用几句简短的话概括性的说清楚自己要做的事或对开发软件的描述。

目标要明确且务实,如果目标不实际,宁可降低一些也要保证切实可行。

第二步,分析需求。使用TodoList or MindMaps的方式罗列出软件需要开发的功能点,想得越多表明你考虑得越全面。除此之外,我们还要罗列出相关的测试工作和准备工作等等。

第三步,设计方案。进一步分解需求,并评估每一项工作任务的时间投入和任务规模。最后对所有的工作任务进行优先级排序,并根据实际情况设立项目各阶段的里程碑。

第四步,实现功能。所有功能点应该按照里程碑的要求分阶段实现,并且遵循“短,平,快”的原则。尽可能早的发布中间版本,让测试与研发的工作能够并行起来。

第五步,开始测试。测试工作从分析需求开始就要考虑,并在第一个里程碑到来时,就应该开始着手实施。尽可能早的开展现场测试,现场才是产品应用的真实环境。

考试环境:

项目管理平台:

http://192.168.240.8/redmine/projects/upgrade

http://192.168.240.8/redmine/projects/msgdump

请提前(在本周内)注册帐号

http://192.168.240.8/redmine/account/register

软件开发环境:

192.168.247.3(ssh登录),没有帐号的人员请提前申请。

版本管理软件:

GIT,服务器192.168.247.3

个人将项目建立在 192.168.247.3用户根目录下,例如用户liyao:

upgrade项目:/home/liyao/upgrade/ 目录下。

msgdump项目:/home/liyao/msgdump/ 目录下。

准备工作:

在开始练习前我们还需要学习一些新工具的使用。我会将相关资料罗列在书籍资料中,剩下的就需要靠参与人员自行学习了。这个课件会提前一周发给大家,在这之前我还会以项目经理的身份先完成第一步和第二步(部分),并参与到第三步的讨论,之后的任务才会被分解到每个人手中。建议2人一组结对参与,但组与组之间严禁抄袭。如果发现抄袭者或者拒绝参加者,名单将会交由公司领导处理。

书籍资料:

GIT是一个分布式版本管理工具,被作者称为“傻瓜内容跟踪器”。

git中文教程.pdf

Redmine是一个集成的项目管理平台,使用非常简单,如同论坛发贴一样。

redmine_admin_guide.pdf

redmine_user_guide.pdf

www. https://www.doczj.com/doc/101727918.html,

Tcl是一种脚本语言,常用于作为自动测试的工具,本项目将使用Tcl脚本实现。

系统学习TCL脚本入门教程.pdf

华为TCL培训教程_全_.pdf

Tcl教程.pdf

以上三个新工具简单易学,使用也非常方便,是参加本次测验需要学习的。一般人花费2~3天时间就能基本掌握,此次测验同时也在考验参与人员接受并运用新知识的能力。如果一周准备时间都不能让你上手,那就证明你的自学能力较差或者学习态度存在问题。其他与本次培训有关的参考文档,还包括推荐给大家的书籍和相关资料等有时间也可以看看。考核内容:

测验将考核参与人员以下六个方面:理解沟通,学习总结,技术创新,开发设计,管理规范,工作态度。每项能力最高得分为100分,初试70分及格,补考85分及格。补考方式为延期1周开发时间。评分标准是以完成工作内容的时间、数量和质量进行评判的。

2016Linux程序设计复习题

一、填空题 1、在Linux 系统中,以文件方式访问设备。 2、Linux 内核引导时,从文件/etc/fstab 中读取要加载的文件系统。 3、Linux 文件系统中每个文件用i 节点来标识。 4、全部磁盘块由四个部分组成,分别为引导块、专用块、i 节点表块和数据存储块。 5、链接分为:硬链接和符号链接。 6、超级块包含了i 节点表和空闲块表等重要的文件系统信息。 7、某文件的权限为:drw-r--r-- ,用数值形式表示该权限,则该八进制数为:644 ,该文件属性是目录。 8、前台起动的进程使用Ctrl+C 终止。 9、静态路由设定后,若网络拓扑结构发生变化,需由系统管理员修改路由的设置。 10、网络管理的重要任务是:控制和监控。 11、安装Linux 系统对硬盘分区时,必须有两种分区类型:文件系统分区和交换分区。 12、编写的Shell 程序运行前必须赋予该脚本文件执行权限。 13、系统管理的任务之一是能够在分布式环境中实现对程序和数据的安全 保护、备份、恢复和更新。 14、系统交换分区是作为系统虚拟存储器的一块区域。 15、内核分为进程管理系统、内存管理系统、I/O 管理系统和文件管理系统等四个子系统。 16、内核配置是系统管理员在改变系统配置硬件时要进行的重要操作。 17、在安装Linux 系统中,使用netconfig 程序对网络进行配置,该安装程序会一步步提示用 户输入主机名、域名、域名服务器、IP 地址、网关地址和子网掩码等必要信息。 18、唯一标识每一个用户的是用户ID 和用户名。 19、RIP 协议是最为普遍的一种内部协议,一般称为动态路由选择协议。 20、在Linux 系统中所有内容都被表示为文件,组织文件的各种方法称为文件系统。 21、DHCP可以实现动态IP 地址分配。 22、系统网络管理员的管理对象是服务器、用户和服务器的进程以及系统的各种资源。 23、网络管理通常由监测、传输和管理三部分组成,其中管理部分是整个网络管理的 中心。 24、当想删除本系统用不上的设备驱动程序时必须编译内核,当内核不支持系统上的 设备驱动程序时,必须对内核升级。 25、Ping 命令可以测试网络中本机系统是否能到达一台远程主机,所以常常用于测试网络 的连通性。 26、vi 编辑器具有三种工作模式:命令模式、底行模式和输入模式。 27、可以用ls –al 命令来观察文件的权限,每个文件的权限都用10 位表示,并分为四段, 其中第一段占 1 位,表示文件类型,第二段占 3 位,表示文件所有者对该文件的权限。 28、进程与程序的区别在于其动态性,动态的产生和终止,从产生到终止进程可以具有的基 本状态为:运行态、就绪态和等待态(阻塞态)。 29、DNS实际上是分布在internet 上的主机信息的数据库,其作用是实现IP地址和主

详解bootloader的执行流程与ARM Linux启动过程分析

详解bootloader的执行流程与ARM Linux启动过程分析 ARM Linux启动过程分析是本文要介绍的内容,嵌入式Linux 的可移植性使得我们可以在各种电子产品上看到它的身影。对于不同体系结构的处理器来说Linux的启动过程也有所不同。 本文以S3C2410 ARM处理器为例,详细分析了系统上电后bootloader的执行流程及ARM Linux的启动过程。 1、引言 Linux 最初是由瑞典赫尔辛基大学的学生Linus Torvalds在1991 年开发出来的,之后在GNU的支持下,Linux 获得了巨大的发展。虽然Linux 在桌面PC 机上的普及程度远不及微软的Windows 操作系统,但它的发展速度之快、用户数量的日益增多,也是微软所不能轻视的。而近些年来Linux 在嵌入式领域的迅猛发展,更是给Linux 注入了新的活力。 一个嵌入式Linux 系统从软件角度看可以分为四个部分:引导加载程序(bootloader),Linux 内核,文件系统,应用程序。 其中bootloader是系统启动或复位以后执行的第一段代码,它主要用来初始化处理器及外设,然后调用Linux 内核。 Linux 内核在完成系统的初始化之后需要挂载某个文件系统做为根文件系统(Root Filesystem)。 根文件系统是Linux 系统的核心组成部分,它可以做为Linux 系统中文件和数据的存储区域,通常它还包括系统配置文件和运行应用软件所需要的库。 应用程序可以说是嵌入式系统的“灵魂”,它所实现的功能通常就是设计该嵌入式系统所要达到的目标。如果没有应用程序的支持,任何硬件上设计精良的嵌入式系统都没有实用意义。 从以上分析我们可以看出bootloader 和Linux 内核在嵌入式系统中的关系和作用。Bootloader在运行过程中虽然具有初始化系统和执行用户输入的命令等作用,但它最根本

linux系统编程试卷(答案)

凌阳教育 嵌入式培训系统编程部分测试试题 注:考试为闭卷,程序题需上机操作运行出结果,考试时间为120分钟 一:选择题(本题共4小题,每题3分共12分) 1)下列不是Linux系统进程类型的是( D ) A 交互进程 B 批处理进程 C 守护进程 D 就绪进程(进程状态) 2)以下对信号的理解不正确的是( B ) A 信号是一种异步通信方式 B 信号只用在用户空间进程通信,不能和内核空间交互 C 信号是可以被屏蔽的 D 信号是通过软中断实现的 3)进程有三种状态( C ) A 准备态、执行态和退出态 B 精确态、模糊态和随机态 C 运行态、就绪态和等待态 D 手工态、自动态和自由态 4)不是进程和程序的区别( B) A 程序是一组有序的静态指令,进程是一次程序的执行过程 B 程序只能在前台运行,而进程可以在前台或后台运行 C 程序可以长期保存,进程是暂时的 D 程序没有状态,而进程是有状态的 二:填空题(本题共6小题,2)、3)两题每空四分,其余每空一分。共23分) 1) 列举八种常见的进程间通信方式无名管道、有名管道、消息队列、信号量、共享内存、信号、套接字 网络上两个主机的进程间通信方式为套接字 2) 命名管道比无名管道的优势提供了一个可以访问的路径名,实现没亲缘关系的进程 间通信 3) 消息队列比命名管道和无名管道的优势可以按类型实现消息的随机查询,没必要先 进先出 4) 按照逻辑结构不同进行数据库划分,Sqlite 数据库属于哪一类关系型数据库 5) 在C语言中操作sqlite数据库,常用的2中方式是sqlite_exec(回调)、

sqlite_gettable(非回调) 6) 列举四种进程调度算法先来先调度(FCFS)、短进程优先调度(SPF)、高优先级调度 (HPF)、时间片轮转调度 三:问答题(本题共7题,每题5分,共35分) 1) 什么是系统调用?系统调用是通过什么方式陷入内核态的?请写出你对系统调用的理解。什么是文件I/O和标准I/O库?文件I/O和标准I/O库的区别? 系统调用是指操作系统提供给用户程序调用的一组特殊接口,用户程序可以通过这组接口获得操作系统内核提供的服务。 系统调用是通过软件中断方式陷入内核的 linux的文件I/O是由操作系统提供的基本IO服务, 标准I/O库通过封装系统调用,提供了一个到底层I/O的接口。 标准I/O默认采用了缓冲机制,还创建了一个包含文件和缓冲区相关数据的数据结构;文件I/O一般没有采用缓冲模式,需要自己创建缓冲区。一种是标准库封装系统调用而成,更高级,一种是系统提供的,比较低级;标准I/O可移植性高、文件I/O可移植性低。 2) 什么是进程?用fork()创建一个子进程时,系统会做什么工作 进程是具有独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配的单位,不仅是系统内部独立运行的实体也是独立竞争资源的实体。 用fork()时系统会分配子进程一个ID号然后继承父进程的地址空间,包括进程上下文进程堆栈打开的文件描述符等等,他就是父进程的一个复制品。 3) 进程和线程有什么区别? 每个独立的进程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在进程程中,由进程提供多个线程执行的控制。 进程是系统进行资源分配和调度的一个独立单位. 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源. 一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行。 4) 什么是线程的互斥和同步,程序应怎样写才能达到互斥或同步? 互斥:是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。 同步:是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少数情况是指可以允许多个访问者同时访问资源。 在写程序时可以用互斥锁和信号量实现线程同步,一个线程访问共享资源时给这个资源上锁其他线程就不能访问了直到上锁的进程释放互斥锁为止。 5) 什么是僵尸进程?孤儿进程?守护进程? 僵尸进程:僵尸进程是指它的父进程已经退出(父进程没有等待(调用wait/waitpid)它),而该进程dead之后没有进程接受,就成为僵尸进程,也就是(zombie)进程。 孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成

linux内核启动 Android系统启动过程详解

linux内核启动+Android系统启动过程详解 第一部分:汇编部分 Linux启动之 linux-rk3288-tchip/kernel/arch/arm/boot/compressed/ head.S分析这段代码是linux boot后执行的第一个程序,完成的主要工作是解压内核,然后跳转到相关执行地址。这部分代码在做驱动开发时不需要改动,但分析其执行流程对是理解android的第一步 开头有一段宏定义这是gnu arm汇编的宏定义。关于GUN 的汇编和其他编译器,在指令语法上有很大差别,具体可查询相关GUN汇编语法了解 另外此段代码必须不能包括重定位部分。因为这时一开始必须要立即运行的。所谓重定位,比如当编译时某个文件用到外部符号是用动态链接库的方式,那么该文件生成的目标文件将包含重定位信息,在加载时需要重定位该符号,否则执行时将因找不到地址而出错 #ifdef DEBUG//开始是调试用,主要是一些打印输出函数,不用关心 #if defined(CONFIG_DEBUG_ICEDCC)

……具体代码略 #endif 宏定义结束之后定义了一个段, .section ".start", #alloc, #execinstr 这个段的段名是 .start,#alloc表示Section contains allocated data, #execinstr表示Section contains executable instructions. 生成最终映像时,这段代码会放在最开头 .align start: .type start,#function /*.type指定start这个符号是函数类型*/ .rept 8 mov r0, r0 //将此命令重复8次,相当于nop,这里是为中断向量保存空间 .endr b 1f .word 0x016f2818 @ Magic numbers to help the loader

Linux程序设计报告

Linux程序设计课程设计 Linux程序设计课程组 长春工业大学 2017-12-24

课程设计任务书

目录 第1章设计要求 (1) 2.1设计目的 (1) 2.2设计要求 (1) 第2章测试数据设计 (2) 第3章算法实现 (3) 第4章算法结果 (19) 第5章结果可视化 (21) 第6章性能分析 (21) 参考文献 (22) 心得 (22)

第1章设计要求 2.1设计目的 理解临界区和进程互斥的概念,掌握用信号量和PV操作实现进程互斥的方法。 2.2设计要求 在linux环境下编写应用程序,该程序运行时能创建N个线程,其中既有读者线程又有写者线程,它们按照事先设计好的测试数据进行读写操作。 读者/写者问题描述如下: 有一个被许多进程共享的数据区,这个数据区可以是一个文件,或者主存的一块空间,甚至可以是一组处理器寄存器。有一些只读取这个数据区的线程(reader)和一些只往数据区中写数据的线程(writer)。以下假设共享数据区是文件。这些读者和写者对数据区的操作必须满足以下条件:读—读允许;读—写互斥;写—写互斥。这些条件具体来说就是: (1)任意多的读线程可以同时读这个文件; (2)一次只允许一个写线程往文件中写; (3)如果一个写线程正在往文件中写,禁止任何读线程或写线程访问文件; (4)写线程执行写操作前,应让已有的写者或读者全部退出。这说明当有读者在读文件时不允许写者写文件。 对于读者-写者问题,有三种解决方法: 1、读者优先 除了上述四个规则外,还增加读者优先的规定,当有读者在读文件时,对随后到达的读者和写者,要首先满足读者,阻塞写者。这说明只要有一个读者活跃,那么随后而来的读者都将被允许访问文件,从而导致写者长时间等待,甚至有可能出现写者被饿死的情况。 2、写者优先 除了上述四个规则外,还增加写者优先的规定,即当有读者和写者同时等待时,首先满足写者。当一个写者声明想写文件时,不允许新的读者再访问文件。 3、无优先 除了上述四个规则外,不再规定读写的优先权,谁先等待谁就先使用文件。

《Linux编程环境》样题及参考答案

《Linux编程环境》期末考试样题 一.(共20分,每小题2分)给出完成下列各项功能所需要命令。陈述利用了该命令的哪个功能或选项。 1.如何得知命令netstat众多选项中哪个选项可以打印出IP路由表? 答:使用man命令,man命令可以在线查阅命令的使用手册,使用命令man netstat查出netstat命令的使用手册,看看哪个选项和什么命令格式用来打印出ip的路由表。 2.删除文件名为-f的文件。 答:使用rm命令,由于命令会默认以减号开始的命令行参数为命令处理的选项而不是处理对象,所以需要使用特殊的选项--以显式的方式说明选项的结束。命令为rm -- -i 3.在你完成上机作业过程中,使用什么命令将源程序文件mylist.c编译、 链接生成可执行文件?可执行文件是什么名字?如何运行? 答:使用gcc命令或者make,实现编译和链接 gcc mylist.c –o mylist 或者:make mylist 生成的可执行文件名按照惯例为mylist,一般情况下当前环境变量 PATH不包括当前目录,所以,运行这个可执行程序应当加上当前路径,命令为:./mylist 4.去掉文件list.txt中的所有空行(所谓空行指:行内不含有任何除空格之 外的字符),存为新文件list-new.txt。 答:使用grep命令可以用正则表达式对文本文件过滤,-v选项用于筛选掉能匹配指定正则表达式的行,描述一个空行的正则表达式为^ *$,即:从行首开始(^),有零个到多个空格( *),然后是行尾($),命令为: grep –v ’^ *$’ list.txt > list-new.txt 5.检索目录src以及其子孙目录中的所有文件名后缀为.c和.h文件,查找 哪些文件中含有字符串TPDU,并列出在这文件中的行号。 答:使用find命令和grep命令。find命令可以在指定的目录树中查找满足某个条件的文件或目录,并对查找到的满足条件的对象执行一个动作。指定查找条件为“文件名后缀为.c和.h”,动作为“查找哪些文件中含有字符串TPDU,并列出在这文件中的行号”,分别是find的 -name和-exec选项。完整的命令为: find src –name ”*.[ch]”–exec grep –n TPDU {} /dev/null \;

浙江大学Linux程序设计实验报告

Linux程序设计实验报告1 ——操作系统基本命令使用 一、实验目的 1.通过对Emacs、vi、vim、gedit文本编辑器的使用,掌握在Linux环境下文本文件的编辑方法; 2.通过对常用命令mkdir、cp、cd、ls、mv、chmod、rm等文件命令的操作,掌握Linux操作系统中文件命令的用法。 二、实验任务与要求 1.emacs的使用,要求能新建、编辑、保存一个文本文件 2.vi或vim的使用,要求能新建、编辑、保存一个文本文件 3.gedit的使用,要求能新建、编辑、保存一个文本文件 4.掌握mkdir、cd命令的操作,要求能建立目录、进入与退出目录 5.掌握cp、ls、mv、chmod、rm命令的操作,要求能拷贝文件、新建文件、查看文件、文件重命名、删除文件等操作。 三、实验工具与准备 计算机PC机,Linux Redhat Fedora Core6操作系统 四、实验步骤与操作指导 任务1.学习emacs的使用,要求能新建、编辑、保存一个文本文件 (1)启动emacs (2)输入以下C程序 (3)保存文件为kk.c (4)用emacs打开文件kk.c (5)修改程序 (6)另存为文件aa.txt并退出。 任务2.vi或vim的使用,要求能新建、编辑、保存一个文本文件 (1)点击”应用程序”→ “附件”→“终端”,打开终端,在终端输入命令: [root@localhost root]#vi kk.c 按i键,进入插入状态。 (2)输入以下C程序 #include int main( ) {

printf(“Hello world!\n”); return 0; } 此时可以用Backspace、→、←、↑、↓键编辑文本。 (3)保存文件为kk.c 按Esc键,进入最后行状态,在最后行状态输入:wq保存文件,退出vi。 (4)用vi打开文件kk.c,输入命令: [root@localhost root]#vi kk.c (5)修改程序为: #include int main( ) { printf(" Hello world!\n"); printf("*****************\n"); return 0; } (6)按Esc键,进入最后行状态,在最后行状态输入:wq aa.txt保存文件,如图1所示,另存为文件aa.txt并退出vi。。 图1 程序编辑环境 任务3.gedit的使用,要求能新建、编辑、保存一个文本文件 (1)启动gedit,点击”应用程序”→ “附件”→“文本编辑器”,打开文本编辑器,如图所示。

《Linux程序设计》实验大纲

《Linux程序设计》实验指导书 实验类别:课内实验实验课程名称:Linux程序设计 实验室名称:软件工程专业实验室实验课程编号:N03140112 总学时: 32 学 分: 2 适用专业:软件工程 先修课程: Linux操作系统、C程序设计 实验在教学培养计划中地位、作用: 通过讲授Linux的操作使用、系统结构和Linux环境下的程序设计,使学生对Linux操作系统获得一个全面的认识和掌握。一方面,学生通过学习系统程序设计,能够复习操作系统中的基本概念,对文件管理、进程控制有更深入的理解;另一方面,学生学会在Linux环境下工作,进一步熟悉C语言程序设计和数据结构的知识,编写进行系统维护的脚本文件和实用化的大型应用程序,如网络应用程序。同时,本课程为学生进一步学习其它后续课程(如高级操作系统、Linux内核源代码分析、嵌入式系统等)打下基础。

《Linux程序设计》实验大纲 Linux Program Design 课程类别:学科专业教育课程课程名称:Linux程序设计 开课单位:软件学院课程编号:N03140112 总学时:32 学分:2 适用专业:软件工程 先修课程:程序设计基础 一、实验教学目标 熟练掌握shell编程、熟练使用linux系统、掌握进程控制和进程间通信,学会编写网络程序,学会在linux环境中编写web程序。养成一种良好的程序设计风格。

二、实验环境 Linux 三、实验教材及参考书: [1] 实验指导书(自编讲义) [2]《Linux环境C程序设计》徐诚高莹婷等清华大学出版社2010.1 [3]《linux入门到精通》刘忆智清华大学出版社2010.1 四、实验成绩评定方式 根据学生在实验过程中的认真程度、上机结果验收情况以及实验报告撰写质量,进行综合评定。 五、实验项目及学时分配

linux grub 引导启动过程详解

linux grub 引导启动过程详解 2008-01-08 17:18 这几天看了很多文档,算是对linux的启动过程有了比较细致的了解. 网上有很多文章谈到这方面的内容,但总觉得没有一篇完全的解析linux启动的 细节,下面是我小弟在学习的过程中总结出来的一些东东.这个是完整的linux启动过程, 不涉及内核,但是我觉得比较详细哦. (由于本人比较懒,这一段是从网上抄的) 机器加电启动后,BIOS开始检测系统参数,如内存的大小,日期和时间,磁盘 设备以及这些磁盘设备用来引导的顺序,通常情况下,BIOS都是被配置成首先检查 软驱或者光驱(或两者都检查),然后再尝试从硬盘引导。如果在这些可移动的设 备中,没有找到可引导的介质,那么BIOS通常是转向第一块硬盘最初的几个扇区, 寻找用于装载操作系统的指令。装载操作系统的这个程序就是boot loader. linux里面的boot loader通常是lilo或者grub,从Red Hat Linux 7.2起,GRUB( GRand Unified Bootloader)取代LILO成为了默认的启动装载程序。那么启动的时候grub是如何被载入的呢 grub有几个重要的文件,stage1,stage2,有的时候需要stage1.5.这些文件一般都 在/boot/grub文件夹下面.grub被载入通常包括以下几个步骤: 1. 装载基本的引导装载程序(stage1),stage1很小,网上说是512字节,但是在我的系统上用du -b /boot/grub/stage1 显示的是1024个字节,不知道是不是grub版本不同的缘故还是我理解有误.stage1通常位于主引导扇区里面,对于硬盘就是MBR了,stage1的主要功能就是装载第二引导程序(stage2).这主要是归结于在主引导扇区中没有足够的空间用于其他东西了,我用的是grub 0.93,stage2文件的大小是107520 bit. 2. 装载第二引导装载程序(stage2),这第二引导装载程序实际上是引出更高级的功能, 以允许用户装载入一个特定的操作系统。在GRUB中,这步是让用户显示一个菜单或是输入命令。由于stage2很大,所以它一般位于文件系统之中(通常是boot所在的根 分区). 上面还提到了stage1.5这个文件,它的作用是什么呢你到/boot/grub目录下看看, fat_stage_1.5 e2fs_stage_1.5 xfs_stage_1.5等等,很容易猜想stage1.5和文件系统 有关系.有时候基本引导装载程序(stage1)不能识别stage2所在的文件系统分区,那么这 时候就需要stage1.5来连接stage1和stage2了.因此对于不同的文件系统就会有不同的stage1.5.但是对于grub 0.93好像stage1.5并不是很重要,因为我试过了,在没有stage1.5 的情况下, 我把stage1安装在软盘的引导扇区内,然后把stage2放在格式化成ext2或者fat格式的软盘内,启动的时候照常引导,并不需要e2fs_stage_1.5或者fat_stage_1.5. 下面是我的试验: #mkfs.ext2 /dev/fd0 #mount -t ext2 /dev/fd0 /mnt/floppy #cd /mnt/floppy #mkdir boot #cd boot #mkdir grub (以上三步可用mkdir -p boot/grub命令完成) #cd grub #cp /boot/grub/{stage1,stage2,grub.conf} ./ #cd; umount /mnt/floppy

Linux编程基础复习题

选择题 1. /etc目录的标准应用是用于____ A. 安装附加的应用程序 B. 存放可执行程序、系统管理工具和库 C. 设置用户的主目录 D. 存放用于系统管理的配置文件 ##D 2. Apache服务器默认的接听连接端口号是________。 A. 1024 B. 800 C. 80 D. 8 ##C 3. DNS域名系统主要负责主机名和________之间的解析。 A. IP地址 B. MAC地址 C. 网络地址 D. 主机别名 ##A 4. Linux 将存储设备和输入/输出设备均看做文件来操作,________不是以文件的形式出现。 A. 目录 B. 软链接 C. i节点表 D. 网络适配器 ##C 5. Linux 文件名的长度不得超过________个字符。 A. 64 B. 128 C. 256 D. 512 ##C 6. Linux 系统通过________命令给其他用户发消息。 A. less

B. mesg y C. write D. echo to ##C 7. Linux内核遵守的是下面哪一种许可条款________。 A. GDK B. GDP C. GPL D. GNU ##C 8. Linux包含了一个名称是________的调试程序,它是用来调试C或C++程序的强力调试器,它使用户能在程序运行时观察程序的内部结构和内存的使用情况。 A. gcc B. make C. gdb D. autoconf ##C 9. Linux命令行是由____提供的。 A. 管道 B. 分层结构文件系统 C. 文本处理器 D. shell ##D 10. Linux工作目录用________表示 A. . B. , C. * D. # ##A 11. Linux操作系统的创始人和主要设计者是________ A. Redhat Linux B. AT&T Bell实验室 C. 赫尔辛基大学 D. Linus Torvalds ##D 12. Linux文件权限一共10位长度,分成四段,第三段表示的内容是________。 A. 文件类型 B. 文件所有者的权限

Linux程序设计模式(机制与策略)

Linux程序设计模式—机制与策略 什么是设计模式(Design pattern)? 设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、软件设计经验的总结。使用设计模式是为了提高代码或模块的重用、让程序更容易被他人理解、提高代码可靠性和可维护性。同时,通过学习设计模式可以降低解决一般性问题的开发难度。 Linux程序设计模式的起源和发展 Linux程序的设计模式起源于Unix文化,是Unix哲学的重要组成部分,而Linux本身就是Unix的一个发展分支。Unix哲学说来不算是一种正规设计方法,它是自下而上的,而不是自上而下的。Unix哲学注重实效,立足于丰富的经验。你不会在正规方法学和标准中找到它,它更接近于隐性的半本能的知识,即Unix文化所传播的专业经验。它鼓励那种分清轻重缓急的感觉,以及怀疑一切的态度,并鼓励你以幽默达观的态度对待这些。 什么是Unix哲学? Unix管道的发明人、Unix传统的奠基人之一Doug McIlroy在[McIlroy78]中曾经说过: I. 让每个程序就做好一件事。如果有新任务,就重新开始,不要往原程序中加入新功能而搞得复杂。 II. 假定每个程序的输出都会成为另一个程序的输入,哪怕那个程序还是未知的。输出中不要有无关的信息干扰。避免使用严格的分栏格式和二进制格式输入。不要坚持使用交互式输入。 III. 尽可能早地将设计和编译的软件投入试用, 哪怕是操作系统也不例外,理想情况下, 应该是在几星期内。对拙劣的代码别犹豫,扔掉重写。 IV. 优先使用工具而不是拙劣的帮助来减轻编程任务的负担。工欲善其事,必先利其器。后来他这样总结道(引自《Unix的四分之一世纪》): Unix哲学是这样的:一个程序只做一件事,并做好。程序要能协作。程序要能处理文本流,因为这是最通用的接口。 从整体上来说,可以概括为以下几点: 01.模块原则:使用简洁的接口拼合简单的部件。 02.清晰原则:清晰胜于机巧。 03.组合原则:设计时考虑拼接组合。 04.分离原则:策略同机制分离,接口同引擎分离。 05.简洁原则:设计要简洁,复杂度能低则低。 06.吝啬原则:除非确无它法,不要编写庞大的程序。 07.透明性原则:设计要可见,以便审查和调试。 08.健壮原则:健壮源于透明与简洁。 09.表示原则:把知识叠入数据以求逻辑质朴而健壮。 10.通俗原则:接口设计避免标新立异。 11.缄默原则:如果一个程序没什么好说的,就沉默。 12.补救原则:出现异常时,马上退出并给出足够错误信息。 13.经济原则:宁花机器一分,不花程序员一秒。 14.生成原则:避免手工hack,尽量编写程序去生成程序。 15.优化原则:雕琢前先要有原型,跑之前先学会走。 16.多样原则:决不相信所谓“不二法门”的断言。 17.扩展原则:设计着眼未来,未来总比预想来得快。 给大家推荐一本书《UNIX 编程艺术》————这不是一本讲如何编程的书,而是一本讲UNIX设计哲学的书,当然也适应于Linux。这本书是我来威胜工作后,同事们推荐我读的第二

Linux启动全过程-由bootloader到fs

Linux启动过程 许多人对Linux的启动过程感到很神秘,因为所有的启动信息都在屏幕上一闪而过。其实Linux的启动过程并不象启动信息所显示的那样复杂,它主要分成两个阶段: 1.启动内核。在这个阶段,内核装入内存并在初始化每个设备驱动器时打印信息。 2.执行程序init。装入内核并初始化设备后,运行init程序。init程序处理所有程序的启动, 包括重要系统精灵程序和其它指定在启动时装入的软件。 下面以Red Hat为例简单介绍一下Linux的启动过程。 一、启动内核 首先介绍启动内核部分。电脑启动时,BIOS装载MBR,然后从当前活动分区启动,LILO获得引导过程的控制权后,会显示LILO提示符。此时如果用户不进行任何操作,LILO将在等待制定时间后自动引导默认的操作系统,而如果在此期间按下TAB键,则可以看到一个可引导的操作系统列表,选择相应的操作系统名称就能进入相应的操作系统。当用户选择启动LINUX操作系统时,LILO就会根据事先设置好的信息从ROOT文件系统所在的分区读取LINUX映象,然后装入内核映象并将控制权交给LINUX内核。LINUX内核获得控制权后,以如下步骤继续引导系统: 1. LINUX内核一般是压缩保存的,因此,它首先要进行自身的解压缩。内核映象前面的一些代码完成解压缩。 2. 如果系统中安装有可支持特殊文本模式的、且LINUX可识别的SVGA卡,LINUX会提示用户选择适当的文本显示模式。但如果在内核的编译过程中预先设置了文本模式,则不会提示选择显示模式。该显示模式可通过LILO或RDEV工具程序设置。 3. 内核接下来检测其他的硬件设备,例如硬盘、软盘和网卡等,并对相应的设备驱动程序进行配置。这时,显示器上出现内核运行输出的一些硬件信息。 4. 接下来,内核装载ROOT文件系统。ROOT文件系统的位置可在编译内核时指定,也可通过LILO 或RDEV指定。文件系统的类型可自动检测。如果由于某些原因装载失败,则内核启动失败,最终会终止系统。 二、执行init程序 其次介绍init程序,利用init程序可以方便地定制启动其间装入哪些程序。init的任务是启动新进程和退出时重新启动其它进程。例如,在大多数Linux系统中,启动时最初装入六个虚拟的控制台进程,退出控制台窗口时,进程死亡,然后init启动新的虚拟登录控制台,因而总是提供六个虚拟登陆控控制台进程。控制init程序操作的规则存放在文件/etc/inittab中。Red Hat Linux缺省的inittab文件如下:# #inittab This file describes how the INIT process should set up the system in a certain #run-level. # # #Default runlevel.The runlevels used by RHS are: #0-halt(Do NOT set initdefault to this) #1-Single user mode #2-Multiuser,without NFS(the same as 3,if you do not have networking) #3-Full multiuser mode #4-unused #5-X11 #6-reboot(Do NOT set initdefault to this)

linux系统编程考试(答案)

linux系统编程考试(答案)

————————————————————————————————作者:————————————————————————————————日期:

凌阳教育 嵌入式培训系统编程部分测试试题 注:考试为闭卷,程序题需上机操作运行出结果,考试时间为120分钟 一:选择题(本题共4小题,每题3分共12分) 1)下列不是Linux系统进程类型的是( D ) A 交互进程 B 批处理进程 C 守护进程 D 就绪进程(进程状态) 2)以下对信号的理解不正确的是( B ) A 信号是一种异步通信方式 B 信号只用在用户空间进程通信,不能和内核空间交互 C 信号是可以被屏蔽的 D 信号是通过软中断实现的 3)进程有三种状态( C ) A 准备态、执行态和退出态 B 精确态、模糊态和随机态 C 运行态、就绪态和等待态 D 手工态、自动态和自由态 4)不是进程和程序的区别( B) A 程序是一组有序的静态指令,进程是一次程序的执行过程 B 程序只能在前台运行,而进程可以在前台或后台运行 C 程序可以长期保存,进程是暂时的 D 程序没有状态,而进程是有状态的 二:填空题(本题共6小题,2)、3)两题每空四分,其余每空一分。共23分) 1) 列举八种常见的进程间通信方式无名管道、有名管道、消息队列、信号量、共享内存、信号、套接字 网络上两个主机的进程间通信方式为套接字 2) 命名管道比无名管道的优势提供了一个可以访问的路径名,实现没亲缘关系的进程 间通信 3) 消息队列比命名管道和无名管道的优势可以按类型实现消息的随机查询,没必要先 进先出 4) 按照逻辑结构不同进行数据库划分,Sqlite 数据库属于哪一类关系型数据库 5) 在C语言中操作sqlite数据库,常用的2中方式是sqlite_exec(回调)、

Linux程序设计考试例题

例题1程序A生成1个文件,其大小为1000字节,其内容为小写字母abcd...z的循环。试编写该程序。 文件名t 1.c #include #include int main(){char x; int i; int fd=open("aa",O_CREAT|O_TRUNC|O_WRONLY,0666); if(fd<0){printf("open file error!\r\n");exit (0);}; for(i=0;i<1000;i++){x='a'+(i%26); write(fd,&x,1);}close(fd);}例题2读出一个文件a.txt的倒数第2个字节和倒数第1个字节,显示在屏幕上。并且显示出当前时间。 文件名t 2.c #include #include #include int main(){char x[2]; int fd=open("a.txt",O_RDONLY); if(fd<0){printf("open file error!\r\n");exit

lseek(fd,-3,SEEK_END); read(fd,x,2); printf("倒数第二和第一字节为%c%c\r\n",x[0],x[1]); close(fd); time_t t; time(&t); printf("当前时间: %s",asctime(localtime(&t)));}例题3产生一个进程树父进程有3个子进程,这三个子进程分别有2个子进程。每个进程退出前打印自己的进程id号 文件名t 3.c #include #include int main(){int ret,i; for(i=0;i<3;i++){ret=fork(); if(ret==0)break;}if(ret==0) for(i=0;i<2;i++){ret=fork(); if(ret==0)break;}sleep (10); printf("thread %d is exiting now \r\n",getpid());}测试方法: 在另一窗口

Linux内核启动流程分析(一)

很久以前分析的,一直在电脑的一个角落,今天发现贴出来和大家分享下。由于是word直接粘过来的有点乱,敬请谅解! S3C2410 Linux 2.6.35.7启动分析(第一阶段) arm linux 内核生成过程 1. 依据arch/arm/kernel/vmlinux.lds 生成linux内核源码根目录下的vmlinux,这个vmlinux属于未压缩, 带调试信息、符号表的最初的内核,大小约23MB; 命令:arm-linux-gnu-ld -o vmlinux -T arch/arm/kernel/vmlinux.lds arch/arm/kernel/head.o init/built-in.o --start-group arch/arm/mach-s3c2410/built-in.o kernel/built-in.o mm/built-in.o fs/built-in.o ipc/built-in.o drivers/built-in.o net/built-in.o --end-group .tmp_kallsyms2.o 2. 将上面的vmlinux去除调试信息、注释、符号表等内容,生成arch/arm/boot/Image,这是不带多余信息的linux内核,Image的大小约 3.2MB; 命令:arm-linux-gnu-objcopy -O binary -S vmlinux arch/arm/boot/Image 3.将 arch/arm/boot/Image 用gzip -9 压缩生成arch/arm/boot/compressed/piggy.gz大小约 1.5MB;命令:gzip -f -9 < arch/arm/boot/compressed/../Image > arch/arm/boot/compressed/piggy.gz 4. 编译arch/arm/boot/compressed/piggy.S 生成arch/arm/boot/compressed/piggy.o大小约1.5MB,这里实 际上是将piggy.gz通过piggy.S编译进piggy.o文件中。而piggy.S文件仅有6行,只是包含了文件piggy.gz; 命令:arm-linux-gnu-gcc -o arch/arm/boot/compressed/piggy.o arch/arm/boot/compressed/piggy.S 5. 依据arch/arm/boot/compressed/vmlinux.lds 将arch/arm/boot/compressed/目录下的文件head.o 、piggy.o 、misc.o链接生成arch/arm/boot/compressed/vmlinux,这个vmlinux是经过压缩且含有自解压代码的内核, 大小约1.5MB; 命 令:arm-linux-gnu-ld zreladdr=0x30008000 params_phys=0x30000100 -T arch/arm/boot/compressed/vmlinux.lds a rch/arm/boot/compressed/head.o arch/arm/boot/compressed/piggy.o arch/arm/boot/compressed/misc.o -o arch/arm /boot/compressed/vmlinux

《Linux编程基础》复习题v2.doc

选择题 1./etc目录的标准应用是用于_ A.安装附加的应用程序 B.存放可执行程序、系统管理工具和库 C.设置用户的主目录 D.存放用于系统管理的配置文件##D 2.Apache服务器默认的接听连接端口号是________ 。 A.1024 B.800 C.80 D.8 ##C 3.DNS域名系统主要负责主机名和________ 之间的解析。 A.IP地址 B.MAC地址 C.网络地址 D.主机别名 林林A 4.Linux将存储设备和输入/输出设备均看做文件来操作,________ 不是以文件的形式出现。 A.□录 B.软链接 C.i节点表 D.M络适配器 ttttc 5.Linux文件名的长度不得超过________ 个字符。 A.64 B.128 C.256 D.512 ##C 6.Linux系统通过________ 命令给其他用户发消息。 A.less B.mesg y C.write D.echo to ttttc

7.Linux内核遵守的是下面哪一种许可条款________ 。 A.GDK B.GDP C.GPL D.GNU ttttc 8.Linux包含了一个名称是________ 的调试程序,它是用来调试C或C++程序的强力凋试器,它使用户能在程序运行吋观察程序的内部结构和内存的使用情况。 A.gcc B.make C.gdb D.autoconf ##C 9.Linux命令行是由____ 提供的。 A.管道 B.分层结构文件系统 C.文木处理器 D.shell ##D 10.Linux工作目录用________ 表示 A.? C.* D.# ##A 11.Linux操作系统的创始人和主要设计者是_________ A.Redhat Linux B.AT&T Bell 实验室 C.赫尔辛基大学 D.Linus Torvalds ttttD 12.Linux文件权限一共10位长度,分成四段,第三段表示的内容是_________ A.文件类型 B.文件所有者的权限 C.文件所冇者所在组的权限 D.其他用户的权限 ##C 13.Linux文件系统的文件都按其作用分门别类地放在相关的目录中,对于外部设备文件,一般应将其放在________ 目录中。 A./bin B./etc C./dev

相关主题
文本预览
相关文档 最新文档