『壹』 求信息管理与信息系统方面读书报告。1500字即可,谢谢
实习主要内容:因为时间的原因,和工商联没有计算机中心,因此我没能介入到网络管理的每一个方面,重点完成了针对计算机维护、网络安全的实习。现将我在工商联实习的心得总结如下:
一、计算机维护
计算机维护分为硬件维护和软件维护两个方面。工商联的计算机现状大概是总共有用于办公的计算机20余台,大部分是方正奔腾4的品牌机,还有一些联想的品牌机,以及少量打印机。
1、对硬件的维护主要集中在上一代未更新的计算机,因为使用年限比较久,硬件老化及磨损相对比较严重。在使用现在部分大型软件的时候经常出现死机,蓝屏,自动重启等现象。一般常见的引起硬件故障的主要原因有很多种,例如:各个配件间的兼容性不好;有些硬件的质量不过关等。但一般常见的硬件故障主要由以下几个方面引起。首先,电源电压不稳定或经常断电引起的故障。微机所使用的电源的电压不稳定,那么硬盘在读写文件时就会出现丢失或被损坏的现象。如果经常会发生不正常的断电现象导致微机重启,或是经常在计算机运行程序时进行冷启动,将会使系统受到破坏。为使微机更安全地工作,最好使用电源稳压器或不间断电源。其次,部件之间接触不良引起的故障。 接触不良主要反映在各种卡类与主板的接触不良或电源线数据线音频线的连接不良。其中,各种接口卡内存条与主板接触不良最为常见。例如:显卡与主板接触不良可能会使显示器不显示,内存条与主板接触不良可能使微机不工作等,通常只要更换相应的插槽或用橡皮轻轻擦一擦接口卡或内存条的金手指,即可排除故障。
2、软件维护方面,在新近配置的一批方正计算机中因为随商家发货过来的时候,已经装好了操作系统(WINDOWS XP)还附带安装了瑞星杀毒软件,但是因为他们安装的操作系统WindowsXP没有打上SP2补丁,而且安装的瑞星杀毒软件也是2004年版的,再加上所有的办公计算机都是挂在网络上的,这样就使得计算机对病毒和入侵的抵御能力很差,但同时又面临开放网络的大量病毒和入侵,造成该批计算机大面积中毒。给我们带来了巨大的工作量,在这次病毒感染中,计算机感染的集中表现为:震荡波和一种叫BACKDOOR.DLL的病毒。我们开始更新瑞星杀毒软件,能找到内存中的病毒并清除,但是这并不能从根本上解决问题。因为病毒是利用操作系统本身存在的漏洞进行攻击的,如果不把漏洞堵上,还是会被感染。所以必须给感染了病毒的计算机都打上SP2补丁。这样的工作效率很低,因为打一个SP2补丁配置比较好的计算机都得花上半个小时,还要更新瑞星杀毒软件搞完一台计算机一般都得花去一个多小时,如果遇到一些操作系统损坏比较严重的计算机就得重新安装操作系统,这样所有的驱动程序和应用软件就得重新安装,这样的话通常就是半天。为了尽量减少这样的工作我们在安装好了计算机(软件)以后,必须用GHOST给系统分区做一个镜像备份,这样在下次这台计算机发生问题是可以直接恢复备份就可以了。这样的话节省了大量的时间,提高了工作效率。
3.对操作系统的选择,目前在市场上的操作系统有windows系列,linux系列和unix系列等。其中Linux系列是开放源代码的,随着Linux和unix技术力量的充实逐渐打破了windows一统天F的局面,再加上近来windows安全漏洞层出不穷,Linux和Unix有逐渐取代网络服务主机的势头。但是,用过windows系列的人都应说知道windows友好的界面和方便、快捷、简洁的操作。为此在我国使用windows系列的用户还是占绝大多数。因为工商联不涉及国家机密,因此使用的是windowsXP操作系统
二、
网络安全管理 工商联网站安全是网站可靠运行并有效进行网站各项服务的基础和保证。使用防火墙,对数据包进行过滤,禁止某些地址对服务器的某些服务的访问,并在外部和WEB服务器中建立防护。使用入侵检测系统,监视系统,安全记录的日志、漏洞扫描软件、安全评估软件对整个网络系统进行安全扫描、分析和评估等保证服务器安全。
主要收获与体会:在这一段时间里,我不仅很好地运用了所学的专业知识,而且还学到了很多在学校学不到的实用的待人处世之道,阔大了知识面,也丰富了社会实践经历,为我即将踏入社会奠定了很好的基础。使我对社会、对工作、对学习都有了更深一步的理解和认识,为我即将走上工作岗位增添了信心,让我在大学生活中留下了美好的一页!使我深深感到计算机的网络的广泛应用,计算机网络管理在各个企事业单位占据着越来越重要的地位,网络管理远的工作也变的复杂和广泛,所以作为网络管理员光有书本上的理论知识是远远不够的,必须在工作中不断的学习,不断的实践,从学习和实践中积累经验,这样才能有所提高。
『贰』 linux中日志文件存在哪里
日志文件通常保存在/var/log目录下。
下面是几个重要的日志文件:
/var/log/messages:包括整体系统信息,其中也包含系统启动期间的日志。
/var/log/syslog:它和/etc/log/messages日志文件不同,它只记录警告信息,常常是系统出问题的信息。
/var/log/user.log:记录所有等级用户信息的日志。/var/log/auth.log:包含系统授权信息,包括用户登录和使用的权限机制等。
(2)linux源码阅读报告扩展阅读:
日志文件分为事件日志和消息日志。
事件日志
事件日志记录在系统的执行中发生的事件,以便提供可用于理解系统的活动和诊断问题的跟踪。 它们对理解复杂系统的活动至关重要,特别是在用户交互较少的应用程序中。
它还可以用于组合来自多个源的日志文件条目。 这种方法与统计分析相结合,可以产生不同服务器上看起来不相关的事件之间的相关性。 其他解决方案采用网络范围的查询和报告。
消息日志
互联网中继聊天(IRC),即时消息(IM)程序,具有聊天功能的对等文件共享客户端和多人游戏(特别是MMORPG)通常具有自动记录(即保存)文本通信的能力。
消息日志几乎是通用的纯文本文件,但是IM和VoIP客户端(其支持文本聊天,例如Skype)可以将它们保存在HTML文件中或以自定义格式以便于阅读和加密。
参考资料:网络——日志文件
『叁』 如何参与linux 内核开发
如何参与Linux内核开发
---------------------
这是一篇将如何参与Linux内核开发的相关问题一网打尽的终极秘笈。它将指导你
成为一名Linux内核开发者,并且学会如何同Linux内核开发社区合作。它尽可能不
包括任何关于内核编程的技术细节,但会给你指引一条获得这些知识的正确途径。
如果这篇文章中的任何内容不再适用,请给文末列出的文件维护者发送补丁。
入门
----
你想了解如何成为一名Linux内核开发者?或者老板吩咐你“给这个设备写个Linux
驱动程序”?这篇文章的目的就是教会你达成这些目标的全部诀窍,它将描述你需
要经过的流程以及给出如何同内核社区合作的一些提示。它还将试图解释内核社区
为何这样运作。
Linux内核大部分是由C语言写成的,一些体系结构相关的代码用到了汇编语言。要
参与内核开发,你必须精通C语言。除非你想为某个架构开发底层代码,否则你并
不需要了解(任何体系结构的)汇编语言。下面列举的书籍虽然不能替代扎实的C
语言教育和多年的开发经验,但如果需要的话,做为参考还是不错的盯含:
- "The C Programming Language" by Kernighan and Ritchie [Prentice Hall]
《C程序设计语言(第2版·新版)》(徐宝文 李志 译)[机械工业出版社]
- "Practical C Programming"正则和 by Steve Oualline [O'Reilly]
《实用C语言编程(第三版)》(郭大海 译)[中国电力出版社]
- "C: A Reference Manual" by Harbison and Steele [Prentice Hall]
《C语言参考手册(原书第5版)》(邱仲潘 等译)[机械工业出版社]
Linux内核使用GNU C和GNU工具链开发。虽然它遵循ISO C89标准,但也用到了一些
标准中没有定义的扩展。内核是自给自足的C环境,不依赖于标准C库的支持,所以
并不支持C标准中的部分定义。比如long long类型的大数除法和浮点运算就不允许
使用。有时候确实很难弄清楚内核对工具链的要求和它所使用的扩展,不幸的是目
前还没有明确的参考资料可以解释它们。请查阅gcc信息页(使用“info gcc”命令
显示)获得一些这方面信息。
请记住你是在学习怎么和已经存在的开发社区打交道。它由一群形形色色的人组成,
他们对代码、风格和过程有着很高的标准。这些标准是在长期实践中总结出来的,
适应于地理上分散的大型开发团队。它们已经被很好得整理成档,建议你在开发
之前尽可能多的学习这些标准,而不要期望别人来适应你或者你公司的行为方式。
法律问题
--------
Linux内核源代码都是在GPL(通用公共许可证)的保护下发布的。要了解这种许可
的细节请查看源代码主目录下的COPYING文件。如果你对它还有更深入问题请联系
律师,而不要在Linux内核邮件组上提问。因为邮件组里的人并不是律师,不要期
望他们的话有法律效力。
对于GPL的常见问题和解答,请访问以下链接:
http://www.gnu.org/licenses/gpl-faq.html
文档
----
Linux内核代码中包含有大量的文档。这些文档对于学习如何与内核社区互动有着
不可估量的价值。当一个新的功能被加入内核,最好把解释如何使用这个功能的文
档也放进内核。当内核的改动导致面向用户空间的接口发生变化时,最好将相关信
息或手册页(manpages)的补丁发到[email protected],以向手册页(manpages)
的维护者解释这些变化。
以下是内核代码中需要阅读的文档:
README
文件简要介绍了Linux内核的背景,并且描述了如何配置和编译内核。内核的
新用户应该从这里开始。
Documentation/Changes
文件给出了用来编译和使用内核所需要的最举盯小软件包列表。
Documentation/CodingStyle
描述Linux内核的代码风格和理由。所有新代码需要遵守这篇文档中定义的规
范。大多数维护者只会接收符合规定的补丁,很多人也只会帮忙检查符合风格
的代码。
Documentation/SubmittingPatches
Documentation/SubmittingDrivers
这两份文档明确描述如何创建和发送补丁,其中包括(但不仅限于):
- 邮件内容
- 邮件格式
- 选择收件人
遵守这些规定并不能保证提交成功(因为所有补丁需要通过严格的内容和风格
审查),但是忽视他们几乎就意味着失败。
其他关于如何正确地生成补丁的优秀文档包括:
"The Perfect Patch"
http://userweb.kernel.org/~akpm/stuff/tpp.txt
"Linux kernel patch submission format"
http://linux.yyz.us/patch-format.html
Documentation/stable_api_nonsense.txt
论证内核为什么特意不包括稳定的内核内部API,也就是说不包括像这样的特
性:
- 子系统中间层(为了兼容性?)
- 在不同操作系统间易于移植的驱动程序
- 减缓(甚至阻止)内核代码的快速变化
这篇文档对于理解Linux的开发哲学至关重要。对于将开发平台从其他操作系
统转移到Linux的人来说也很重要。
Documentation/SecurityBugs
如果你认为自己发现了Linux内核的安全性问题,请根据这篇文档中的步骤来
提醒其他内核开发者并帮助解决这个问题。
Documentation/ManagementStyle
描述内核维护者的工作方法及其共有特点。这对于刚刚接触内核开发(或者对
它感到好奇)的人来说很重要,因为它解释了很多对于内核维护者独特行为的
普遍误解与迷惑。
Documentation/stable_kernel_rules.txt
解释了稳定版内核发布的规则,以及如何将改动放入这些版本的步骤。
Documentation/kernel-docs.txt
有助于内核开发的外部文档列表。如果你在内核自带的文档中没有找到你想找
的内容,可以查看这些文档。
Documentation/applying-patches.txt
关于补丁是什么以及如何将它打在不同内核开发分支上的好介绍
内核还拥有大量从代码自动生成的文档。它包含内核内部API的全面介绍以及如何
妥善处理加锁的规则。生成的文档会放在 Documentation/DocBook/目录下。在内
核源码的主目录中使用以下不同命令将会分别生成PDF、Postscript、HTML和手册
页等不同格式的文档:
make pdfdocs
make psdocs
make htmldocs
make mandocs
如何成为内核开发者
------------------
如果你对Linux内核开发一无所知,你应该访问“Linux内核新手”计划:
http://kernelnewbies.org
它拥有一个可以问各种最基本的内核开发问题的邮件列表(在提问之前一定要记得
查找已往的邮件,确认是否有人已经回答过相同的问题)。它还拥有一个可以获得
实时反馈的IRC聊天频道,以及大量对于学习Linux内核开发相当有帮助的文档。
网站简要介绍了源代码组织结构、子系统划分以及目前正在进行的项目(包括内核
中的和单独维护的)。它还提供了一些基本的帮助信息,比如如何编译内核和打补
丁。
如果你想加入内核开发社区并协助完成一些任务,却找不到从哪里开始,可以访问
“Linux内核房管员”计划:
http://kernelnewbies.org/KernelJanitors
这是极佳的起点。它提供一个相对简单的任务列表,列出内核代码中需要被重新
整理或者改正的地方。通过和负责这个计划的开发者们一同工作,你会学到将补丁
集成进内核的基本原理。如果还没有决定下一步要做什么的话,你还可能会得到方
向性的指点。
如果你已经有一些现成的代码想要放到内核中,但是需要一些帮助来使它们拥有正
确的格式。请访问“内核导师”计划。这个计划就是用来帮助你完成这个目标的。它
是一个邮件列表,地址如下:
http://selenic.com/mailman/listinfo/kernel-mentors
在真正动手修改内核代码之前,理解要修改的代码如何运作是必需的。要达到这个
目的,没什么办法比直接读代码更有效了(大多数花招都会有相应的注释),而且
一些特制的工具还可以提供帮助。例如,“Linux代码交叉引用”项目就是一个值得
特别推荐的帮助工具,它将源代码显示在有编目和索引的网页上。其中一个更新及
时的内核源码库,可以通过以下地址访问:
http://sosdg.org/~coywolf/lxr/
开发流程
--------
目前Linux内核开发流程包括几个“主内核分支”和很多子系统相关的内核分支。这
些分支包括:
- 2.6.x主内核源码树
- 2.6.x.y -stable内核源码树
- 2.6.x -git内核补丁集
- 2.6.x -mm内核补丁集
- 子系统相关的内核源码树和补丁集
2.6.x内核主源码树
-----------------
2.6.x内核是由Linus Torvalds(Linux的创造者)亲自维护的。你可以在
kernel.org网站的pub/linux/kernel/v2.6/目录下找到它。它的开发遵循以下步
骤:
- 每当一个新版本的内核被发布,为期两周的集成窗口将被打开。在这段时间里
维护者可以向Linus提交大段的修改,通常这些修改已经被放到-mm内核中几个
星期了。提交大量修改的首选方式是使用git工具(内核的代码版本管理工具
,更多的信息可以在http://git.or.cz/获取),不过使用普通补丁也是可以
的。
- 两个星期以后-rc1版本内核发布。之后只有不包含可能影响整个内核稳定性的
新功能的补丁才可能被接受。请注意一个全新的驱动程序(或者文件系统)有
可能在-rc1后被接受是因为这样的修改完全独立,不会影响其他的代码,所以
没有造成内核退步的风险。在-rc1以后也可以用git向Linus提交补丁,不过所
有的补丁需要同时被发送到相应的公众邮件列表以征询意见。
- 当Linus认为当前的git源码树已经达到一个合理健全的状态足以发布供人测试
时,一个新的-rc版本就会被发布。计划是每周都发布新的-rc版本。
- 这个过程一直持续下去直到内核被认为达到足够稳定的状态,持续时间大概是
6个星期。
- 以下地址跟踪了在每个-rc发布中发现的退步列表:
http://kernelnewbies.org/known_regressions
关于内核发布,值得一提的是Andrew Morton在linux-kernel邮件列表中如是说:
“没有人知道新内核何时会被发布,因为发布是根据已知bug的情况来决定
的,而不是根据一个事先制定好的时间表。”
2.6.x.y -stable(稳定版)内核源码树
-----------------------------------
由4个数字组成的内核版本号说明此内核是-stable版本。它们包含基于2.6.x版本
内核的相对较小且至关重要的修补,这些修补针对安全性问题或者严重的内核退步。
这种版本的内核适用于那些期望获得最新的稳定版内核并且不想参与测试开发版或
者实验版的用户。
如果没有2.6.x.y版本内核存在,那么最新的2.6.x版本内核就相当于是当前的稳定
版内核。
2.6.x.y版本由“稳定版”小组(邮件地址<[email protected]>)维护,一般隔周发
布新版本。
内核源码中的Documentation/stable_kernel_rules.txt文件具体描述了可被稳定
版内核接受的修改类型以及发布的流程。
2.6.x -git补丁集
----------------
Linus的内核源码树的每日快照,这个源码树是由git工具管理的(由此得名)。这
些补丁通常每天更新以反映Linus的源码树的最新状态。它们比-rc版本的内核源码
树更具试验性质,因为这个补丁集是全自动生成的,没有任何人来确认其是否真正
健全。
2.6.x -mm补丁集
---------------
这是由Andrew Morton维护的试验性内核补丁集。Andrew将所有子系统的内核源码
和补丁拼凑到一起,并且加入了大量从linux-kernel邮件列表中采集的补丁。这个
源码树是新功能和补丁的试炼场。当补丁在-mm补丁集里证明了其价值以后Andrew
或者相应子系统的维护者会将补丁发给Linus以便集成进主内核源码树。
在将所有新补丁发给Linus以集成到主内核源码树之前,我们非常鼓励先把这些补
丁放在-mm版内核源码树中进行测试。
这些内核版本不适合在需要稳定运行的系统上运行,因为运行它们比运行任何其他
内核分支都更具有风险。
如果你想为内核开发进程提供帮助,请尝试并使用这些内核版本,并在
linux-kernel邮件列表中提供反馈,告诉大家你遇到了问题还是一切正常。
通常-mm版补丁集不光包括这些额外的试验性补丁,还包括发布时-git版主源码树
中的改动。
-mm版内核没有固定的发布周期,但是通常在每两个-rc版内核发布之间都会有若干
个-mm版内核发布(一般是1至3个)。
子系统相关内核源码树和补丁集
----------------------------
相当一部分内核子系统开发者会公开他们自己的开发源码树,以便其他人能了解内
核的不同领域正在发生的事情。如上所述,这些源码树会被集成到-mm版本内核中。
下面是目前可用的一些内核源码树的列表:
通过git管理的源码树:
- Kbuild开发源码树, Sam Ravnborg <[email protected]>
git.kernel.org:/pub/scm/linux/kernel/git/sam/kbuild.git
- ACPI开发源码树, Len Brown <[email protected]>
git.kernel.org:/pub/scm/linux/kernel/git/lenb/linux-acpi-2.6.git
- 块设备开发源码树, Jens Axboe <[email protected]>
git.kernel.org:/pub/scm/linux/kernel/git/axboe/linux-2.6-block.git
- DRM开发源码树, Dave Airlie <[email protected]>
git.kernel.org:/pub/scm/linux/kernel/git/airlied/drm-2.6.git
- ia64开发源码树, Tony Luck <[email protected]>
git.kernel.org:/pub/scm/linux/kernel/git/aegl/linux-2.6.git
- ieee1394开发源码树, Jody McIntyre <[email protected]>
git.kernel.org:/pub/scm/linux/kernel/git/scjody/ieee1394.git
- infiniband开发源码树, Roland Dreier <[email protected]>
git.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git
- libata开发源码树, Jeff Garzik <[email protected]>
git.kernel.org:/pub/scm/linux/kernel/git/jgarzik/libata-dev.git
- 网络驱动程序开发源码树, Jeff Garzik <[email protected]>
git.kernel.org:/pub/scm/linux/kernel/git/jgarzik/netdev-2.6.git
- pcmcia开发源码树, Dominik Brodowski <[email protected]>
git.kernel.org:/pub/scm/linux/kernel/git/brodo/pcmcia-2.6.git
- SCSI开发源码树, James Bottomley <[email protected]>
git.kernel.org:/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6.git
使用quilt管理的补丁集:
- USB, PCI, 驱动程序核心和I2C, Greg Kroah-Hartman <[email protected]>
kernel.org/pub/linux/kernel/people/gregkh/gregkh-2.6/
- x86-64, 部分i386, Andi Kleen <[email protected]>
ftp.firstfloor.org:/pub/ak/x86_64/quilt/
其他内核源码树可以在http://git.kernel.org的列表中和MAINTAINERS文件里
找到。
报告bug
-------
bugzilla.kernel.org是Linux内核开发者们用来跟踪内核Bug的网站。我们鼓励用
户在这个工具中报告找到的所有bug。如何使用内核bugzilla的细节请访问:
http://test.kernel.org/bugzilla/faq.html
内核源码主目录中的REPORTING-BUGS文件里有一个很好的模板。它指导用户如何报
告可能的内核bug以及需要提供哪些信息来帮助内核开发者们找到问题的根源。
利用bug报告
-----------
练习内核开发技能的最好办法就是修改其他人报告的bug。你不光可以帮助内核变
得更加稳定,还可以学会如何解决实际问题从而提高自己的技能,并且让其他开发
者感受到你的存在。修改bug是赢得其他开发者赞誉的最好办法,因为并不是很多
人都喜欢浪费时间去修改别人报告的bug。
要尝试修改已知的bug,请访问http://bugzilla.kernel.org网址。如果你想获得
最新bug的通知,可以订阅bugme-new邮件列表(只有新的bug报告会被寄到这里)
或者订阅bugme-janitor邮件列表(所有bugzilla的变动都会被寄到这里)。
https://lists.linux-foundation.org/mailman/listinfo/bugme-new
https://lists.linux-foundation.org/mailman/listinfo/bugme-janitors
邮件列表
--------
正如上面的文档所描述,大多数的骨干内核开发者都加入了Linux Kernel邮件列
表。如何订阅和退订列表的细节可以在这里找到:
http://vger.kernel.org/vger-lists.html#linux-kernel
网上很多地方都有这个邮件列表的存档(archive)。可以使用搜索引擎来找到这些
存档。比如:
http://dir.gmane.org/gmane.linux.kernel
在发信之前,我们强烈建议你先在存档中搜索你想要讨论的问题。很多已经被详细
讨论过的问题只在邮件列表的存档中可以找到。
大多数内核子系统也有自己独立的邮件列表来协调各自的开发工作。从
MAINTAINERS文件中可以找到不同话题对应的邮件列表。
很多邮件列表架设在kernel.org服务器上。这些列表的信息可以在这里找到:
http://vger.kernel.org/vger-lists.html
在使用这些邮件列表时,请记住保持良好的行为习惯。下面的链接提供了与这些列
表(或任何其它邮件列表)交流的一些简单规则,虽然内容有点滥竽充数。
http://www.albion.com/netiquette/
当有很多人回复你的邮件时,邮件的抄送列表会变得很长。请不要将任何人从抄送
列表中删除,除非你有足够的理由这么做。也不要只回复到邮件列表。请习惯于同
一封邮件接收两次(一封来自发送者一封来自邮件列表),而不要试图通过添加一
些奇特的邮件头来解决这个问题,人们不会喜欢的。
记住保留你所回复内容的上下文和源头。在你回复邮件的顶部保留“某某某说到……”
这几行。将你的评论加在被引用的段落之间而不要放在邮件的顶部。
如果你在邮件中附带补丁,请确认它们是可以直接阅读的纯文本(如
Documentation/SubmittingPatches文档中所述)。内核开发者们不希望遇到附件
或者被压缩了的补丁。只有这样才能保证他们可以直接评论你的每行代码。请确保
你使用的邮件发送程序不会修改空格和制表符。一个防范性的测试方法是先将邮件
发送给自己,然后自己尝试是否可以顺利地打上收到的补丁。如果测试不成功,请
调整或者更换你的邮件发送程序直到它正确工作为止。
总而言之,请尊重其他的邮件列表订阅者。
『肆』 嵌入式系统Linux内核开发实战指南的目录
第1部分 嵌入式系统硬件开发
第1章 嵌入式系统概述 2
这一章对嵌入式系统的概念及其特点和应用作了概括介绍,笔者根据自己多年的经验阐述了对嵌入式系统的理解,并对一些常见的嵌入式处理器的硬件数据进行了比较。
1.1 嵌入式系统概念 2
1.2 嵌入式处理器 3
1.3 嵌入式系统应用 4
1.4 嵌入式系统发展 4
1.5 一些嵌入式处理器的硬件特性比较 5
第2章 ARM处理器概述 16
为了使本书内容完整,从第2章到第7章中的内容大部分是笔者阅读《ARM体系结构与编程》(详情参见附录中的参考文献)的笔记和心得,把与嵌入式系统开发和Linux内核密切相关的硬件知识进行了概括和整理,本章主要介绍了ARM处理器的特点、ARM处理器的体系架构版本和ARM处理器系列。
2.1 ARM发展历程 16
2.2 ARM处理器特点 17
2.3 ARM处理器应用 17
2.4 ARM体系架构 18
2.4.1 ARM体系架构版本 18
2.4.2 ARM体系架构变种(Variant) 20
2.4.3 ARM体系架构版本命名格式 22
2.5 ARM处理器 22
2.5.1 ARM7系列处理器 23
2.5.2 ARM9系列处理器 24
2.5.3 ARM9E系列处理器 24
2.5.4 ARM10E系列处理器 25
2.5.5 SecurCore系列处理器 25
2.5.6 StrongARM处理器 26
2.5.7 Xscale处理器 26
第3章 ARM指令及其寻址方式 27
本章主要介绍了ARM处理器的指令和寻址方式以及ARM汇编伪指令,这是做ARM处理器应用系统底层软件开发必备的知识。
3.1 ARM处理器的程序状态寄存器(PSR) 27
3.2 ARM指令的条件码 28
3.3 ARM指令介绍 29
3.3.1 跳转指令 29
3.3.2 数据处理指令 30
3.3.3 乘法指令 31
3.3.4 杂类算术指令 32
3.3.5 状态寄存器访问指令 32
3.3.6 Load/Store内存访问指令 33
3.3.7 批量Load/Store内存访问指令 34
3.3.8 LDREX和STREX指令 35
3.3.9 信号量操作指令 37
3.3.10 异常中断产生指令 37
3.3.11 ARM协处理器指令 37
3.4 ARM指令寻址方式 39
3.4.1 数据处理指令的操作数的寻址方式 39
3.4.2 字及无符号字节的Load/Store指令的寻址方式 43
3.4.3 杂类Load/Store指令的寻址方式 47
3.4.4 批量Load/Store指令的寻址方式 49
3.4.5 协处理器Load/Store指令的寻址方式 51
3.4.6 ARM指令的寻址方式总结 52
3.5 ARM汇编伪操作(Directive) 53
3.5.1 符号定义伪操作 54
3.5.2 数据定义伪操作 54
3.5.3 汇编控制伪操作 56
3.5.4 栈中数据帧描述伪操作 57
3.5.5 信息报告伪操作 57
3.5.6 其他伪操作 58
3.6 ARM汇编伪指令 59
3.7 Thumb指令介绍 60
第4章 ARM处理器内存管理单元(MMU) 61
本章主要介绍了ARM处理器内存管理单元(MMU)的工作原理,Linux内存管理功能是通过处理器硬件MMU实现的,在没有MMU的处理器系统中,Linux只能工作在物理地址模式,没有虚拟(线性)地址空间的概念。
4.1 ARM处理器中CP15协处理器的寄存器 61
4.1.1 访问CP15寄存器的指令 61
4.1.2 CP15寄存器介绍 62
4.2 MMU简介 70
4.3 系统访问存储空间的过程 71
4.3.1 使能MMU时的情况 71
4.3.2 禁止MMU时的情况 71
4.3.3 使能/禁止MMU时应注意的问题 72
4.4 ARM处理器地址变换过程 72
4.4.1 MMU的一级映射描述符 73
4.4.2 MMU的二级映射描述符 74
4.4.3 基于段的地址变换过程 75
4.4.4 粗粒度大页地址变换过程 75
4.4.5 粗粒度小页地址变换过程 76
4.4.6 细粒度大页地址变换过程 76
4.4.7 细粒度小页地址变换过程 77
4.4.8 细粒度极小页地址变换过程 77
4.5 ARM存储空间访问权限控制 78
4.6 TLB操作 79
4.6.1 使TLB内容无效 79
4.6.2 锁定TLB内容 79
4.6.3 解除TLB中被锁定的地址变换条目 80
4.7 存储访问失效 80
4.7.1 MMU失效(MMU Fault) 80
4.7.2 外部存储访问失效(External Abort) 81
第5章 ARM处理器的Cache和Write Buffer 82
本章主要介绍了ARM处理器高速缓存(Cache)和写缓存(Write Buffer)的工作原理,使读者了解如何提高处理器的性能。
5.1 Cache和Write Buffer一般性介绍 82
5.1.1 Cache工作原理 82
5.1.2 地址映像方式 83
5.1.3 Cache写入方式原理简介 84
5.1.4 关于Write-through和Write-back 85
5.1.5 Cache替换策略 86
5.1.6 使用Cache的必要性 87
5.1.7 使用Cache的可行性 87
5.2 ARM处理器中的Cache和Write Buffer 88
5.2.1 基本概念 88
5.2.2 Cache工作原理 88
5.2.3 Cache地址映射和变换方法 89
5.2.4 Cache分类 90
5.2.5 Cache替换算法 91
5.2.6 Cache内容锁定 91
5.2.7 MMU映射描述符中B位和C位的含义 92
5.2.8 Cache和Writer Buffer编程接口 93
5.3 ARM处理器的快速上下文切换技术 94
5.3.1 FCSE概述 94
5.3.2 FCSE原理 94
5.3.3 FCSE编程接口 95
第6章 ARM处理器存储访问一致性问题 97
本章介绍了在支持MMU、Cache和DMA的系统中可能出现的存储访问一致性问题,以及Linux中解决类似问题的方法。
6.1 存储访问一致性问题介绍 97
6.1.1 地址映射关系变化造成的数据不一致性 97
6.1.2 指令cache的数据不一致性问题 98
6.1.3 DMA造成的数据不一致问题 99
6.1.4 指令预取和自修改代码 99
6.2 Linux中解决存储访问一致性问题的方法 99
第7章 ARM处理器工作模式与异常中断处理 101
本章主要介绍了ARM处理器的工作模式和异常中断处理过程,这是ARM处理器系统启动程序编写者或Bootloader开发人员的必备知识。
7.1 ARM处理器工作模式 101
7.2 ARM处理器异常中断向量表和优先级 103
7.3 ARM处理器异常中断处理 104
7.3.1 进入异常中断处理 104
7.3.2 退出异常中断处理 105
7.4 ARM处理器的中断(IRQ或FIQ) 109
第8章 ARM处理器启动过程 110
本章根据笔者的开发经验介绍了ARM处理器系统的启动过程以及编写ARM处理器系统启动程序需要注意的事项。
8.1 ARM处理器上电/复位操作 110
8.2 ARM处理器系统初始化过程 111
8.3 ARM处理器系统初始化编程注意事项 111
第9章 嵌入式系统设计与调试 113
本章根据笔者10多年的开发经验介绍了嵌入式系统的设计流程和调试方法,列举了大量笔者工作中碰到的实际案例。本章内容对于嵌入式系统硬件开发和调试有较高的参考、指导价值。
9.1 嵌入式系统设计流程 113
9.2 嵌入式系统硬件原理设计与审核 114
9.3 硬件设计工具软件 117
9.4 嵌入式系统调试仿真工具 117
9.5 嵌入式系统调试诊断方法 118
第10章 自制简易JTAG下载烧写工具 123
本章根据笔者自己制作简易JTAG线缆的经验,介绍了简易JTAG线缆的硬件原理和软件流程,这是初学者必备的最廉价的工具,必须掌握。
10.1 JTAG简介 123
10.1.1 一些基本概念 124
10.1.2 JTAG接口信号 124
10.1.3 TAP控制器的状态机 125
10.1.4 JTAG接口指令集 129
10.2 简易JTAG线缆原理 130
10.2.1 PC并口定义 130
10.2.2 PC并口的寄存器 131
10.2.3 简易JTAG线缆原理图 133
10.2.4 简易JTAG线缆烧写连接图(见图10-5) 134
10.3 简易JTAG烧写代码分析 135
10.3.1 简易JTAG烧写程序(flashp)使用说明 135
10.3.2 flash与CPU连接及flash属性描述文件 136
10.3.3 简易JTAG烧写程序的执行逻辑和流程 138
第2部分 Linux内核开发初步
第11章 Bootloader 142
本章根据笔者的工作经验介绍了流行的几种Bootloader、Bootloader应该具备的基本功能以及Bootloader的裁剪与移植。
11.1 Bootloader的任务和作用 142
11.2 各种各样的Bootloader 143
11.3 Bootloader编译环境 144
11.4 Bootloader的移植与裁减 145
11.5 编译Bootloader 145
11.6 烧写Bootloader 146
11.7 Bootloader使用举例 148
11.8 Bootloader修改举例 149
第12章 创建嵌入式Linux开发环境 151
本章介绍了如何创建嵌入式系统Linux内核交叉开发环境,本章和后续3章的内容是嵌入式系统Linux内核开发的基础,必须掌握。
12.1 安装Linux host 151
12.2 在虚拟机中安装Linux host 152
12.3 安装Linux交叉编译环境 157
12.4 在主机上设置TFTP Server 160
12.5 在主机上设置DHCP Server 161
12.6 在主机上设置Telnet server 161
12.7 在开发过程中使用NFS 162
12.8 设置超级终端 163
第13章 编译Linux内核 166
本章介绍了Linux内核的配置和编译方法。
13.1 获取Linux内核源代码 166
13.2 Linux内核目录结构 166
13.3 配置Linux内核 167
13.4 编译Linux内核 168
第14章 创建Linux根文件系统 170
本章介绍了Linux的根文件系统的结构以及创建根文件系统的方法。
14.1 根文件系统概述 170
14.2 根文件系统目录结构 171
14.3 获取根文件系统组件源代码 171
14.4 编译根文件系统源代码 171
14.5 创建一个32MB的RAMDISK根文件系统 173
14.6 在根文件系统中添加驱动模块或者应用程序 173
第15章 固化Linux内核和根文件系统 174
本章介绍了固化(烧写)Linux内核和根文件系统的方法。
第16章 关于Clinux 176
本章简要介绍了Clinux与标准Linux的区别。
16.1 Clinux简介 176
16.2 Clinux源代码目录结构 177
16.3 Clinux与标准Linux的区别 178
16.4 编译Clinux 179
第3部分 Linux 2.6内核原理
第17章 Linux 2.6.10@ARM启动过程 182
本章以start_kernel()和init()函数中调用到的函数说明的方式,介绍了从Linux汇编代码入口到init内核进程最后调用用户空间init命令的Linux整个启动过程。本章内容是笔者第一次阅读Linux内核源代码时对这些函数的注释,仅供读者了解start_kernel()和init()函数中调用到的每个函数的大致功能时使用。
17.1 Linux 2.6.10中与ARM处理器平台硬件相关的结构和全局变量 182
17.1.1 相关数据结构 182
17.1.2 相关全局变量 187
17.2 Linux汇编代码入口 189
17.3 Linux汇编入口处CPU的状态 189
17.4 start_kernel()函数之前的汇编代码执行过程 190
17.5 start_kernel()函数中调用的函数介绍 192
17.5.1 lock_kernel()函数 192
17.5.2 page_address_init()函数 192
17.5.3 printk(linux_banner) 193
17.5.4 setup_arch(&command_line)函数 193
17.5.5 setup_per_cpu_areas()函数 198
17.5.6 smp_prepare_boot_cpu()函数 199
17.5.7 sched_init()函数 199
17.5.8 build_all_zonelists()函数 200
17.5.9 page_alloc_init()函数 200
17.5.10 printk(Kernel command line: %s
, saved_command_line) 201
17.5.11 parse_early_param()函数 201
17.5.12 parse_args()函数 201
17.5.13 sort_main_extable()函数 202
17.5.14 trap_init()函数 202
17.5.15 rcu_init()函数 202
17.5.16 init_IRQ()函数 203
17.5.17 pidhash_init()函数 203
17.5.18 init_timers()函数 203
17.5.19 softirq_init()函数 204
17.5.20 time_init()函数 204
17.5.21 console_init()函数 205
17.5.22 profile_init()函数 206
17.5.23 local_irq_enable()函数 207
17.5.24 vfs_caches_init_early()函数 207
17.5.25 mem_init()函数 208
17.5.26 kmem_cache_init()函数 210
17.5.27 numa_policy_init()函数 225
17.5.28 calibrate_delay()函数 227
17.5.29 pidmap_init()函数 228
17.5.30 pgtable_cache_init()函数 229
17.5.31 prio_tree_init()函数 229
17.5.32 anon_vma_init()函数 229
17.5.33 fork_init(num_physpages)函数 229
17.5.34 proc_caches_init()函数 230
17.5.35 buffer_init()函数 231
17.5.36 unnamed_dev_init()函数 231
17.5.37 security_init()函数 231
17.5.38 vfs_caches_init(num_physpages)函数 232
17.5.39 radix_tree_init()函数 237
17.5.40 signals_init()函数 237
17.5.41 page_writeback_init()函数 237
17.5.42 proc_root_init()函数 238
17.5.43 check_bugs()函数 240
17.5.44 acpi_early_init()函数 244
17.5.45 rest_init()函数 244
17.6 init()进程执行过程 265
17.6.1 smp_prepare_cpus(max_cpus)函数 265
17.6.2 do_pre_smp_initcalls()函数 265
17.6.3 fixup_cpu_present_map()函数 267
17.6.4 smp_init()函数 267
17.6.5 sched_init_smp()函数 268
17.6.6 populate_rootfs()函数 268
17.6.7 do_basic_setup()函数 283
17.6.8 sys_access()函数 292
17.6.9 free_initmem()函数 301
17.6.10 unlock_kernel()函数 301
17.6.11 numa_default_policy()函数 302
17.6.12 sys_p()函数 302
17.6.13 execve()函数 302
第18章 Linux内存管理 305
从本章开始,笔者将带领读者走进神秘的Linux内核世界。笔者在阅读内核源代码以及两本相关参考书(见参考文献)的基础上,以自己的理解和语言总结概括了Linux内核每个组件的原理。笔者对与每个内核组件相关的关键数据结构和全局变量作了尽量详尽的说明,并且对核心函数进行了详细注释,在向读者灌输理论知识的同时引导读者自己去阅读、分析Linux内核源代码。本章讲解了Linux内核第一大核心组件“内存管理”的原理和实现内幕。
18.1 Linux内存管理概述 305
18.1.1 Linux内存管理的一些基本概念 305
18.1.2 内存管理相关数据结构 309
18.1.3 内存管理相关宏和全局变量 330
18.1.4 Linux内存管理的任务 341
18.1.5 Linux中的物理和虚拟存储空间布局 341
18.2 为虚拟(线性地址)存储空间建立页表 345
18.3 设置存储空间的访问控制属性 348
18.4 Linux中的内存分配和释放 350
18.4.1 在系统启动初期申请内存 350
18.4.2 系统启动之后的内存分配与释放 360
第19章 Linux进程管理 480
本章讲解了Linux内核第二大核心组件“进程管理”的原理和实现内幕。
19.1 进程管理概述 480
19.1.1 进程相关概念 480
19.1.2 进程分类 481
19.1.3 0号进程 481
19.1.4 1号进程 481
19.1.5 其他一些内核线程 482
19.1.6 进程描述符(struct task_struct) 482
19.1.7 进程状态 482
19.1.8 进程标识符(PID) 483
19.1.9 current宏定义 484
19.1.10 进程链表 484
19.1.11 PID hash表和链表 485
19.1.12 硬件上下文(Hardware Context) 485
19.1.13 进程资源限制 485
19.1.14 进程管理相关数据结构 486
19.1.15 进程管理相关宏定义 502
19.1.16 进程管理相关全局变量 514
19.2 进程管理相关初始化 520
19.3 进程创建与删除 529
19.4 进程调度 551
19.4.1 进程类型 553
19.4.2 进程调度类型 554
19.4.3 基本时间片计算方法 555
19.4.4 动态优先级算法 556
19.4.5 交互式进程 556
19.4.6 普通进程调度 557
19.4.7 实时进程调度 557
19.4.8 进程调度函数分析 558
19.5 进程切换 576
19.6 用户态进程间通信 581
19.6.1 信号(Signal) 581
19.6.2 管道(pipe)和FIFO(命名管道) 627
19.6.3 进程间通信原语(System V IPC) 641
第20章 Linux文件管理 651
本章讲解了Linux内核第三大核心组件“文件系统”的原理和实现内幕。
20.1 文件系统概述 651
20.1.1 Linux文件管理相关概念 652
20.1.2 Linux文件管理相关数据结构 657
20.1.3 Linux文件管理相关宏定义 682
20.1.4 Linux文件管理相关全局变量 691
20.2 文件管理相关初始化 699
20.3 文件系统类型注册 711
20.4 挂接文件系统 712
20.5 文件系统类型超级块读取 730
20.5.1 get_sb_single()通用超级块读取函数 731
20.5.2 get_sb_nodev()通用超级块读取函数 737
20.5.3 get_sb_bdev()通用超级块读取函数 738
20.5.4 get_sb_pseudo()通用超级块读取函数 740
20.6 路径名查找 747
20.7 访问文件操作 759
20.7.1 打开文件 759
20.7.2 关闭文件 766
20.7.3 读文件 768
20.7.4 写文件 785
20.8 异步I/O系统调用 792
20.9 Linux特殊文件系统 792
20.9.1 rootfs文件系统 793
20.9.2 sysfs文件系统 797
20.9.3 devfs设备文件系统 800
20.9.4 bdev块设备文件系统 803
20.9.5 ramfs文件系统 804
20.9.6 proc文件系统 804
20.10 磁盘文件系统 813
20.10.1 ext2文件系统相关数据结构 813
20.10.2 ext2文件系统磁盘分区格式 819
20.10.3 ext2文件系统的各种文件 820
20.10.4 创建ext2文件系统 821
20.10.5 ext2文件系统的操作方法 822
20.11 关于initramfs 824
20.11.1 initramfs概述 824
20.11.2 initramfs与initrd的区别 824
20.11.3 initramfs相关全局变量 825
20.11.4 initramfs被编译链接的位置 825
20.11.5 initramfs文件的生成过程 825
20.11.6 initramfs二进制文件格式说明(cpio格式) 828
20.11.7 initramfs二进制文件和列表文件对照示例 829
20.11.8 initramfs利弊 830
20.12 关于initrd 830
20.12.1 initrd概述 830
20.12.2 initrd相关全局变量 831
20.13 关于gzip压缩文件 832
第21章 Linux模块设计 834
本章讲解了Linux内核模块程序与应用程序的区别以及如何编写和加载Linux内核模块程序。
21.1 Linux模块设计概述 834
21.2 Linux的内核空间和用户空间 834
21.3 内核模块与应用程序的区别 835
21.4 编译模块 837
21.5 装载和卸载模块 837
21.6 模块层叠 838
21.7 模块版本依赖 839
21.8 模块编程示例 839
第22章 Linux系统异常中断管理 841
本章讲解了Linux内核如何管理系统异常中断以及Linux系统调用的实现内幕。
22.1 Linux异常中断处理 841
22.2 指令预取和数据访问中止异常中断处理 849
22.2.1 指令预取中止异常中断处理 850
22.2.2 数据访问中止异常中断处理 858
22.3 Linux中断处理 863
22.3.1 内核模式下的中断处理 863
22.3.2 用户模式下的中断处理 867
22.4 从中断返回 868
22.5 Linux中断管理 869
22.5.1 Linux中断管理相关数据结构与全局变量 870
22.5.2 Linux中断管理初始化 872
22.5.3 安装和卸载中断处理程序 874
22.5.4 使能和禁止中断 878
22.6 Linux系统调用 880
22.6.1 Linux系统调用内核实现过程 880
22.6.2 从系统调用返回 889
22.6.3 Linux系统调用用户程序接口函数 890
22.6.4 Linux系统调用用户接口函数与内核实现函数之间参数传递 899
第23章 Linux软中断和工作队列 901
本章讲解了Linux内核中的两种延迟处理机制“软中断”和“工作队列”的原理和实现。
23.1 概述 901
23.2 Linux软中断 902
23.2.1 软中断相关数据结构和全局变量 903
23.2.2 软中断初始化 904
23.2.3 软中断的核心操作函数do_softirq() 908
23.2.4 软中断看护进程执行函数ksoftirqd() 912
23.2.5 如何使用软中断 913
23.3 Linux工作队列 918
23.3.1 Linux工作队列相关数据结构和全局变量 918
23.3.2 Linux工作队列初始化 921
23.3.3 将工作加入到工作队列中 924
23.3.4 工作者进程执行函数worker_thread() 928
23.3.5 使用Linux工作队列 931
第24章 Linux并发与竞态 933
本章讲解了Linux内核同步机制,包括几种锁定技术以及免锁算法。
24.1 并发与竞态概述 933
24.1.1 Linux中的并发源 934
24.1.2 竞态可能导致的后果 934
24.1.3 避免竞态的规则 934
24.2 消除竞态的“锁定”技术 935
24.2.1 信号量(semphore)和互斥体(mutual exclusion) 935
24.2.2 读写信号量(rw_semaphore) 938
24.2.3 完成量(completion) 941
24.2.4 自旋锁(spinlock_t) 942
24.2.5 读写自旋锁(rwlock_t) 946
24.2.6 使用“锁定”技术的注意事项 949
24.3 消除竞态的非“锁定”方法 949
24.3.1 免锁算法 949
24.3.2 原子操作 950
24.3.3 位操作 951
24.3.4 顺序锁 952
24.3.5 读-复制-更新(Read-Copy-Update,RCU) 954
第25章 Linux设备驱动程序 958
本章讲解了Linux内核第四大核心组件“设备驱动”的原理和实现内幕。同时还总结归纳了编写各种设备驱动程序的方法和步骤。
25.1 设备驱动程序概述 958
25.1.1 设备驱动程序组成部分 959
25.1.2 设备号 959
25.1.3 设备文件 960
25.1.4 编写设备驱动程序的关键 961
25.2 字符设备驱动程序 961
25.2.1 字符设备相关数据结构 961
25.2.2 字符设备相关全局变量 963
25.2.3 字符设备驱动程序全局初始化 963
25.2.4 为字符设备分配设备号 964
25.2.5 注册字符设备驱动程序 968
25.2.6 字符设备的操作方法 971
25.2.7 用户对字符设备驱动程序的调用过程 972
25.2.8 如何编写字符设备驱动程序 974
25.2.9 关于TTY设备驱动程序 974
25.2.10 控制台设备驱动程序 975
25.3 块设备驱动程序 986
25.3.1 块设备相关数据结构 986
25.3.2 块设备相关宏定义 997
25.3.3 块设备相关全局变量 999
25.3.4 块设备驱动程序全局初始化 1004
25.3.5 为块设备分配主设备号 1006
25.3.6 注册块设备驱动程序 1009
25.3.7 块设备驱动程序的操作方法 1017
25.3.8 调用块设备驱动程序过程 1017
25.3.9 I/O调度 1031
25.3.10 如何编写块设备驱动程序 1032
25.4 网络设备驱动程序 1033
25.4.1 网络设备驱动程序概述 1033
25.4.2 网络设备相关数据结构 1034
25.4.3 网络设备相关宏定义 1044
25.4.4 网络设备相关全局变量 1045
25.4.5 创建net_device结构 1046
25.4.6 注册网络设备 1048
25.4.7 网络设备的操作方法 1050
25.4.8 网络设备中断服务程序 1051
25.4.9 如何编写网络设备驱动程序 1051
25.5 PCI设备驱动程序 1052
25.5.1 PCI接口定义 1053
25.5.2 PCI设备的三个地址空间 1057
25.5.3 PCI总线仲裁 1058
25.5.4 PCI设备编号 1059
25.5.5 如何访问PCI配置空间 1059
25.5.6 如何配置PCI设备 1061
25.5.7 PCI驱动程序相关数据结构 1062
25.5.8 PCI驱动程序相关宏定义 1068
25.5.9 PCI驱动程序相关全局变量 1068
25.5.10 Bootloader和内核做的事 1069
25.5.11 PCI驱动程序注册 1069
25.5.12 PCI驱动程序接口函数 1071
25.5.13 如何编写PCI驱动程序 1072
第4部分 Linux内核开发高级指南
第26章 Linux系统参数设置 1076
从本章开始的后续章节主要讲解了比较高级或者平时较少关注的Linux内核方面的知识,本章讲解了Linux中的4种系统参数格式和设置方法。
26.1 旗语系统参数(tag) 1076
26.1.1 与旗语系统参数相关数据结构和全局变量 1076
26.1.2 旗语系统参数说明 1082
26.1.3 旗语系统参数设置方法 1084
26.2 前期命令行设置的系统参数 1084
26.2.1 与前期命令行系统参数相关数据结构和全局变量 1084
26.2.2 前期命令行设置的系统参数说明 1085
26.2.3 前期命令行系统参数设置方法 1086
26.2.4 如何添加自己的前期命令行设置的系统参数 1087
26.3 老式命令行系统参数 1087
26.3.1 与老式命令行系统参数相关数据结构和全局变量 1087
26.3.2 老式命令行设置的系统参数说明 1088
26.3.3 老式命令行设置的系统参数设置方法 1089
26.3.4 如何添加自己的老式命令行设置的系统参数 1089
26.4 命令行系统参数 1089
26.4.1 与命令行系统参数相关数据结构和全局变量 1089
26.4.2 命令行设置的系统参数说明 1090
26.4.3 命令行设置的系统参数设置方法 1090
第27章 Linux内核调试 1091
本章介绍了Linux内核的调试方法。
27.1 打开Linux内核及其各模块自带的调试开关 1091
27.2 内核剖析(Profiling) 1093
27.3 通过打印调试(printk) 1095
27.3.1 关于printk() 1095
27.3.2 内核信息级别 1096
27.3.3 打印速度限制 1097
27.3.4 控制台重定向 1098
27.4 使用proc文件系统调试 1098
27.5 oops消息 1098
27.6 通过跟踪命令strace调试 1099
27.7 使用gdb、kdb、kgdb调试 1099
第28章 Linux内核移植 1101
本章介绍了Linux内核的移植方法。
第29章 Linux内核优化 1104
本章介绍了Linux内核的优化方法。
29.1 编译优化 1104
29.2 根据CPU特性进行优化 1105
29.3 对内核进行裁减 1105
29.4 优化系统内存配置 1106
29.5 优化系统启动过程以缩减系统启动时间 1106
29.6 内存映射优化 1107
29.7 工具软件辅助优化 1107
第30章 Linux定时器 1109
本章介绍了Linux内核的软件定时器。
30.1 定时器相关数据结构 1109
30.2 定时器相关宏定义 1111
30.3 定时器相关全局变量 1112
30.4 定时器和时钟初始化 1113
30.5 获取系统时间 1114
30.6 延迟函数 1115
30.7 与定时器相关系统调用 1115
30.8 使用定时器方法 1116
第31章 杂项 1117
本章介绍了PER_CPU变量以及Linux中的数据类型定义。
31.1 per_cpu变量 1117
31.2 Linux中的数据类型定义 1118
第32章 编译链接文件说明 1119
本章注释了ARM处理器系统中Linux内核的链接文件,以帮助读者了解编译出来的Linux内核各区段在内存中的存放位置。
参考文献 1125
『伍』 系统实现的内容写什么
问题一:系统详细设计包括哪些内容 1、模块说明。说明该模块需要实现什么功能,还有设计要点。
2、流程逻辑。用流程图说明该模块的处理过程。
3、算法。不一定有,如果涉及一些比较特殊的算法或关键模块,就写一下算法的伪代码或用流程图说明。
4、限制条件。该模块的功能有哪些限制常比如用户ID不能重复,只能查询自己权限范围内的用户。
5、输入项。每个子模块可以看做一个”方法“,我传给你什么,你给我输出什么。比如删除用户,输入项就是用户ID。
6、输出项。删除用户的输出项,就是不能在查询模块里查询到已删除的用户
7、界面设计。用visio或者其他工具画一些界面图
8、需要操作的数据表。
问题二:系统设计实现报告中系统实现写什么?? 20分 格式如下:
1.实习时间
2.实习地点
3.实习单位
4.实习目的
5.实习内容
6.实习意义
7.实习总结
问题三:写一个操作系统内核有多难?大概的内容,步骤是什么 “一个好一点儿的计算机硕士毕业的学生。写一个操作系统的内核绝对是应该办到而且肯定可以办到的事儿。” ------这句话我们可以理解为”一个好的计算机硕士掌握的理论知识足够他搭建起一个简单的操作系统框架“。
我上操作系统课(大二)的第一天就问我的老师,学完了这门课可以自己实现一个操作系统了吗?老师说:”你可以基本掌握操作系统中要处理的主要问题,但是即使实现最简单的五脏俱全的操作系统还需要掌握很多很多东西,而且前提是你已经有很不错的代码能力。“
回到题目上来,我们要实现一个简单的操作系统,最先需要解决的是哪些问题?这个问题我相信翻开任何一本操作系统书都可以得到答案,一般都是操作系统书的前五,六章内容(第一章基本是操作系统概念及发展历史)。
包括:
进程管理
存储管理
文件系统
输入/输出
这些大部分是讨论理论类的书,比如我们上课用的书是西电汤子瀛老师的《计算机操作系统》,后来自己为了深入学习买了Andrew S. Tanenbaum的《Modern Operating Systems》。
如果想写个操作系统,除了理论知识外,动手之前最好先看看操作系统源代码,Linux的代码都是开源的,可以先学习学习。不过对于我们这种初学者千万不要看最新的Linux内核代码,因为那是很多人的杰作,可能一辈子都看不完。最好先看看国携州橘内同济大学赵炯基于0.11的《Linux完全注释》,即使只看懂30%也至会让自己懂很多之前不知道的东西。
理论类的书很少有提到Bootload问题的,就是加电之后从哪里开始执行的部分。仅仅是这个步骤也需要花迹没不少时间去了解CPU知识,汇编语言知识等,相当不容易。不话说回来,这部分如果能处理好之后会发现组成原理,汇编语言,微机原理的知识被自己运用到了,成就感巨大。这部分内容,可以参看MIT的课程6.828 Operating System Engineering的课程,Google一下就能搜到不少大牛关于这门课的博客。如果英语不太好我记得华中科技大学有一个叫32位操作系统实践的课,资料都放到网上了,看起来很不错。
过了这一关,用《深入理解计算机系统》加上《现代操作系统》看一下虚拟存储器的内容,这两本书这部分说得都很棒。虚拟存储器的概念贯穿所有,如果能弄懂,对很多方面都有很大的帮助,不仅仅是操作辩团系统这块。有了虚拟存储器概念之后对于链接,加载等知识理解就会深刻许多。 不过,这部分内容也需要对硬件部分有所了解,又是一坑。
之后回到进程上来之后,终于可以把工作重心从硬件部分转移过来了。但是我们又将面对进程创建,进程调度,进程通信三大问题,既然是简单实现,就先不考虑线程的事。算法书中会给很多,不过这些算法都是有一定的局限性,比如调度算法,对应的调度算法优劣差异很大,至于如何抉择就看个人需求。不过话说回来,操作系统里的”算法“和ACM里的算法在难度上差很多,还是比较容易实现的。
内容太多了,就不完全展开了,后面就看自己“耐力”了,写操作系统是需要坚持很长实践+大量知识积累的。有些问题还涉及到哲学的观点,这里推荐上海交大邹恒明教授的《操作系统之哲学原理》。除了理论方面的书,现在市面上也有直接教如何实现一个操作系统的,比如《Orange'S:一个操作系统的实现》和《30天自制操作系统》(仅有的几本“XX天XX”而不是烂书的书),起步阶段跟着这些书来还是很不错的。
总之,实现最最基本的功能也许可以做到。实现功能强大,鲁棒性强的操作系统极难。...>>
问题四:如何写一个文件系统 摘要:本文目的是分析在Linux系统中如何实现新的文件系统。在介绍文件系统具体实现前先介绍文件系统的概念和作用,抽象出了文件系统概念模型。熟悉文件系统的内涵后,我们再近一步讨论Linux系统中和文件系统的特殊风格和具体文件系统在Linux中组成结构,为读者勾画出Linux中文件系统工作的全景图。最后,我们再通过Linux中最简单的Romfs作实例分析实现文件系统的普遍步骤。(我们假定读者已经对Linux文件系统初步了解) 什么是文件系统 首先要谈的概念就是什么是文件系统,它的作用到底是什么。 文件系统的概念虽然许多人都认为是再清晰不过的了,但其实我们往往在谈论中或多或少地夸大或片缩小了它的实际概念(至少我时常混淆),或者说,有时借用了其它概念,有时说的又不够全面。 比如在操作系统中,文件系统这个术语往往既被用来描述磁盘中的物理布局,比如有时我们说磁盘中的“文件系统”是EXT2或说把磁盘格式化成FAT32格式的“文件系统”等――这时所说的“文件系统”是指磁盘数据的物理布局格式;另外,文件系统也被用来描述内核中的逻辑文件结构,比如有时说的“文件系统”的接口或内核支持Ext2等“文件系统”――这时所说的文件系统都是内存中的数据组织结构而并非磁盘物理布局。还有些时候说“文件系统”负责管理用户读写文件――这时所说的“文件系统”往往描述操作系统中的“文件管理系统”,也就是文件子系统。 虽然上面我们列举了混用文件系统的概念的几种情形,但是却也不能说上述说法就是错误的,因为文件系统概念本身就囊括众多概念,几乎可以说在操作系统中自内存管理、系统调度到I/O系统、设备驱动等各个部分都和文件系统联系密切,有些部分和文件系统甚至未必能明确划分――所以不能只知道文件系统是系统中数据的存储结构,一定要全面认识文件系统在操作系统中的角色,才能具备自己开发新文件系统的能力。 为了澄清文件系统的概念,必须先来看看文件系统在操作系统中处于何种角色,分析文件系统概念的内含外延。所以我们先抛开Linux文件系统的实例,而来看看操作系统中文件系统的普遍体系结构,从而增强对文件系统的理论认识。 下面以软件组成的结构图[1]的方式描述文件系统所涉及的内容。 我们针对各层做以简要分析: 首先我们来分析最低层――设备驱动层,该层负责与外设――磁盘等――通讯。基于磁盘的文件系统都需要和存储设备打交道,而系统操作外设离不开驱动程序。所以内核对文件的最后操作行为就是调用设备驱动程序完成从主存(内存)到辅存(磁盘)的数据传输。文件系统相关的多数设备都属于块设备,常见的块设备驱动程序有磁盘驱动,光驱驱动等,之所以称它们为块设备,一个原因是它们读写数据都是成块进行的,但是更重要的原因是它们管理的数据能够被随机访问――不需要向字符设备那样必须顺序访问。 设备驱动层的上一层是物理I/O层,该层主要作为计算机外部环境和系统的接口,负责系统和磁盘交换数据块。它要知道据块在磁盘中存储位置,也要知道文件数据块在内存缓冲中的位置,另外它不需要了解数据或文件的具体结构。可以看到这层最主要的工作是标识别磁盘扇区和内存缓冲块[2]之间的映射关系。 再上层是基础I/O监督层,该层主要负责选择文件 I/O需要的设备,调度磁盘请求等工作,另外分配I/O缓冲和磁盘空间也在该层完成。由于块设备需要随机访问数据,而且对速度响应要求较高,所以操作系统不能向对字符设备那样简单、直接地发送读写请求,而必须对读写请求重新优化排序,以能节省磁盘寻址时间,另外也必须对请求提交采取异步调度(尤其写操作)的方式......>>
问题五:系统总体设计的含义是什么? 系统设计工作应该自顶向下地进行。首先设计总体结构,然后再逐层深入,直至进行每一个模块的设计。总体设计主要是指在系统分析的基础上,对整个系统的划分(子系统)、机器设备(包括软、硬设备)的配置、数据的存贮规律以及整个系统实现规划等方面进行合理的安排。
一、系统设计的任务
1. 系统设计的概念
系统设计又称为物理设计,是开发管理信息系统的第二阶段,系统设计通常可分为两个阶段进行,首先是总体设计,其任务是设计系统的框架和概貌,并向用户单位和领导部门作详细报告并认可,在此基础上进行第二阶段DD详细设计,这两部分工作是互相联系的,需要交叉进行,本章将这两个部分内容结合起来进行介绍。
系统设计是开发人员进行的工作,他们将系统设计阶段得到的目标系统的逻辑模型转换为目标系统的物理模型,该阶段得到工作成果DD系统设计说明书是下一个阶段系统实施的工作依据。
2.系统设计的主要内容
系统设计的主要任务是进行总体设计和详细设计。下面分别说明它们的具体内容。
(1) 总体设计
总体设计包括系统模块结构设计和计算机物理系统的配置方案设计。
系统模块结构设计
系统模块结构设计的任务是划分子系统,然后确定子系统的模块结构,并画出模块结构图。在这个过程中必须考虑以下几个问题:
如何将一个系统划分成多个子系统;
每个子系统如何划分成多个模块;
如何确定子系统之间、模块之间传送的数据及其调用关系;
如何评价并改进模块结构的质量。
计算机物理系统配置方案设计
在进行总体设计时,还要进行计算机物理系统具体配置方案的设计,要解决计算机软硬件系统的配置、通信网络系统的配置、机房设备的配置等问题。计算机物理系统具体配置方案要经过用户单位和领导部门的同意才可进行实施。
开发管理信息系统的大量经验教训说明,选择计算机软硬件设备不能光看广告或资料介绍,必须进行充分的调查研究,最好应向使用过该软硬件设备的单位了解运行情况及优缺点,并征求有关专家的意见,然后进行论证,最后写出计算机物理系统配置方案报告。
从我国的实际情况看,不少单位是先买计算机然后决定开发。这种不科学的、盲目的做法是不可取的,它会造成极大浪费。因为,计算机更新换代是非常快的,就是在开发初期和在开发的中后期系统实施阶段购买计算机设备,价格差别就会很大。因此,在开发管理信息系统过程中应在系统设计的总体设计阶段才具体设计计算机物理系统的配置方案。
(2) 详细设计
在总体设计基础上,第二步进行的是详细设计,主要有处理过程设计以确定每个模块内部的详细执行过程,包括局部数据组织、控制流、每一步的具体加工要求等,一般来说,处理过程模块详细设计的难度已不太大,关键是用一种合适的方式来描述每个模块的执行过程,常用的有流程图、问题分析图、IPO图和过程设计语言等;除了处理过程设计,还有代码设计、界面设计、数据库设计、输入输出设计等。
(3) 编写系统设计说明书
系统设计阶段的结果是系统设计说明书,它主要由模块结构图、模块说明书和其它详细设计的内容组成。...>>
问题六:软件详细设计包含哪些内容?? 目录1基本内容基本内容详细设计详细设计的主要任务是设计每个模块的实现算法、所需的局部数据结构。详细设计的目标有两个:实现模块功能的算法要逻辑上正确和算法描述要简明易懂。主要任务:1.为每个模块确定采用的算法,选择某种适当的工具表达算法的过程,写出模块的详细过程性描述;2.确定每一模块使用的数据结构;3.确定模块接口的细节,包括对系统外部的接口和用户界面,对系统内部模块的接口,以及模块输入数据、输出数据及局部数据的全部细节。在详细设计结束时,应该把上述结果写入详细设计说明书,并且通过复审形成正式文档。交付给下一阶段(编码阶段)的工作依据。4.要为每一个模块设计出一组测试用例,以便在编码阶段对模块代码(即程序)进行预定的测试,模块的测试用例是软件测试计划的重要组成部分,通常应包括输入数据,期望输出等内容。详细设计的工具:1.图形工具利用图形工具可以把过程的细节用图形描述出来。2.表格工具可以用一张表来描述过程的细节,在这张表中列出了各种可能的操作和相应的条件。用某种高级语言(称之为伪码)来描述过程的细节。
问题七:云计算操作系统一般是用什么语言开发的? 按常理来说当然c++更简单,因为它相对c更高级。但要看你自己对语言的掌握程度
问题八:如何撰写课题的设计思路,方法和内容 一、 如何撰写课题综述
课题综述是选题涉及到的相关文献资料进行专题搜集和必要的市场调研综合分析而写成的。
通过写作过程,了解相关信息,扩大知识面,综合运用所学知识,沥青设计思路为作品的设计打下基础。
课题综述只有800字左右,要求表述准确、观点明确、文字精炼。要把握“综”和“述”的特点。“综”式要求对所查阅的问小资料和市场调研情况进行综合分析、归纳整理,使材料更精炼明确,更有逻辑层次,“述”及iushiyaoqiu对课题进行比较专门的、全面的、深入的、系统的论述。总之,课题综述是作者对选题历史背景、前人工作、争论焦点、研究现状、发展前景、目的意义、创新性、实用价值诸方面的高度概括。
在撰写时,应注意以下几个问题:
1、搜集的文献应尽量全、尽量新。掌握全面、最新的文献资料是写好综述的前提。
2、注意引用文献的代表性、可靠性和科学性。引用要忠实文献原文。
3、参考文献不能省略,一般要求十篇以上,必须是作者直接阅读过的。
二、 如何撰写课题的设计思路、设计方法和设计内容
1、设计思路的撰写
总体上来说就是设计者以一个什么样的大体思路来完成自己的课题设计。内容主要包括规划选题的设计计划、设计步骤的主要组成部分、计划选题在什么地方有一些创新突破点、达到什么样的设计效果,最后以一个什么样的方式展现设计成果等方面。
2、设计方法的撰写
设计方法有很多种比如实例分析法、十字坐标法、调查分析法、头脑风暴法、希望点例举法、仿生学法、类比法、逆向思维法,缩小扩大法、缺点列举法,图表列举法,但所选择的课题在进行设计的时候不可能只用到一种设计方法。可以说明在设计的某一阶段主要采用什么设计方法。我们在应用各种方法时,一定要严格按照方法的要求,不能凭经验、常识去做。比如,我们要进行市场调查时,应明确制定调查表,明确如何进行分析包括综合分析和设计分析。
3、设计内容的撰写
简单介绍自己为何进行这项设计(说明现有设计的缺点),重点介绍自己课题设计的主要内容,自己将要在哪些方面进行重点的设计,并希望有所突破等方面。
如何撰写课题研究方案和填写课题申报表
1、关于课题申报表
未按要求填写的,应按要求填写到位。
封面上的课题名称如果研究方案里作了调整,这里封面上也需作相应调整;课题负责人,只填写1个即可;完成时间,课题研究期限一般为一年,或1-2年,完成时间应填某年某月底,课题研究的正式开始时间早于申报填表时间;成果形式写一种即可,一般为报告,有调查报告、实验报告、研究报告、结题报告等,而论文,为报告的高级形式;单位及职务、职称,一般填3个内容,实在没有职务的,填单位、职称2个内容;邮编、地址应填写清楚、完整联系电话一般填写单位(自己办公室)电话和本人手机电话号码,便于我们之间的联系。
第二面课题组其他面员的有关情况中的课题内分工,应填写明确,尤其是谁负责课题的总体设计,谁承担课题结题报告的执笔撰写任务应予明确;课题负责人所有单位意见,单位公章和单位分管领导的签字,都不能少。如果课题已批准立题,而签字盖章都应该补上,否则你的研究得不到单位及领导的支持。
2、关于课题的题目
教育科研课......>>
问题九:做软件项目设计文档怎么写啊 按照以下格式填就好了,不过是我自己写的,有不好的地方大家互相学习修改一下~
详细设计文档规范
1.0概述
这部分提供对整个设计文档的概述。描述了所有数据,结构,接口和软件构件级别的设计。
1.1 目标和对象
描述软件对象的所有目标。
1.2 陈述范围
软件描述。主要输入,过程功能,输出的描述,不考虑详细细节。
1.3 软件内容
软件被置于商业或者产品线中,讨论相关的战略问题。目的是让读者能够对“宏图”有所了解。
1.4 主要系统参数
任何商务软件或者产品线都包含软件规定、设计、实现和测试的说明和规范。
2.0 数据设计
描述所有数据结构包括内部变量,全局变量和临时数据结构。
2.1 内部软件数据结构
描述软件内部的构件之间的数据传输的结构。
2.2 全局数据结构
描述主要部分的数据结构。
2.3 临时数据结构
为临时应用而生成的文件的描述。
2.4 数据库描述
作为应用程序的一部分,描述数据库结构。
3.0 结构化和构件级别设计
描述程序结构。
3.1 程序结构
详细描述应用程序所选定的程序结构。
3.1.1 结构图
图形化描述结构。
3.1.2 选择性
讨论其它可供考虑的结构。选定3.1.1中结构类型的原因。
3.2 构件描述
详细描述结构中的每个软件构件。
3.2.1 构件过程叙述(PSPEC)
描述构件的过程。
3.2.2 构件接口描述
详细描述构件的输入和输出。
3.2.3 构件执行细节
每个构件的详细演算描述。
3.2.3.1 接口描述
3.2.3.2 演算模型(e.g., PDL)
3.2.3.3 规范/限制
]3.2.3.4 本地数据结构
3.2.3.5 在3.2.3.6设计中包含的执行结果
3.3 软件接口描述
软件对外界的接口描述
3.3.1机器对外接口
与其他机器或者设备的接口描述。
3.3.2系统对外接口
对其它系统、产品和网络的接口描述。
3.3.3与人的接口
概述软件与任何人的界面。
4.0 用户界面设计
描述软件的用户界面设计。
4.1 描述用户界面
详细描述用户界面,包括屏幕显示图标、图片或者类型。
4.1.1 屏幕图片
从用户角度描述界面。
4.1.2 对象和操作
所有屏幕对象和操作的定义。
4.2 界面设计规范
用户界面的设计和实现的规范和标准。
4.3 可见构件
实现的GUI可见构件说明。
4.4 UIDS描述
用户界面开发系统描述。
5.0约束、限制和系统参数
会影响软件的规格说明、设计和实现的特殊事件。
6.0测试标准
测试策略和预备测试用例描述。
6.1 测试的类别
......>>
问题十:'系统详细设计方案'的一些问题,输入(出)项怎么写? 25分 输入输出项是系统级的。这里针对的都是系统级的对外接口,系统级的输入输出项。
输入输出项侧重接口中涉及的重要数据结构的细节特征。
『陆』 如何简化linux usb 驱动 实验报告
《LINUX设备驱动程序》
USB骨架程序(usb-skeleton),是USB驱动程序的基础,通过对它源码的学习和理解,可以使我们迅速地了解USB驱动架构,迅速地开发我们自己的USB硬件的驱动。
前言
在上篇《Linux下的硬件驱动--USB设备(上)(驱动配制部分)》中,我们知道了在Linux下如何去使用一些最常见的USB设备。但对于做系统设计的程序员来说,这是远远不够的,我们还需要具有驱动程序的阅读、修改和开发能力。在此下篇中,就是要通过简单的USB驱动的例子,随您一起进入 USB驱动开发的世界。
USB驱动开发
在掌握了USB设备的配置后,对于程序员,我们就可以尝试进行一些简单的USB驱动的修改和开发了。这一段落,我们会讲解一个最基础USB框架的基础上,做两个小的USB驱动的例子。
USB骨架
在Linux kernel源码目录中driver/usb/usb-skeleton.c为我们提供了一个最基础的USB驱动程序。我们称为USB骨架。通过它我们仅需要修改极少的部分,就可以完成一个USB设备的驱动。我们的USB驱动开发也是从她开始的。
那些linux下不支持的USB设备几乎都是生产厂商特定的产品。如果生产厂商在他们的产品中使用自己定义的协议,他们就需要为此设备创建特定的驱动程序。当然我们知道,有些生产厂商公开他们的USB协议,并帮助Linux驱动程序的开发,然而有些生产厂商却根本不公开他们的USB协议。因为每一个不同的协议都会产生一个新的驱动程序,所以就有了这个通用的USB驱动骨架程序, 它是以pci 骨架为模板的。
如果你准备写一个linux驱动程序,首先要熟悉USB协议规范。USB主页上有它的帮助。一些比较典型的驱动可以在上面发现,同时还介绍了USB urbs的概念,而这个是usb驱动程序中最基本的。
Linux USB 驱动程序需要做的第一件事情就是在Linux USB 子系统里注册,并提供一些相关信息,例如这个驱动程序支持那种设备,当被支持的设备从系统插入或拔出时,会有哪些动作。所有这些信息都传送到USB 子系统中,在usb骨架驱动程序中是这样来表示的:
static struct usb_driver skel_driver = {
name: "skeleton",
probe: skel_probe,
disconnect: skel_disconnect,
fops: &skel_fops,
minor: USB_SKEL_MINOR_BASE,
id_table: skel_table,
};
变量name是一个字符串,它对驱动程序进行描述。probe 和disconnect 是函数指针,当设备与在id_table 中变量信息匹配时,此函数被调用。
fops和minor变量是可选的。大多usb驱动程序钩住另外一个驱动系统,例如SCSI,网络或者tty子系统。这些驱动程序在其他驱动系统中注册,同时任何用户空间的交互操作通过那些接口提供,比如我们把SCSI设备驱动作为我们USB驱动所钩住的另外一个驱动系统,那么我们此USB设备的 read、write等操作,就相应按SCSI设备的read、write函数进行访问。但是对于扫描仪等驱动程序来说,并没有一个匹配的驱动系统可以使用,那我们就要自己处理与用户空间的read、write等交互函数。Usb子系统提供一种方法去注册一个次设备号和file_operations函数指针,这样就可以与用户空间实现方便地交互。
『柒』 求Linux发展历史的详细资料
"Hello everybody out there using minix——I'm doing a (free) operating system"在1991年的八月,网络上出现了一篇以此为开篇话语的帖子——这是一个芬兰的名为Linus Torvalds的大学生为自己开始写作一个类似minix,可运行在386上的操作系统寻找志同道合的合作伙伴。
1991年10月5日,Linus Torvalds在新闻组comp.os.minix发布了大约有一万行代码的Linux v0.01版本。
到了1992年,大约有1000人在使用Linux,值得一提的是,他们基本上都属于真正意义上的hacker。
1993年,大约有100余名程序员参与了Linux内核代码编写/修改工作,其中核心组由5人组成,此时Linux 0.99的代码有大约有十万行,用户大约有10万左右。
1994年3月,Linux1.0发布,代码量17万行,当时是按照完全自由免费的协议发布,随后正式采用GPL协议。至此, Linux的代码开发进入良性循环。很多系统管理员开始在自己的操作系统环境中尝试linux,并将修改的代码提交给核心小组。由于拥有了丰富的操作系统平台,因而 Linux的代码中也充实了对不同硬件系统的支持,大大的提高了跨平台移植性。
1995年,此时的Linux 可在Intel、Digital 以及Sun SPARC处理器上运行了,用户量也超过了50万,相关介绍Linux的Linux Journal杂志也发行了超过10万册之多。
1996年6月,Linux 2.0内核发布,此内核有大约40万行代码,并可以支持多个处理器。此时的Linux 已经进入了实用阶段,全球大约有350万人使用。
http://axinchan.blogchina.com/blog/article_49053.243009.html
1997年夏,大片《泰坦尼克号》在制作特效中使用的160台Alpha图形工作站中,有105台采用了Linux操作系统。
1998年是Linux迅猛发展的一年。1月,小红帽高级研发实验室成立,同年RedHat 5.0获得了InfoWorld的操作系统奖项。4月Mozilla 代码发布,成为linux图形界面上的王牌浏览器。Redhat 宣布商业支持计划,网络了多名优秀技术人员开始商业运作。王牌搜索引擎"Google"现身,采用的也是Linux服务器。值得一提的是, Oracle 和Informix 两家数据库厂商明确表示不支持Linux,这个决定给予了Mysql数据库充分的发展机会。同年10月,Intel和Netscape宣布小额投资红帽软件,这被业界视作Linux获得商业认同的信号。同月,微软在法国发布了反Linux公开信,这表明微软公司开始将Linux视作了一个对手来对待。十二月,IBM发布了适用于Linux的文件系统AFS 3.5以及Jikes Java 编辑器和Secure Mailer及DB2测试版,IBM的此番行为,可以看作是与Linux羞答答地第一次亲密接触。迫于Windows和Linux的压力,Sun逐渐开放了Java协议,并且在UltraSparc上支持Linux操作系统。1998年可说是Linux与商业接触的一年。
1999年,IBM宣布与Redhat公司建立伙伴关系,以确保Redhat在IBM机器上正确运行。三月,第一届 LinuxWorld 大会的召开,象征Linux时代的来临。IBM、Compaq和Novell宣布投资Redhat公司,以前一直对Linux持否定态度的Oracle公司也宣布投资。五月,SGI公司宣布向Linux移植其先进的XFS文件系统。对于服务器来说,高效可靠的文件系统是不可或缺的,SGI的慷慨移植再一次帮助了Linux确立在服务器市场的专业性。7月IBM启动对Linux的支持服务和发布了Linux DB2,从此结束了Linux得不到支持服务的历史,这可以视作Linux真正成为服务器操作系统一员的重要里程碑。
2000年初始,Sun公司在Linux的压力下宣布Solaris8降低售价。事实上Linux对Sun造成的冲击远比对 Windows来得更大。 2月Red Hat发布了嵌入式Linux的开发环境,Linux在嵌入式行业的潜力逐渐被发掘出来。在4月,拓林思公司宣布了推出中国首家Linux工程师认证考试,从此使Linux操作系统管理员的水准可以得到权威机构的资格认证,此举大大增加了国内Linux爱好者学习的热情。伴随着国际上的Linux热潮,国内的联想和联邦推出了"幸福Linux家用版",同年7月中科院与新华科技合作发展红旗Linux, 此举让更多的国内个人用户认识到了存在着Linux这个操作系统。11月,Intel 与 Xteam合作,推出基于Linux的网络专用服务器,此举结束了在Linux单向顺应硬件商硬件开发驱动的历史。
2001月新年依使就爆出新闻,Oracle宣布在OTN上的所有会员都可免费索取Oracle 9i的Linux版本,从几年前的"绝不涉足Linux系统"到如今的主动献媚,足以体现Linux的发展迅猛。IBM则决定投入10亿美元扩大 Linux系统的运用,此举犹如一针强心剂,令华尔街的投资者们闻风而动。到了5月这个初夏的时节,微软公开反对"GPL"引起了一场大规模的论战。8月红色代码爆发,引得许多站点纷纷从windows操作系统转向linux操作系统,虽然是一次被动的转变,不过也算是一次应用普及吧。12月Red Hat 为IBM s/390大型计算机提供了Linux解决方案,从此结束了AIX孤单独行无人伴的历史。
2002年是Linux企业化的一年。2月,微软公司迫于各洲政府的压力,宣布扩大公开代码行动,这可是Linux开源带来的深刻影响的结果。3月,内核开发者宣布新的Linux系统支持64位的计算机。
2003年1月,NEC宣布将在其手机中使用Linux操作系统,代表着Linux成功进军手机领域。5月之中SCO表示就 Linux使用的涉嫌未授权代码等问题对IBM进行起诉,此时人们才留意到,原本由SCO垄断的银行/金融领域,份额已经被Linux抢占了不少,也难怪 SCO如此气急败坏了。9 月中科红旗发布Red Flag Server4版本,性能改进良多。11月IBM注资Novell以2.1亿收购SuSE,同期Redhat计划停止免费的Linux,顿时业内骂声四起。Linux在商业化的路上渐行渐远。
2004年的第1月,本着"天下事分久必合,合久必分"之天理,SuSE嫁到了Novell,SCO继续顶着骂名四处强行"化缘 ", Asianux, MandrakeSoft也在五年中首次宣布季度赢利。3月SGI宣布成功实现了Linux操作系统支持256个Itanium 2处理器。4月里美国斯坦福大学Linux大型机系统被黑客攻陷,再次证明了没有绝对安全的OS。六月的统计报告显示在世界500强超级计算机系统中,使用Linux操作系统的已经占到了280席,抢占了原本属于各种Unix的份额。9月HP开始网罗Linux内核代码人员,以影响新版本的内核朝对HP有利的方式发展,而IBM则准备推出OpenPower服务器,仅运行Linux系统。
"谁会牵你的手,走过风风雨雨"这句歌词曾经代表着千万Linuxer的心,如今,这只可爱的小企鹅终于能独挡一面,在IBM、HP、Novell、Oracle等诸多厂商的支持下,迎着风雪傲然前行。
『捌』 linux查看文件修改前后差别的代码
在这里,我们将看到如何使用C ++程序在Linux平台上列出修改后的文件以及旧的和新创建的文件。
任务很简单。我们可以使用Linux shell命令以所需顺序获取文件。ls –l命令用于获取长列表格式的所有文件。在这里,我们将添加更多选项以根据时间对它们进行排序。(升序和降序)。–t命令用于根据时间排序,并且–r可添加以反转顺序。
该命令将如下所示:ls –lt
ls –ltr
我们将使用system()C ++中的函数使用这些命令,以从C ++代码获取结果。
范例程式码#include
using namespace std;
main(){
//显示存储在当前目录中的文件的修改时间降序
cout <
system("ls -lt"); //use linux command to show the file list, sorted on time
cout <
system("ls -ltr"); //use the previous command -r is used for reverse order
}
输出结果Files List (First one is newest)
total 32
-rwxr-xr-x 1 soumyadeep soumyadeep 8984 May 11 15:19 a.out
-rw-r--r-- 1 soumyadeep soumyadeep 424 May 11 15:19 linux_mod_list.cpp
-rw-r--r-- 1 soumyadeep soumyadeep 1481 May 4 17:03 test.cpp
-rw-r--r-- 1 soumyadeep soumyadeep 710 May 4 16:51 caught_interrupt.cpp
-rw-r--r-- 1 soumyadeep soumyadeep 557 May 4 16:34 trim.cpp
-rw-r--r-- 1 soumyadeep soumyadeep 1204 May 4 16:24 1325.test.cpp
Files List (First one is oldest)
total 32
-rw-r--r-- 1 soumyadeep soumyadeep 1204 May 4 16:24 1325.test.cpp
-rw-r--r-- 1 soumyadeep soumyadeep 557 May 4 16:34 trim.cpp
-rw-r--r-- 1 soumyadeep soumyadeep 710 May 4 16:51 caught_interrupt.cpp
-rw-r--r-- 1 soumyadeep soumyadeep 1481 May 4 17:03 test.cpp
-rw-r--r-- 1 soumyadeep soumyadeep 424 May 11 15:19 linux_mod_list.cpp
-rwxr-xr-x 1 soumyadeep soumyadeep 8984 May 11 15:19 a.out
相关资源:高性能跨平台(Win&Linux;)网络通信框架HP-Socket_易语言hpsocket...
文章知识点与官方知识档案匹配
CS入门技能树Linux入门创建一个空白文件
23936 人正在系统学习中
打开CSDN,阅读体验更佳
每天一个新知识之linux下利用diff比较两个文件的差异并使用patch进行差异...
1、首先我们先来了解下diff和patch这两个命令的使用方式diff 选项 旧文件 新文件 #作用比较新旧文件的不同常用选项用途-a将文档当作文本文档来处理-b忽略空格造成的差异-B忽略空白行造成的差异-I忽略大小写造成的差异-N当比较两个目录...
继续访问
Linux下 用cmp工具备份,文件比较工具:diff,cmp_贾少女的博客-CSDN博 ...
补充说明:patch指令让用户利用设置修补文件的方式,修改,更新原始文件。倘若一次仅修改一个文件,可直接在指令列中下达指令依序执行。如果配合修补文件的方式则能一次修补大批文件,这也是Linux系统核心的升级方法之一。
继续访问
新旧文件对比软件、文件对比
一款不可多得的专业级的文件夹和文件对比工具。使用他可以很方便的对比出两个文件夹或者文件的不同之处。并把相差的每一个字节用颜色加以表示,查看方便。并且支持多种规则对比。 对软件汉化者来说,这绝对是一款不可多得的工具。
linux查找最老文件,linux find命令查找比某个文件新或旧的文件
如果希望查找更改时间比某个文件新但比另一个文件旧的所有文件,可以使用-newer选项。它的一般形式为:复制代码代码如下:newest_file_name ! oldest_file_name---其中,!是逻辑非符号。$ find . / -newer age.txt ! -newer belts.txt -exec ls -l {} /;例如:查找2012年17日17:00到17:40更新的文件...
继续访问
linux 那些文本工具,linux之文本比较工具_weixin_39839541的博客-CSDN...
新建的passwd.old和passwd.new之间是两个不同的版本,如果要软件升级怎么办?就是将旧的文件升级为新的文件,可以先比较新旧版本,再将区别文件制作成不定文件,再由补丁文件更新旧文件 [root @localhost vitest]#diff -Naur passwd.old ...
继续访问
Linux 检查文件与比较两个文件(非常详细)_i鲸落i的博客_linu...
Linux 检查文件与比较两个文件(非常详细) linux中如何去检查文件 ,看文件是否存在呢? 今天我们用到命令是test命令,这个命令最关键的作用就是用来检查/比较文件 目录
继续访问
[C/C++][文件操作] 对比目录并列出同名较新文件、较旧文件 0.1
作者 [email protected],转载请注明出处:[C/C++][文件操作]目录/文件夹对比并列出同名较新文件、较旧文件 V1 主要是模仿robo的部分功能 (robo /L 参数可以列出本地目录和备份目录中的异同之处,主要是标记出:较新的、较旧的、多出的文件 ) 现在还不会写GUI,打算后面自己做目录树diff,可以手动点选要复制的文件。 同时我也...
继续访问
linux下的文件比对工具,Linux - 文件比对工具
通常一个软件包的不同版本之间,比较配置文件与原始档的差异时,经常用到一些文件比对的工具。这里就讲一下diff和cmp。1. 以行为单位对比的diff由于是以行为比对的单位,因此diff常常是用在同一文件(或软件)的新旧版本差异上。工作模式:diff [-bBi] file1 file2选项与参数-- file1 :作为原始比对文件的文档名-- file2 :作为目的比对文件的文档名注意,file1...
继续访问
linux下文件比较工具diff|cmp使用小结_wangww631的博客_cmp...
diff是Unix系统的一个很重要的工具程序。它用来比较两个文本文件的差异,是代码版本管理的基石之一。 2.diff使用格式 (1)比较文件 [plain]view plain diff filename_1 filename_2 diff filename_1 filename_2 ...
继续访问
Linux命令详解1--文件和目录管理之文件查找和比较_dijiao1273的博客-CSD...
locate命令其实是find -name的另一种写法,但是要比后者快得多,原因在于它不搜索具体目录,而是搜索一个数据库/var/lib/locatedb,这个数据库中含有本地所有文件信息。Linux系统自动创建这个数据库,并且每天自动更新一次,所以使用locate命令查...
继续访问
Shell条件测试之文件比较
文件比较(文件测试运算符): -d file : file是否为目录,directory简写d -f file : file是否为文件,file简写为f -e file :file是否存在,exist简写为e -r file :file是否可读,read简写r -w file : file是否可写,write简写为w -x file : file是否可执行,execute执行简写为x ...
继续访问
linux对比文件更新
比较服务器本地差异文件上传 rsync-c-n-I-vzrtopg-P--excludeRuntime/--exclude'.git*'--exclude'Menu*'--exclude'Application/Common/Common/function.php'--exclude'Application/Home/Controller/CabinetController.class.php'--exclude'Application/Home/Model/Cabin...
继续访问
Linux文本比较指令(diff,cmp)详解_siasjack的博客
一、文本文件比较命令diff 1>diff命令的功能 Linux中diff命令的功能为逐行比较两个文本文件,列出其不同之处。它对给出的文件进行系统的检查,并显示出两个文件中所有不同的行,不要求事先对文件进行排序。
继续访问
linux下文件比较工具diff|cmp使用小结
1.diff diff是Unix系统的一个很重要的工具程序。它用来比较两个文本文件的差异,是代码版本管理的基石之一。 2.diff使用格式 (1)比较文件 diff filename_1 filename_2(2)比较目录 diff dir_1 dir_2diff命令常用的选项: -b —— 忽略一行中的空字符的区别(例如“Hello World!!” 与 “Hello
继续访问
热门推荐 Linux 比较两个文件的差异并显示
Linux 中 diff 用于比较文件的内容,特别是比较两个版本不同的文件以找到改动的地方。可以用来比较单个文件或者目录内容。根据不同的选项进行比较并且显示。
继续访问
在 Linux 上比较文件的聪明方法
自 Linux 早期以来,用于比较文件的命令已经激增。在这篇文章中,我们将介绍一组可用于比较文件的命令,并重点介绍一些较新的命令所提供的优势。 差异 diff命令是用于检测和报告文件差异的最古老且仍然流行的命令之一。比较两个与会者列表,diff命令将简单而清晰地向您显示差异。 $ diff 出勤-2020 出勤-2021 10,12c10 < 门罗·兰德里 <乔纳森·穆迪 < 唐纳尔摩尔 --- > 桑德拉·亨利-斯托克 仅显示不同的行。输出位于仅在第一个文件中带有<
继续访问
Linux命令 - diff 命令(比较文件的差异)
Linux diff 命令 文章目录Linux diff 命令简介输出结果解释实例实例1:比较两个文件实例2:并排格式输出常用参数 简介 Linux diff 命令用于比较文件的差异。 diff 以逐行的方式,比较文本文件的异同处。如果指定要比较目录,则 diff 会比较目录中相同文件名的文件,但不会比较其中子目录。 输出结果解释 diff 比较结果的含义,diff 描述两个文件不同的方式是告诉我们怎么样改变第一个文件之后与第二个文件匹配。 a = add c = change d = d
继续访问
文件新旧判断和字符串判断
两个文件之间进行比较 文件1 -nt 文件2 判断文件1的修改时间是否比文件2的新 文件1 -ot 文件2 判断文件1的修改时间是否比文件2的旧 文件1 -ef 文件2 判断文件1是否和文件2的inode号一致,可以理解为两个文件是否为同一个文件。这个判断用于判断硬链接是很好的方法。 字符串的判断 -z 字符串 判断字符串是否为空 -n 字符串 判断字符串是...
继续访问
Linux diff 比较文件差异
作者:解琛 时间:2020 年 8 月 28 日 diff 为 Linux 命令,用于比较文本或者文件夹差异,可以通过 man 来查询其功能以及参数的使用。 使用 patch 命令可以对文件或者文件夹应用修改。 diff -r -u -P proj_a_original proj_a_mine > diff.patch 递归的比较文件夹差异,并将结果重定向输出到 diff.patch 文件中。 proj_a_original 指 proj_a 的源文件,即未经修改的源码包,proj_a_mine.
继续访问
每天一个新知识之linux下利用diff比较两个文件的差异并使用patch进行差异文件同步
1、首先我们先来了解下diff和patch这两个命令的使用方式 diff 选项 旧文件 新文件 #作用比较新旧文件的不同 常用选项 用途 -a 将文档当作文本文档来处理 -b 忽略空格造成的差异 -B 忽略空白行造成的差异 -I 忽略大小写造成的差异 -N 当比较两个目录时,如果某个文件只在一个目录中,则在另一个目录中将视为空文件 -r 比较目录时递归比较子目录 -u 使用统一的输出格式 patch 选项 < 修补文件 #用于修补文件。 常用
继续访问
Linux文件对比
diff /etc/rc0.d/ /etc/rc5.d/ Only in /etc/rc0.d/: K90network Only in /etc/rc5.d/: S10network 文件对比工具:Kompare Kompare是一种比较GUI包装器,让用户可以查看文件之间的差异,并且合并文件。 它的一些功能包括如下: 支持多种diff格式 支持目录比较 支持读取diff文件 可...
继续访问
Linux系列九-文件比较diff、patch
一、diff 文件比较 diff [-bBi] sourcefile targetfile -b 忽略行中的多个空白的区别,如 about me 与about me相同 -B 忽略空白行 -i 忽略大小写 二、patch 结合diff使用,由比较得出的差异内容,可向文件中补充差异内容 patch -pN < patchfile patch -...
继续访问
Linux对比文件差异
方法一 使用diff # 最简单的 diff file1 file2 显示的结果怎么看? "|"表示前后2个文件内容有不同; "<"表示后面文件比前面文件少了1行内容; ">"表示后面文件比前面文件多了1行内容。 方法二(直观,推荐) 使用vimdiff 首先要注意,vimdiff是基于diff的 # 最简单的 vimdiff file1 file2 # 也可以 vim -d file1 file2 显示的结果怎么看? 比较文件连续的相同行被折叠; 只在某一文件存的行
继续访问
最新发布 Shell命令比较2个文件的差异
1、测试创建文件a.txt touch a.txt vim a.txt shift+i插入数据 aaa bbb ccc 2、测试创建文件b.txt touch b.txt vim b.txt shift+i插入数据 111 bbb aaa 3、比较2个文件的差异 4、排序后再比较 cat a.txt|sort|uniq|sort>a_u.txt cat b.txt|sort|uniq|sort>b_u.txt 5、比较排序后的a_u.txt和b_u.txt文件的差 6、个人认为以后比较2个文
继续访问
linux比较文件的新旧
linux中文件新旧怎么比
『玖』 嵌入式里做linux内核开发有没有前途
搜索“linux”,更可以获得近2000条记录。从这些职位上看,市场上需要的嵌入式人才必须具备C语言编程经验、嵌入式操作系统(嵌入式Linux)、具有内核裁剪经验、具有驱动程序开发经验。这些都是在学校无法学到的知识。尽管很多大学的电子、计算机专业都开设了程序设计、微机原理、单片机等课程,但高校输送的人才与企业需要的人才却始终没有对应上。
根据《2011-2012年中国嵌入式开发从业人员调查报告》得出结论:在社会生活压力不断增大、大学生就业难的今天,随着高校专业学科建设更加趋于灵活高效,嵌入式及相关专业在大学校园内的普及和发展也达到了前所未有的速度。在高校更加贴近企业需求的实训模式的引导下,越来越多的计算机、电子、自动化等相关专业的本科生和研究生开始将自己的职业规划定位到高薪诱人且发展前景极为广阔的专业嵌入式开发领域。
一个做应用,一个做底层移植(注意哦是移植,谁敢从0开始写),两者都会更有前途,反正单纯搞应用最没前途
没有吧?其实软件并不总是需要创新,干的时间长了,好多软件都做成了模块,大多数新工程都是重新搭建一下,新写的东西比较少。
标准的答案!1:嵌入式是必须要和处理器架构打交道的!和处理器有关的电路可以说都是数字电路;所以嵌入式必须要懂数字电路; 2:linux内核开发:个人感觉还是要懂的!因为linux内核有两部分代码:和处理器架构有关的:~/arch/目录下面的代码;和通用代码;和架构相关的就是和硬件打交道了; 3:个人感觉能高Linuxkernel开发的人都是特别大神级的人物;中国好像不多行兄;搞LinuxDriver的倒是挺多!但真正大牛(像linux社区的大牛)也不多! 4:个人感觉你问这个问题问的有点问题……把自己的目标放的太大了!
当然有区别了:linux应用开发是上层软件应用的开发,主要利用linux中的开源代码进行软件开发,是一些应用性的,跟人的需求关系有关系。
linux内核开发是开发系统底层的软件开发,用硬件关系很大,主要跟底层的硬件有关,比如:操作寄早缺存器,驱动一些模块等。
底层较难,主要跟兴趣有关,linux内核开发的前途很好,转行业比较好转,灵活性很强
在中国真正有内核开发需求的公司并不多。
但是真正做的好的话,陆带辩钱一定少不了
内核开发难度更大,首先是你要整体掌握linux结构层次,还需要对硬件很熟悉
网络编程相对简单一些
《嵌入式系统Linux内核开发实战指南(ARM平台)》凝聚了作者12年的工作经验和学习心得与体会,内容覆盖了嵌入式系统Linux内核开发的各个方面。作者根据自己11年的一线工作经验,介绍了嵌入式系统的概念、组织架构、工作原理、软硬件设计流程、开发调试方法以及嵌入式Linux的开发方法与技能,其中列举了许多作者工作中的实际案例;
●对于经验非常丰富的高手,可以参照详细目录直接阅读代码透析Linux内核实现原理的相关章节
●对于入行多年的工程师,本书包含作者10多年的实战经验与技能,让你遇到难题不求人
●对于刚起步的初学者,本书详细介绍了嵌入式Linux开发流程和方法,让你快速入门,不走弯路
这两个方向都是比较好的方向,但学起来确实不容易。不知道你的基础如何。做开发的人不要永远在一线做开发,做到一定的程度应该转型搞管理。Windows内核、驱动开发我不了解,前景如何不得而知;VxWorks我倒是了解一些,这个方向不错,它代表了嵌入式操作系统的最高水平。能熟练掌握VxWorks平台下的嵌入式系统研发,你就真成牛人了,不是象牛一样工作哦,而是牛B哦
linux开发前景不错的,个人建议你这个时期主要是学习,丰富自己的开发经验,内核开发会让你更深入扎实的了解linux系统,嵌入式开发经验能给你更多的硬件知识的补充,建议你在这2方面若有机会有好的环境来学习的话就优先先学习吧,这2方面我认为前景更远大
就是赚点打工钱,提高些经验,也没什么坏处,但前途还是在国内,很多人都回来了,毕竟软件都是外包给我们做的,核心架构人家不用我们开发。
『拾』 LINUX系统的内存管理知识详解
内存是Linux内核所管理的最重要的资源之一。内存管理系统是操作系统中最为重要的部分,因为系统的物理内存总是少于系统所需要的内存数量。虚拟内存就是为了克服这个矛盾而采用的策略。系统的虚拟内存通过在各个进程之间共享内存而使系统看起来有多于实际内存的内存容量。Linux支持虚拟内存, 就是使用磁盘作为RAM的扩展,使可用内存相应地有效扩大。核心把当前不用的内存块存到硬盘,腾出内存给其他目的。当原来的内容又要使用时,再读回内存。以下就是我为大家整理到的详细LINUX系统内存管理的知识,欢迎大家阅读!!!
LINUX系统教程:内存管理的知识详解
一、内存使用情况监测
(1)实时监控内存使用情况
在命令行使用“Free”命令可以监控内存使用情况
代码如下:
#free
total used free shared buffers cached
Mem: 256024 192284 63740 0 10676 101004
-/+ buffers/cache: 80604 175420
Swap: 522072 0 522072
上面给出了一个256兆的RAM和512兆交换空间的系统情况。第三行输出(Mem:)显示物理内存。total列不显示核心使用的物理内存(通常大约1MB)。used列显示被使用的内存总额(第二行不计缓冲)。 free列显示全部没使用的内存。Shared列显示多个进程共享的内存总额。Buffers列显示磁盘缓存的当前大小。第五行(Swap:)对对换空间,显示的信息类似上面。如果这行为羡芹全0,那么没使用对换空间。在缺省的状态下,free命令以千字节(也就是1024字节为单位)来显示内存使用情况。可以使用—h参数以字节为单位显示内存使用情况,或者可以兄晌使用—m参数以兆字节为单位显示内存使用情况。还可以通过—s参数使用命令来不间断地监视内存使用情况:
#free –b –s2
这个命令将会在终端窗口中连续不断地报告内存的使用情况,每2秒钟更新一次。
(2)组合watch与 free命令用来实时监控内存使用情况:
代码如下:
#watch -n 2 -d free
Every 2.0s: free Fri Jul 6 06:06:12 2007
total used free shared buffers cached
Mem: 233356 218616 14740 0 5560 64784
-/+ buffers/cache: 148272 85084
Swap: 622584 6656 615928
watch命令会每两秒执行 free一次,执行前会清除屏幕,在同样位置显示数据。因为 watch命令不会卷动屏幕,所以适合出长时间的监测内存使用率。可以使用 -n选项,控制执行的频率;也可以利用 -d选项,让命令将每次不同的地方显示出来。Watch命令会一直执行,直到您按下 [Ctrl]-[C] 为止。
二、虚拟内存的概念
(1)Linux虚拟内存实现机制
Linux虚拟内存的实现需要六种机制的支持:地址映射机制、内存分配回收机制、缓存和刷新机制、请求页机制、交换机制、内存共享机制。
首先内存管理程序通过映射机制把用户程序的逻辑地址映射到物理地址,在用户程序运行时如果发现程序中要用的虚地址没有对应的物理内存时,就发出了请求页要求;如果有空闲的内存可供分配,就请求分配内存(于是用到了内存的分配和回收),并把正在使用的物理页记录在缓存中(使用了缓存机制)。 如果没有足够的内存可供分配,那么就调用交换机制,腾出一部分内存。另外在地址映射中要通过TLB(翻译后援存储器)来寻找物理页;交换机制中也要羡派锋用到交换缓存,并且把物理页内容交换到交换文件中后也要修改页表来映射文件地址。
(2)虚拟内存容量设定
也许有人告诉你,应该分配2倍于物理内存的虚拟内存,但这是个不固定的规律。如果你的物理保存比较小,可以这样设定。如果你有1G物理内存或更多的话,可以缩小一下虚拟内存。Linux会把大量的内存用做Cache的,但在资源紧张时回收回.。你只要看到swap为0或者很小就可以放心了,因为内存放着不用才是最大的浪费。
三、使甩vmstat命令监视虚拟内存使用情况
vmstat是Virtual Meomory Statistics(虚拟内存统计)的缩写,可对操作系统的虚拟内存、进程、CPU活动进行监视。它是对系统的整体情况进行统计,不足之处是无法对某个进程进行深入分析。通常使用vmstat 5 5(表示在5秒时间内进行5次采样)命令测试。将得到一个数据汇总它可以反映真正的系统情况。
代码如下:
#vmstat 5 5
procs -----------memory---------- ---swap-- -----io---- --system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
1 0 62792 3460 9116 88092 6 30 189 89 1061 569 17 28 54 2
0 0 62792 3400 9124 88092 0 0 0 14 884 434 4 14 81 0
0 0 62792 3400 9132 88092 0 0 0 14 877 424 4 15 81 0
1 0 62792 3400 9140 88092 0 0 0 14 868 418 6 20 74 0
1 0 62792 3400 9148 88092 0 0 0 15 847 400 9 25 67 0
vmstat命令输出分成六个部分:
(1)进程procs:
r:在运行队列中等待的进程数 。
b:在等待io的进程数 。
(2)内存memoy:
swpd:现时可用的交换内存(单位KB)。
free:空闲的内存(单位KB)。
buff: 缓冲去中的内存数(单位:KB)。
cache:被用来做为高速缓存的内存数(单位:KB)。
(3) swap交换页面
si: 从磁盘交换到内存的交换页数量,单位:KB/秒。
so: 从内存交换到磁盘的交换页数量,单位:KB/秒。
(4) io块设备:
bi: 发送到块设备的块数,单位:块/秒。
bo: 从块设备接收到的块数,单位:块/秒。
(5)system系统:
in: 每秒的中断数,包括时钟中断。
cs: 每秒的环境(上下文)切换次数。
(6)cpu中央处理器:
cs:用户进程使用的时间 。以百分比表示。
sy:系统进程使用的时间。 以百分比表示。
id:中央处理器的空闲时间 。以百分比表示。
如果 r经常大于 4 ,且id经常小于40,表示中央处理器的负荷很重。 如果bi,bo 长期不等于0,表示物理内存容量太小。
四、Linux 服务器的内存泄露和回收内存的方法
1、内存泄漏的定义:
一般我们常说的内存泄漏是指堆内存的泄漏。堆内存是指程序从堆中分配的,大小任意的(内存块的大小可以在程序运行期决定),使用完后必须显示释放的内存。应用程序一般使用malloc,realloc,new等函数从堆中分配到一块内存,使用完后,程序必须负责相应的调用free或释放该内存块,否则,这块内存就不能被再次使用,我们就说这块内存泄漏了。
2、内存泄露的危害
从用户使用程序的角度来看,内存泄漏本身不会产生什么危害,作为一般的用户,根本感觉不到内存泄漏的存在。真正有危害的`是内存泄漏的堆积,这会最终消耗尽系统所有的内存。从这个角度来说,一次性内存泄漏并没有什么危害,因为它不会堆积,而隐式内存泄漏危害性则非常大,因为较之于常发性和偶发性内存泄漏它更难被检测到。存在内存泄漏问题的程序除了会占用更多的内存外,还会使程序的性能急剧下降。对于服务器而言,如果出现这种情况,即使系统不崩溃,也会严重影响使用。
3、内存泄露的检测和回收
对于内存溢出之类的麻烦可能大家在编写指针比较多的复杂的程序的时候就会遇到。在 Linux 或者 unix 下,C、C++语言是最使用工具。但是我们的 C++ 程序缺乏相应的手段来检测内存信息,而只能使用 top 指令观察进程的动态内存总额。而且程序退出时,我们无法获知任何内存泄漏信息。
使用kill命令
使用Linux命令回收内存,我们可以使用Ps、Kill两个命令检测内存使用情况和进行回收。在使用超级用户权限时使用命令“Ps”,它会列出所有正在运行的程序名称,和对应的进程号(PID)。Kill命令的工作原理是:向Linux操作系统的内核送出一个系统操作信号和程序的进程号(PID)。
应用例子:
为了高效率回收内存可以使用命令ps 参数v:
代码如下:
[root@www ~]# ps v
PID TTY STAT TIME MAJFL TRS DRS RSS %MEM COMMAND
2542 tty1 Ss+ 0:00 0 8 1627 428 0.1 /sbin/mingetty tty1
2543 tty2 Ss+ 0:00 0 8 1631 428 0.1 /sbin/mingetty tty2
2547 tty3 Ss+ 0:00 0 8 1631 432 0.1 /sbin/mingetty tty3
2548 tty4 Ss+ 0:00 0 8 1627 428 0.1 /sbin/mingetty tty4
2574 tty5 Ss+ 0:00 0 8 1631 432 0.1 /sbin/mingetty tty5
2587 tty6 Ss+ 0:00 0 8 1627 424 0.1 /sbin/mingetty tty6
2657 tty7 Ss+ 1:18 12 1710 29981 7040 3.0 /usr/bin/Xorg :0 -br -a
2670 pts/2 Ss 0:01 2 682 6213 1496 0.6 -bash
3008 pts/4 Ss 0:00 2 682 6221 1472 0.6 /bin/bash
3029 pts/4 S+ 0:00 2 32 1783 548 0.2 ping 192.168.1.12
3030 pts/2 R+ 0:00 2 73 5134 768 0.3 ps v
然后如果想回收Ping命令的内存的话,使用命令:
代码如下:
# Kill -9 3029
使用工具软件
Memprof是一个非常具有吸引力且非常易于使用的软件,它由Red Hat的Owen Talyor创立。这个工具是用于GNOME前端的Boehm-Demers-Weiser垃圾回收器。这个工具直接就可以执行,并且其工作起来无需对源代码进行任何修改。在程序执行时,这个工具会以图形化的方式显示内存的使用情况。
相关介绍:Linux
严格来讲,Linux这个词本身只表示Linux内核,但人们已经习惯了用Linux来形容整个基于Linux内核,并且使用GNU 工程各种工具和数据库的操作系统。
Linux拥有以下特性:类似于Unix的基本思想,支持完全免费与自由传播,完全兼容POSIX1.0标准,支持多用户、多任务、有着良好的界面、支持多种平台。Linux 能运行主要的UNIX工具软件、应用程序和网络协议。它支持32位和64位硬件。Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。
Linux有着许多不同的版本,但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、视频游戏控制台、台式计算机、大型机和超级计算机。