前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >FPGA Xilinx Zynq 系列(三十五)Linux 概览

FPGA Xilinx Zynq 系列(三十五)Linux 概览

作者头像
FPGA技术江湖
发布2020-12-30 12:14:25
1.1K0
发布2020-12-30 12:14:25
举报
文章被收录于专栏:FPGA技术江湖FPGA技术江湖
大侠好,欢迎来到FPGA技术江湖,江湖偌大,相见即是缘分。大侠可以关注FPGA技术江湖,在“闯荡江湖”、"行侠仗义"栏里获取其他感兴趣的资源,或者一起煮酒言欢。

今天给大侠带来FPGA Xilinx Zynq 系列第三十五篇,开启第二十二章,带来Linux 概览相关内容,本篇内容目录简介如下:

22. Linux 概览

本系列分享来源于《The Zynq Book》,Louise H. Crockett, Ross A. Elliot,Martin A. Enderwitz, Robert W. Stewart. L. H. Crockett, R. A. Elliot, M. A. Enderwitz and R. W. Stewart, The Zynq Book: Embedded Processing with the ARM Cortex-A9 on the Xilinx Zynq-7000 All Programmable SoC, First Edition, Strathclyde Academic Media, 2016。

Linux 概览

本章对 Linux 操作系统做一个大致的介绍,首先来一个随叫随停的旅程,看看 Linux 创立之初的故事。然后对系统做一个总的概述,为随后章节的深入分析铺平道路。具体来说,这些章节会覆盖 Linux 内核和文件系统、设备驱动和启动过程。

一些和 Linux 及其应用开发相关的工具和资源也将在本章中提及。

22.1 简单历史

Linux 是在 1991 年 4 月开始构思的,这个项目的第一次发布是在那一年的 8 月。芬兰的一位名叫 Linus Torvalds 的计算机专业学生,在 Usenet 的 comp.os.minix 组发布了如下的声明:

他所说的 Minix 是 UNIX 操作系统的一个变种,在那个时候是打算在 x86 家用 PC 上开发免费操作系统的参考指南。

追溯到 1983 年,Richard Stallman 已经开始了一个计划,来创建一个自由的 (言论自由的自由,而不是免费啤酒的免费)、类 UNIX 的操作系统,名字叫做 GNU,这是一个递归的缩写,意思是 “GNU is Not UNIX (GNU 不是 UNIX)”。实际上, Linux 的起源可以追溯到更早,到 1970 年代早期在 AT&T 贝尔实验室所创建的 UNIX操作系统!

GNU 计划的主要动机是整个 1980 年代产权软件的垄断。一个自由的操作系统被看作是朝向 “ 自由 ” 计算所铺的基石。不过,要写一个操作系统出来可不是一件小事,到了 1990 年(在 1985 年 10 月成立的自由软件基金会的资助下),这个操作系统的所有的主要部件都已经开发出来了,除了一个。这个最后的部件,操作系统的核心,就是内核 [1]。用 Stallman 所提供的 GNU 工具,Torvalds 做出了 Linux 内核 (在第 23 章会详细讨论),这标志着今天我们所用的 Linux 的起源。

Linux 是合作开发的,许多不同公司的开发者在开发和研究上合作,共同投入成本,形成了一个生态系统。这整个生态系统,从 2008 年估值 123 亿美元到 2013年成长为 355 亿美元 [2]。今天,Linux 比以往更为流行,在各种各样的设备上,从手机和卫星导航系统到超级计算机和服务器,都可以找到 Linux 的踪影。

22.2 Linux系统概述

图 22.1 是一个 GNU/Linux 系统的通用高层架构。实际上,这个内核空间是一个复杂得多的概念,其中包含了比这里多得多的部件。不过,为了我们行文的需要,此刻先考虑最重要的部分。

在内核之上运行的应用与系统程序以及 GNU C 库是在用户空间里的。应用指的是具有实际功能的程序,比如文字处理、游戏或开发来运行在 Zynq 芯片的处理器上的 C 程序。而系统程序是实现各种操作系统服务所必须的!这些操作系统服务保证了系统能确实工作。物理硬件位于链条相反的一侧,经由内核空间从用户层级抽象出来,包括如整个存储系统、开发板上的网卡或 GPIO 等。用户层和硬件只能间接访问的这种设计实现了安全性,因为它以使用内核工具的方式确保了访问的规则[3]。

图 22.1: GNU/Linux 系统高层架构

系统调用接口 (SCI)提供了从用户空间调用系统的内核功能。前面讨论过, Linux 内核构成了操作系统的心脏,提供了一组工具,使得用户空间可以与硬件交互。Linux 内核本身可以被划分成它自己的分层子系统,比如内存和进程管理、虚拟文件系统和设备驱动。不过,这些会在第 23 章深入讲解。内核代码被认为是与体系架构无关的,它的代码对 Linux 所支持的所有处理器架构都是通用的。在这之下是架构相关的代码,也就是处理器和平台专用的,这部分一般叫做 BSP。

22.3 许可

Linux的许可问题是令人疑惑的,其中充斥了不同的标准和缩写。回想在第22.1节所提到的 GNU 计划,我们记得这个计划的基础是创建一个 “ 自由 ” 的操作系统。为了发布自由软件,必须使用一个自由许可。GNU 中这些催生了 Linux 的工具,一般都用了 GNU 通用公共许可(GNU GPL)。还有其他的自由许可(以及不同的版本), 兼容 GPL 有像是 GNU Lesser GPL (LGPL)、GNU Affero GPL (AGPL)、GNU All- Permissive 许可、Modified BSD 许可、Apache 许可、Intel 开源许可、Mozilla 公共许可 (MPL)...... 这个列表还在增长 [4]!

用什么许可取决于开发者的需求,每种许可的规则和条款都不尽相同,所以有必要研究清楚最适合于正在开发的软件的许可方式。

显然,有着那么长的一张许可列表,想要把每一个的细节都弄清楚就可以写一 整本书了!因此我们着重看一下 GNU GPL 来了解这些许可会提供的各种许可术语。

22.3.1 GNU 通用公共许可

GNU GPL 又被叫做公共版权 (copyleft) 许可。作为对版权 (copyright)一词 的玩弄,它代表的是这样一种做法,在软件发布和修改中运用版权法,但是每一次的修改都要保留相同的权利。这样做,从而就确保了程序是自由的 [5]。下面列出的只是 GPL 的规则的某些细节 [6]:

  • 当一个软件基于 GNU GPL 作为自由软件发布了,那么之后所有的更新或修改都 必须继续作为自由软件来发布;
  • 如果所做的修改是供组织或公司内部使用,就可以不公开;但是,如果以任何方式公开了,那么修改后的源码也必须公开;
  • 因为 “ 自由 ” 不是 “ 免费啤酒里的免费 ”,GPL 还是允许开发者对他们的软件收费的;
  • 不过,一旦有人支付了某个使用 GPL 的软件的费用,他们就可以继续分发这个软件,无论是否继续收费;
  • 基于 GPL 的软件的所有拷贝都必须带有恰当的版权声明,以表明作者的权利。这样的程序的每一份拷贝都必须带有 GPL,以确保每个人知道他们的权利;
  • 采用与 GPL 兼容的许可的代码,可以作为采用 GPL 的较大的程序的一部分。如果一个程序中某个功能代码是基于不兼容的许可的,就不认为整体仍然是完全自由的。

但是,这些对于普通开发者而言的意义是什么呢?好吧,一个想要把自己的程序公开给更多人使用的开发者必须考虑他们包含在程序中的原创或修改的代码的许可状态,然后以恰当的许可来发布,以满足所有已有的条款。简而言之,明智的做 法是阅读和代码(或可能的替代代码)相关的任何许可条款, 以确保发布出去的程 序不会违反这些许可的条件。

GNU 操作系统主页详细讨论了 GPL(以及其他自由许可),实际上你可以给自己下载一份完整的拷贝,从而充分理解对于开发者这些究竟意味着什么:http://www.gnu.org/licences/gpl.html

22.4 开发工具和资源

22.4.1 虚拟机

如果你没有运行 Linux 的机器,又希望做 Linux 开发,有一个选择是使用虚拟机 (VM)。虚拟机是操作系统的一种软件实现,在目标机器上已有的主操作系统内仿真运行时,它具有足够的性能和内存。

有许多可用的 VM,各自有不同的价位、提供不同的功能,适合各种人群,从偶尔使用的到企业用的更高级的解决方案的都有。表 22.1 列出了一些虚拟机及他们的优缺点。主要是用虚拟机来给 Linux 做应用开发的人可能可以找到免费的版本,甚至有的具有超过他们所需的能力。不过,有的人希望在商业环境下部署基于 Linux的虚拟机,那么就可能需要寻找付费的版本了。

表 22.1: 虚拟机的比较

22.4.2 版本控制

由于 Linux 上这种协作开发的本性,用上某种形式的版本控制是很有必要的。考虑一个假想的场景,从中可以看出版本控制的需求。假设你已经投入了几个钟头来写一个运行在 Zynq 开发平台上的很壮观的应用。你已经对 FPGA 做了编程,把应用下载到了处理器,它运行了,而且所有的功能都如预期!迈着轻快的步伐,你到茶水间做了一杯庆贺的咖啡,吃了块蛋糕。在煮咖啡的时候,你和一个同事谈到了你的成功,他有一个想法,可以改善这个系统的功能。出于信任,你把全部的代码交给了他去实现这个改进。过了一会儿你回到这个项目,不出意料,它不工作了,那个 “ 乐于助人 ” 的同事也找不到了,而你的代码已经一团糟了!唯一的可能,就是试图回忆起你之前有过什么,然后花费更多的时间来纠正错误。

用上某种形式的版本控制正是可以防止出现这种灾难的办法。有三种你可以用的主要类型的版本控制系统。第一种是直接以固定的周期把你所有的工作做一个本地备份。这样做很容易受到人为错失的影响,当很多目录里有很多不同的同事做的很多文件,这些文件还有很多版本的时候,整个事情就会变成一团乱麻。通过一个变动数据库能有助于这个问题,但是我们还有更优雅的解决方案。

集中式的版本控制系统 (Centralised Version Control Systems,CVCS)用单个服务器来存放所有文件的各个版本。每个用户可以登录进这个服务器,然后取出 (check-out)文件做一个本地拷贝来做编辑。当他们完成的时候,可以把编辑的结果提交上去,服务器会保持一个记录,标记说哪个用户、在什么时候做出了哪个文件的哪个版本。不过,考虑一个简单的例子,如果这个服务器没有做定期全面备份,然后硬件坏了,那么整个项目就丢了,无法修复。分布式版本控制系统(Distributed Version Control System,DVCS)减轻了这个危害,它不是取出单 个文件,而是让每个用户建立服务器上整个仓库的镜像,这样一旦有地方坏了,整个仓库还是能恢复的 [7]。DVCS 里用的元数据还能实现诸如合并这样的操作。DVCS也能用在协作的项目中,这种项目里,不止一个开发者会做出定期的改进。如果你想用上同事最新的进展,把它合并进自己做的那部分里,就只要从服务器取得最新的版本然后继续工作就可以了。

22.4.3 Git

Git 就是这样一个 DCVS,最初是 Linus Torvalds 为了管理 Linux 的内核开发而设计的。2005 年,当时一个有版权的版本控制系统 (Version Control System, VCS)停止免费使用之后,它作为它的一个免费替代品而发布了出来。

Git 的部署和 DVCS 是类似的,主要有一个不同。DVCS 把项目 “ 看作 ” 是原始文件的一个集合,然后随着时间的推移追踪对这些文件的修改。但是 Git 在每次提交的时候对所有的文件拍一个 “ 快照 ”,然后保存下来,需要的时候可以取出。为避免冗余,未修改的文件不会再保存一遍,而是用一个链接链回之前保存过的文件。图 22.2 形象地表达了这个意思,这里的每个版本表达的是那次这个项目的一个快照。

图 22.2: Git 版本历史的样例

任何一个文件可以存在于三种主要的状态之一:已提交(committed)、已修改 (modified)和被跟踪 (staged)。文件首先是在当前工作目录中被修改了,然后被跟踪了,标记到放到下一次提交到仓库去的快照中。图 22.3 画出了事件的这个流程。工作目录里是这个项目的某个版本的一次取出,用来做本地修改的。跟踪区域实际上只是在下一次提交要进入仓库的东西的文件索引。仓库是项目的对象数据库和元数据的存储。

Git 操作是在本地发生的,而不是像 CVCS 那样在远端服务器上,这样网络延迟就减少了。所有和版本历史有关的数据在本地就可以获得,而不需要从远端服务器上把旧版本的数据拉过来。这样当仓库无法连接时还可以离线使用,因为提交可以是离线的,然后当有连接的时候再上传就好了。

最后,既然在 Git 里对一个项目的修改一般来说是对数据库的递增过程,很难以无法恢复的方式来修改一个项目。因为这些原因,Git 对于 Linux 开发是首选的方法 [8]。

图 22.3: Git 的操作流程

22.4.4 Linux 下的调试

在开发的某个迭代环节上的代码很可能带有错误,所有应用开发都适用这条论断,Linux 也不例外。尽管我们努力试图做出完美的、合乎逻辑的代码,往往某些参数还是会返回意料之外的结果、子程序可能接收到了不正确的参数,或是由于某个错误发生了更奇怪的事情。在 Linux 上,直接就有些工具可以识别出错误的种类和位置。

和内存分配有关的问题是导致程序崩溃的常见原因,这些问题包括内存泄露, 就是内存没能以正确的函数调用来释放;或缓冲区溢出,就是在分配的内存以外做了写操作。内存调试工具的例子包括 MEMWATCH 和 “ 另一个 malloc 调试器 (YetAnother Malloc Debugger,YAMD)”[9]。

通常,用户空间的程序可能触发导致异常行为的系统调用。用来调试这样的错误的工具是 strace,它从内核直接监控给某个特定调用的所有参数,和对应的返回值,来识别出某个调用是否失败了。如果返回值与所给的参数对不上,就可以推断被调用的这个函数出问题了 [9]。

还有用来调试 Linux 内核本身存在的错误的工具。GNU 调试器(gdb)是一个用户空间的程序,有命令行工具也有 GUI,目的是搜寻用户空间程序的错误;也可以用在内核上,通过 gdb (kgdb)协议来做远端主机 Linux 内核的调试器。还有一些工具用来查看内核代码,比如 Oops[9]。表 22.2 给出了一些可用的调试工具的具体情况。

表 22.2: Linux 调试工具

当然还有很多其他的调试工具来刨根问底找到程序中的错误,上面给出的建议仅仅只是对于你可能遇到的错误类型和可以使用的调试功能的介绍。

22.5 本章回顾

本章给出了通用 Linux 架构的概述,也讨论了与 Linux 开发有关的一些问题,包括许可和开发工具。这样接下去的章节就可以逐个集中讨论内核中的关键部分。第 23 章会深入挖掘 Linux 内核,包括文件系统和驱动。随后,我们会讨论 Linux 启动过程。

22.6 参考文献

注意:所有的 URL 最后被检查过是在 2014 年的 6 月。

[1] GNU Operating System, “Overview of the GNU System”, 网页位于 : http://www.gnu.org/gnu/gnu-history.html

[2] IDC white paper, “The Opportunity for Linux in a New Economy”, April 2009位于 : http://www.linuxfoundation.org/sites/main/files/publications/Linux_in_New_Economy.pdf

[3] L. Wirzenius, J. Oja, S. Stafford and A. Weeks, “Overview of a Linux System — Important Parts of the Kernel” in The Linux System Administrators Guide, v0.9位于 : http://www.tldp.org/LDP/sag/html/overview.html

[4] GNU Operating System, “Various GNU licences and Comments about Them”, 网页位于 : http://www.gnu.org/licences/licence-list.html#Softwarelicences

[5] GNU Operating System, “What is Copyleft?”, 网页位于 : https://www.gnu.org/copyleft/

[6] GNU Operating System, “Frequently Asked Questions about the GNU licences”, 网页位于 : http://www.gnu.org/licences/gpl-faq.html

[7] Scott Chacon, “Getting Started — About Version Control” in Pro Git,位于 : http://git-scm.com/book/en/Getting-Started-About-Version-Control

[8] Scott Chacon, “Getting Started — Git Basics” in Pro Git,位于 : http://git-scm.com/book/en/Getting-Started-Git-Basics

[9] IBM Developer Works, “Debugging Tools and Techniques for Linux on Power”, 02 October 2013位于 : http://www.ibm.com/developerworks/systems/library/es-debug/index.html?ca=drs

第三十五篇到此结束,下一篇将带来第三十六篇,开启第二十三章,Linux 内核等相关内容。欢迎各位大侠一起交流学习,共同进步。

END

后续会持续更新,带来Vivado、 ISE、Quartus II 、candence等安装相关设计教程,学习资源、项目资源、好文推荐等,希望大侠持续关注。

大侠们,江湖偌大,继续闯荡,愿一切安好,有缘再见!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-05-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 FPGA技术江湖 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
命令行工具
腾讯云命令行工具 TCCLI 是管理腾讯云资源的统一工具。使用腾讯云命令行工具,您可以快速调用腾讯云 API 来管理您的腾讯云资源。此外,您还可以基于腾讯云的命令行工具来做自动化和脚本处理,以更多样的方式进行组合和重用。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档