当前位置:首页 > 内核
  • Linux 内核 vs Windows 内核

    Windows 和 Linux 可以说是我们比较常见的两款操作系统的。 Windows 基本占领了电脑时代的市场,商业上取得了很大成功,但是它并不开源,所以要想接触源码得加入 Windows 的开发团队中。 对于服务器使用的操作系统基本上都是 Linux,而且内核源码也是开源的,任何人都可以下载,并增加自己的改动或功能,Linux 最大的魅力在于,全世界有非常多的技术大佬为它贡献代码。 这两个操作系统各有千秋,不分伯仲。 操作系统核心的东西就是内核,这次我们就来看看,Linux 内核和 Windows 内核有什么区别? 内核 什么是内核呢? 计算机是由各种外部硬件设备组成的,比如内存、cpu、硬盘等,如果每个应用都要和这些硬件设备对接通信协议,那这样太累了。 所以,这个中间人就由内核来负责,让内核作为应用连接硬件设备的桥梁,应用程序只需关心与内核交互,不用关心硬件的细节。 内核 内核有哪些能力呢? 现代操作系统,内核一般会提供 4 个基本能力: 管理进程、线程,决定哪个进程、线程使用 CPU,也就是进程调度的能力; 管理内存,决定内存的分配和回收,也就是内存管理的能力; 管理硬件设备,为进程与硬件设备之间提供通信能力,也就是硬件通信能力; 提供系统调用,如果应用程序要运行更高权限运行的服务,那么就需要有系统调用,它是用户程序与操作系统之间的接口。 内核是怎么工作的? 内核具有很高的权限,可以控制 cpu、内存、硬盘等硬件,而应用程序具有的权限很小,因此大多数操作系统,把内存分成了两个区域: 内核空间,这个内存空间只有内核程序可以访问; 用户空间,这个内存空间专门给应用程序使用; 用户空间的代码只能访问一个局部的内存空间,而内核空间的代码可以访问所有内存空间。 因此,当程序使用用户空间时,我们常说该程序在用户态执行,而当程序使内核空间时,程序则在内核态执行。 应用程序如果需要进入内核空间,就需要通过「系统调用」,下面来看看系统调用的过程: 内核程序执行在内核态,用户程序执行在用户态。当应用程序使用系统调用时,会产生一个中断。发生中断后, CPU 会中断当前在执行的用户程序,转而跳转到中断处理程序,也就是开始执行内核程序。内核处理完后,主动触发中断,把 CPU 执行权限交回给用户程序,回到用户态继续工作。 Linux 的设计 Linux 的开山始祖是来自一位名叫 Linus Torvalds 的芬兰小伙子,他在 1991 年用 C 语言写出了第一版的 Linux 操作系统,那年他 22 岁。 完成第一版 Linux 后,Linux Torvalds 就在网络上发布了 Linux 内核的源代码,每个人都可以免费下载和使用。 Linux 内核设计的理念主要有这几个点: MutiTask,多任务 SMP,对称多处理 ELF,可执行文件链接格式 Monolithic Kernel,宏内核 MutiTask MutiTask 的意思是多任务,代表着 Linux 是一个多任务的操作系统。 多任务意味着可以有多个任务同时执行,这里的「同时」可以是并发或并行: 对于单核 CPU 时,可以让每个任务执行一小段时间,时间到就切换另外一个任务,从宏观角度看,一段时间内执行了多个任务,这被称为并发。 对于多核 CPU 时,多个任务可以同时被不同核心的 CPU 同时执行,这被称为并行。 SMP SMP 的意思是对称多处理,代表着每个 CPU 的地位是相等的,对资源的使用权限也是相同的,多个 CPU 共享同一个内存,每个 CPU 都可以访问完整的内存和硬件资源。 这个特点决定了 Linux 操作系统不会有某个 CPU 单独服务应用程序或内核程序,而是每个程序都可以被分配到任意一个 CPU 上被执行。 ELF ELF 的意思是可执行文件链接格式,它是 Linux 操作系统中可执行文件的存储格式,你可以从下图看到它的结构: ELF 文件格式 ELF 把文件分成了一个个分段,每一个段都有自己的作用,具体每个段的作用这里我就不详细说明了,感兴趣的同学可以去看《程序员的自我修养——链接、装载和库》这本书。 另外,ELF 文件有两种索引,Program header table 中记录了「运行时」所需的段,而 Section header table 记录了二进制文件中各个「段的首地址」。 那 ELF 文件怎么生成的呢? 我们编写的代码,首先通过「编译器」编译成汇编代码,接着通过「汇编器」变成目标代码,也就是目标文件,最后通过「链接器」把多个目标文件以及调用的各种函数库链接起来,形成一个可执行文件,也就是 ELF 文件。 那 ELF 文件是怎么被执行的呢? 执行 ELF 文件的时候,会通过「装载器」把 ELF 文件装载到内存里,CPU 读取内存中的指令和数据,于是程序就被执行起来了。 Monolithic Kernel Monolithic Kernel 的意思是宏内核,Linux 内核架构就是宏内核,意味着 Linux 的内核是一个完整的可执行程序,且拥有最高的权限。 宏内核的特征是系统内核的所有模块,比如进程调度、内存管理、文件系统、设备驱动等,都运行在内核态。 不过,Linux 也实现了动态加载内核模块的功能,例如大部分设备驱动是以可加载模块的形式存在的,与内核其他模块解藕,让驱动开发和驱动加载更为方便、灵活。 分别为宏内核、微内核、混合内核的操作系统结构 与宏内核相反的是微内核,微内核架构的内核只保留最基本的能力,比如进程调度、虚拟机内存、中断等,把一些应用放到了用户空间,比如驱动程序、文件系统等。这样服务与服务之间是隔离的,单个服务出现故障或者完全攻击,也不会导致整个操作系统挂掉,提高了操作系统的稳定性和可靠性。 微内核内核功能少,可移植性高,相比宏内核有一点不好的地方在于,由于驱动程序不在内核中,而且驱动程序一般会频繁调用底层能力的,于是驱动和硬件设备交互就需要频繁切换到内核态,这样会带来性能损耗。华为的鸿蒙操作系统的内核架构就是微内核。 还有一种内核叫混合类型内核,它的架构有点像微内核,内核里面会有一个最小版本的内核,然后其他模块会在这个基础上搭建,然后实现的时候会跟宏内核类似,也就是把整个内核做成一个完整的程序,大部分服务都在内核中,这就像是宏内核的方式包裹着一个微内核。 Windows 设计 当今 Windows 7、Windows 10 使用的内核叫 Windows NT,NT 全称叫 New Technology。 下图是 Windows NT 的结构图片: Windows NT 的结构 Windows 和 Linux 一样,同样支持 MutiTask 和 SMP,但不同的是,Windows 的内核设计是混合型内核,在上图你可以看到内核中有一个 MicroKernel 模块,这个就是最小版本的内核,而整个内核实现是一个完整的程序,含有非常多模块。 Windows 的可执行文件的格式与 Linux 也不同,所以这两个系统的可执行文件是不可以在对方上运行的。 Windows 的可执行文件格式叫 PE,称为可移植执行文件,扩展名通常是.exe、.dll、.sys等。 PE 的结构你可以从下图中看到,它与 ELF 结构有一点相似。 PE 文件结构 总结 对于内核的架构一般有这三种类型: 宏内核,包含多个模块,整个内核像一个完整的程序; 微内核,有一个最小版本的内核,一些模块和服务则由用户态管理; 混合内核,是宏内核和微内核的结合体,内核中抽象出了微内核的概念,也就是内核中会有一个小型的内核,其他模块就在这个基础上搭建,整个内核是个完整的程序; Linux 的内核设计是采用了宏内核,Windows 的内核设计则是采用了混合内核。 这两个操作系统的可执行文件格式也不一样, Linux 可执行文件格式叫作 ELF,Windows 可执行文件格式叫作 PE。 免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

    时间:2021-02-24 关键词: Linux 内核 Windows

  • Linux内核维护者真相与误解!

    自 2020 年 1 月发布 5.5 内核之后,到现在已经有近 87,000 个 patch,来自于近 4600 名开发者,都被合并到 mainline 仓库中了。review 所有这些 patch 的工作,对于愿意花时间的内核开发者来说也都是一项艰巨的任务,所以是否要接受合并 patch,这个决定权就被委托给了各个子系统的维护者(maintainer)来代理决定,他们每个人都对内核中这一部分的改动具有部分或者完整的决定权。这些维护者们就被记录在一个叫 MAINTAINERS 的文件中(当然是这个名字)。但是,MAINTAINERS 文件也需要维护,它能很好地反映现实情况吗? MAINTAINERS 文件的存在目的,并不仅仅是为了让大家给维护者点赞。开发者们需要用它来确定该把 patch 发到哪里。get_maintainer.pl 脚本通过查看这个 patch 修改了的文件,就可以生成一系列邮件地址来发送 patch,从而让这一过程变得更加自动化。如果这个文件中有错误信息的话,就可能会让 patch 发送到错误的地方去,所以我们需要这个文件能保持更新。最近,编者收到 Jakub Kicinski 的建议,他认为可以比较 一下 MAINTAINERS 中的各个条目和现实世界中的工作的吻合程度,应该能得到一些线索。于是折腾了一会儿 Python 之后,我们就得到了一个新的分析脚本。 Digging into MAINTAINERS 统计下来,MAINTAINERS 文件中已经列出了 2280 个 "subsystems (子系统)"。每一个子系统都包括一个它所涵盖的文件和目录列表。我们可以查看这些文件的 commit 信息来这个子系统中都有谁在进行工作。撰写 patch 显然属于工作内容之一,但其他活动也得算,比如处理 patch (可以从 Signed-off-by tag 来得到这个信息) 或 review patch (根据 Reviewed-by 或 Acked-by)。我们牺牲了一些 CPU 挖矿的时间,得到了一个大概统计值,也就是各个子系统中明确列出的维护者最后一次在该子系统中实际做了有效工作的时间是什么时候。 对于那些想看细节的人来说,可以直接看这个完整结果(https://lwn.net/Articles/842419/)。 不过,我们可以缩小数据范围,在这个文件中挑选出一些我们更感兴趣的内容。例如,有 367 个子系统在整个 Git 历史中都没有维护者,或维护者从未出现过(没有包括那些没有文件的 "子系统"–见下文)。在这些子系统中,很多已经过了它本身的黄金时期,比如现在 3c59x 网卡维护者根本没有多少工作可做。网络开发人员也不会收到很多 ATM 的 patch 了,Palm Treo 也不需要有多少支持工作了,苹果最近也很少发布基于 M68k 的系统了,Arm 软驱(floppy drive)也没有多少人还在使用了,S3 Savage 显卡也不再是以前人们所必备的设备了。这几百项中,很多可能都代表着可以完全删除的代码。 类似的结论也可以从另一个列表中得到 (https://lwn.net/Articles/842424/),那个列表中都是没有列出维护者的子系统。当然,其中一些子系统本身也不太对头,有一个子系统简单地命名为 "ABI/API",指向了 linux-api 邮件列表。实际上有一个文件是与这个 "子系统 " 相关的,kernel/sys_ni.c,这个文件会对那些未实现的系统调用进行处理。因此,这个条目的存在价值,是为了让开发者在添加新的系统调用时会抄送 linux-api 邮件列表。"Arm subarchitectures " 条目也是类似情况。 一些无维护者的子系统,比如 framebuffer 层,可能后续会有人愿意接手从而复活。reiserfs 文件系统缺乏维护者,但似乎仍有一些用户。其他的子系统,比如 DECnet 或 Matrox framebuffer,可能最好的处理就是不去管它了(或干脆删除掉)。 MAINTAINERS 文件中列出的一些 "子系统" 没有任何文件需要修改。一个有趣的例子是 "embedded Linux",据说由 Paul Gortmaker、Matt Mackall 和 David Woodhouse 维护。鉴于嵌入式 Linux 的成功,我们都认为他们的工作非常出色。"device number registry" 声称是有维护的,但这里只包含一个链接,指向一个不存在的网页。"disk geometry and partition handling" 这一条中的 URL 仍然有效,但这些网页似乎已经有十多年没有更新了,可以看出最近 Zip 驱动器的 geometry 并没有什么进展。man page 这些手册页面倒是有积极维护的,但它们不在内核代码树中。 Help needed 从目前的结果可以得出几个结论。一个是很多内核子系统现在并不是真的需要有人来维护,相反,其中一些可能需要被删除掉。另一个结论是,也许 MAINTAINERS 文件本身需要清理一下。但还有一个有价值的问题,那就是从这些数据是否可以看出是否有一些子系统从新的维护者中获益匪浅的呢?为了回答这个问题,我们又花费了一些本来可以用来挖矿的 CPU 时间,来寻找符合这些标准的子系统。 没有列出维护者,或者所谓的维护者已经在该子系统中至少 6 个月没有活动了。 自 2020 年 1 月发布 5.5 内核以来,至少有 50 个提交跟这个子系统有关。 这个搜索的目的是找出那些仍在进行某种活跃开发,但没有活跃的、明确指定的子系统。搜索结果可以分为几类。 有些 MAINTAINERS 的条目中包含了大量的文件,使得 commit 数量看起来比真实情况要多了不少。例如,名为 "ASYNCHRONOUS TRANSFERS/TRANSFORMS (IOAT) API "的子系统跟 drivers/dma 下的所有文件都有关,"DMA GENERIC OFFLOAD ENGINE SUBSYSTEM" 也包含这些文件。该子系统则由 Vinod Koul 积极维护。有两个子系统属于这一类,在下面的表格中,"Activity" 列表示维护者最后一次我们看到他的活动时间(如果有的话),而 "Commits" 则显示了自 5.5 以来影响到这个子系统的 commit 次数。 Subsystem Activity Commits ASYNCHRONOUS TRANSFERS/TRANSFORMS (IOAT) API —— 536 HISILICON NETWORK SUBSYSTEM DRIVER 2019-11-16 258 这些子系统或者不是一个单独的实体(entity),或者应该减少其覆盖的文件清单,要以符合现实情况。 还有一些子系统的维护者使用的是公司电子邮件别名。比如 "DIALOG SEMICONDUCTOR DRIVERS" 的维护者是 support.opensource@diasemi.com,这个地址显然不会出现在任何实际的 patch commit 中。不过在该子系统内看进去的话,可以看到许多来自 diasemi.com 邮件地址的许多 review,所以该子系统不能说是真的没人维护。这个类别包含: Subsystem Activity Commits DIALOG SEMICONDUCTOR DRIVERS —— 120 QUALCOMM ATHEROS ATH9K WIRELESS DRIVER —— 65 WOLFSON MICROELECTRONICS DRIVERS —— 146 与之相关的是有些子系统的维护者信息是过时的,指定的维护者并不活跃,但往往是来自同一公司的其他人接替了他的工作,并承担事实上的维护工作。这些包括: Subsystem Activity Commits HISILICON NETWORK SUBSYSTEM 3 DRIVER (HNS3) 2019-11-16 234 HISILICON SECURITY ENGINE V2 DRIVER (SEC2) 2020-06-18 55 LINUX FOR POWER MACINTOSH 2018-10-19 71 MELLANOX ETHERNET INNOVA DRIVERS —— 93 MELLANOX MLX4 IB driver —— 70 OMAP HWMOD DATA 2016-06-10 102 QCOM AUDIO (ASoC) DRIVERS 2018-05-21 125 TEGRA I2C DRIVER 2018-05-30 56 最后,还有一些子系统似乎真的缺少维护者,它们通常的 commit 是由其他的子系统维护者来合并,或者是通过少数几个终极维护者来最终合入的。它们是: Subsystem Activity Commits ARM/UNIPHIER ARCHITECTURE —— 73 DRBD DRIVER 2018-12-20 51 FRAMEBUFFER LAYER —— 402 HMM - Heterogeneous Memory Management 2020-05-19 54 I2C SUBSYSTEM HOST DRIVERS —— 434 MARVELL MVNETA ETHERNET DRIVER 2018-11-23 65 MEDIA DRIVERS FOR RENESAS - VIN 2019-10-10 56 MUSB MULTIPOINT HIGH SPEED DUAL-ROLE CONTROLLER 2020-06-24 54 NFC SUBSYSTEM —— 72 PROC FILESYSTEM —— 171 PROC SYSCTL 2020-06-08 51 QLOGIC QLGE 10Gb ETHERNET DRIVER 2019-10-04 77 STAGING - REALTEK RTL8188EU DRIVERS 2020-07-15 121 STMMAC ETHERNET DRIVER 2020-05-01 174 UNIVERSAL FLASH STORAGE HOST CONTROLLER DRIVER —— 277 USB NETWORKING DRIVERS —— 119 X86 PLATFORM DRIVERS - ARCH —— 119 对于一直关注相关领域的人来说,上面的列表并不出乎预料。frameebuffer 子系统是一个已知有问题的领域,由于缺乏维护,"soft scrollback" 功能最近就被从 framebuffer 驱动中移除了。不少人仍然需要使用这段代码,但它越来越难以与内核的图形驱动集成起来使用,很少有人有兴趣去深入研究它。 事实上,I2C host driver 确实有一个事实上的维护者,它就是 Wolfram Sang,他也维护着 core I2C 子系统。他一直希望有人能帮助他维护这些驱动程序,但似乎没有人愿意帮助他,所以他在有时间的时候就也负责维护这些驱动程序。/proc 是一个有趣的例子,每个人都依赖它,但没有人负责维护它。HMM 也很有趣,创建者当初花了很多精力来把 HMM 功能合入 mainline,但现在似乎转向去忙其他事情了。 以上这些地方,看起来都是有抱负的内核开发者可以参与进来提供帮助的地方。 那么那些在 MAINTAINERS 文件中没有记录的子系统呢?如果我们用快速脚本来查找一下内核树中所有的未被 MAINTAINERS 文件包含的文件,我们得到的文件列表包含超过 2800 个文件。其中自然包括 MAINTAINERS 文件本身。其余的绝大多数都是 include/下的头文件,其中大部分可能都有维护者,应该添加到 MAINTAINER 文件中相应的条目下。不过令人沮丧的是,在 kernel/目录下有 72 个文件没有列出维护者。这当然不是现实情况。SYSV IPC 代码是没有维护者的,这反映了它普遍不受欢迎。其余大部分未维护的文件都在 tools/ 或 samples/ 目录下。 比较难找出来的是 MAINTAINERS 中号称会包含的文件中,其实有一些并不是由指定的人维护的。这种情况经常出现在那些指定包含整个目录树的条目中。例如,编者被列为需要处理 Documentation/目录,但肯定不能说我真的是在 "维护" 这么多文件。类似的情况在内核树中很多地方都有。 如果有人希望从这些数据中得出一些整体性的结论,那么可能会是这些:MAINTAINERS 文件肯定有一些黑暗的角落,这些角落本身也可能需要一些维护(其中一些已经在做了)。内核中一些缺乏维护者的部分,仍然是可以使用的,而另一些则已经过于古老都不需要维护了。不过,大多数情况下,内核中的子系统都有指定的维护者,而且他们中的大多数人至少都在努力维护他们负责的代码。The situation could be a lot worse。 [和往常一样,生成上述表格的脚本可以在 gitdm 仓库中找到,网址是 git://git.lwn.net/gitdm.git] 。

    时间:2021-02-02 关键词: Linux 内核

  • 浅谈Linux内核电源管理

    浅谈Linux内核电源管理

    Linux广泛应用于娱乐电子领域,节能是电子消费品的重要课题。   Linux电源管理非常复杂,牵扯到系统级的待机、频率电压变换、系统空闲时的处理以及每个设备驱动对于系统待机的支持和每个设备的运行时电源管理,可以说和系统中的每个设备驱动都息息相关。   对于消费电子产品来说,电源管理相当重要。因此,这部分工作往往在开发周期中占据相当大的比重,图1呈现了Linux内核电源管理的整体架构。大体可以归纳为如下几类:   1.CPU在运行时根据系统负载进行动态电压和频率变换的CPUFreq。   2.CPU在系统空闲时根据空闲的情况进行低功耗模式的CPUIdle。   3.多核系统下CPU的热插拔支持。   4.系统和设备对于延迟的特别需求而提出申请的PMQoS,它会作用于CPUIdle的具体策略。   5.设备驱动针对系统SuspendtoRAM/Disk的一系列入口函数。   6.SoC进入suspend状态、SDRAM自刷新的入口。   7.设备的runtime(运行时)动态电源管理,根据使用情况动态开关设备。   8.底层的时钟、稳压器、频率/电压表(OPP模块完成)支撑,各驱动子系统都可能用到。 负责人:CC

    时间:2020-10-14 关键词: 电源 Linux 内核

  • 国产 Linux 优麒麟 20.10 内测版本发布:内核升至 Linux 5.8,新增多款麒麟应用

    国产 Linux 优麒麟 20.10 内测版本发布:内核升至 Linux 5.8,新增多款麒麟应用

    10月13日,两家公司正式宣布20.10版(“GroovyGorilla”)已经进入最后阶段。 内核 内核升级至 Linux 5.8 内核并发处理器 (KCSAN) 内核事件通知机制支持块层内联加密私有 procfs 挂载 BPF iterator 机制 基础库 gcc 升级至 10.2.0 qt 升级至 5.14.2 python 升级至 3.8.6 桌面环境 任务栏全新改版 侧边栏全新改版 新增麒麟扫描应用 新增麒麟刻录应用 新增麒麟截图应用 新增麒麟安装器应用 系统所有组件均支持主题切换 系统新增触屏手势功能 镜像下载 https://www.ubuntukylin.com/downloads/download.php?id=76MD5:4907d44c5fc01660f036ac09ca7539b2 活动时间 2020.10.13 00:00——2020.10.18 23:59 IT之家提醒:当前内测版还有许多不完善的地方,主要提供给具有极客精神的资深用户用于问题反馈和测试,正式版将于 10 月 22 日发布,敬请期待! (重要已知问题:一旦安装,第一次启动的随机启动时间将更长。

    时间:2020-10-13 关键词: 优麒麟 Linux 内核

  • iOS14存在内核漏洞

    iOS14存在内核漏洞

    iOS14发布了一段时间了。 除了一些错误外,我并不感到不适。 但是,开发人员在iOS14中发现了一个内核漏洞。 此漏洞可用于某些非法目的,包括越狱的iPhone! 其实,早在iOS14测试版发布不久,就有安全团队发现了其漏洞,在9月末就发布了iOS14的越狱工具Checkra1n,但这个工具存在一定的局限性,最高只支持到iPhone X,而且只有mac版,且前期十分不稳定。 但是没过多久,另外一个团队ABC Research又发现了一个漏洞,而且还用了最新的iPhoneSE2演示了越狱的过程,由于新iPhone SE搭载的是A13处理器,理论上来说,该漏洞也能够适用于同样搭载A13处理器的iPhone 11系列机型。 面对这些漏洞,苹果很快就发布了iOS14.01,对漏洞进行修补,但是尴尬的是,还没发布几天,就有黑客说发现了新的漏洞,宣称获取了root权限。 从他分享图来看,图中的版本号为:18A393,也就是iOS 14.0.1系统版本,这足以确定iOS 14.0.1依然存在可越狱漏洞。 这些漏洞对于用户来说存在一定的安全风险,好在这些发现漏洞的开发者并没有公开这些漏洞的代码,甚至有开发者表示等苹果修复后再公开代码。

    时间:2020-10-13 关键词: 漏洞 ios14 内核

  • 如何学习Linux内核

    如何学习Linux内核

    Linux可以说有人想学Linux内核,那是什么呢? Linux内核是一个操作系统(OS)内核,本质上定义为类Unix。它用于不同的操作系统,主要是以不同的Linux发行版的形式。Linux内核是第一个真正完整且突出的免费和开源软件示例。Linux内核是第一个真正完整且突出的免费和开源软件示例,促使其广泛采用并得到了数千名开发人员的贡献。 Linux内核由芬兰赫尔辛基大学的学生LinusTorvalds于1991年创建。随着程序员调整其他自由软件项目的源代码以扩展内核的功能,它迅速取得了进展。Torvalds首先使用80386汇编语言编写的任务切换器以及终端驱动程序,然后将其发布到comp.os.minixUsenet组。它很快被MINIX社区所改编,为该项目提供了见解和代码。 Linux内核越来越受欢迎,因为GNU自己的内核GNUHurd不可用且不完整,而BerkeleySoftwareDistribuTIon(BSD)操作系统仍然受到法律问题的困扰。在开发人员社区的帮助下,Linux0.01于1991年9月17日发布。 linux内核学习路线 很多同学接触Linux不多,对Linux平台的开发更是一无所知。而现在的趋势越来越表明,作为一个优秀的软件开发人员,或计算机IT行业从业人员,掌握Linux是一种很重要的谋生资源与手段。下来我将会结合自己的几年的个人开发经验,及对Linux,更是类UNIX系统,及开源软件文化,谈谈Linux的学习方法与学习中应该注意的一些事。 就如同刚才说的,很多同学以前可能连Linux是什么都不知道,对UNIX更是一无所知。所以我们从最基础的讲起,对于Linux及UNIX的历史我们不做多谈,直接进入入门的学习。 Linux入门是很简单的,问题是你是否有耐心,是否爱折腾,是否不排斥重装一类的大修。没折腾可以说是学不好Linux的,鸟哥说过,要真正了解Linux的分区机制,对LVM使用相当熟练,没有20次以上的Linux装机经验是积累不起来的,所以一定不要怕折腾。 由于大家之前都使用Windows,所以我也尽可能照顾这些“菜鸟”。我的推荐,如果你第一次接触Linux,那么首先在虚拟机中尝试它。虚拟机我推荐VirtualBox,我并不主张使用VM,原因是VM是闭源的,并且是收费的,我不希望推动盗版。当然如果你的Money足够多,可以尝试VM,但我要说的是即使是VM,不一定就一定好。付费的软件不一定好。首先,VirtualBox很小巧,Windows平台下安装包在80MB左右,而VM动辄600MB,虽然功能强大,但资源消耗也多,何况你的需求VirtualBox完全能够满足。所以,还是自己选。如何使用虚拟机,是你的事,这个我不教你,因为很简单,不会的话Google或Baidu都可以,英文好的可以直接看官方文档。 现在介绍Linux发行版的知识。正如你所见,Linux发行版并非Linux,Linux仅是指操作系统的内核,作为科班出生的你不要让我解释,我也没时间。我推荐的发行版如下: UBUNTU适合纯菜鸟,追求稳定的官方支持,对系统稳定性要求较弱,喜欢最新应用,相对来说不太喜欢折腾的开发者。 Debian,相对UBUNTU难很多的发行版,突出特点是稳定与容易使用的包管理系统,缺点是企业支持不足,为社区开发驱动。 Arch,追逐时尚的开发者的首选,优点是包更新相当快,无缝升级,一次安装基本可以一直运作下去,没有如UBUNTU那样的版本概念,说的专业点叫滚动升级,保持你的系统一定是最新的。缺点显然易见,不稳定。同时安装配置相对Debian再麻烦点。 Gentoo,相对Arch再难点,考验使用者的综合水平,从系统安装到微调,内核编译都亲历亲为,是高手及黑客显示自己技术手段,按需配置符合自己要求的系统的首选。 Slackware与Gentoo类似。 CentOS,社区维护的RedHat的复刻版本,完全使用RedHat的源码重新编译生成,与RedHat的兼容性在理论上来说是最好的。如果你专注于Linux服务器,如网络管理,架站,那么CentOS是你的选择。 LFS,终极黑客显摆工具,完全从源代码安装,编译系统。安装前你得到的只有一份文档,你要做的就是照文档你的说明,一步步,一条条命令,一个个软件包的去构建你的Linux,完全由你自己控制,想要什么就是什么。如果你做出了LFS,证明你的Linux功底已经相当不错,如果你能拿LFS文档活学活用,再将Linux从源代码开始移植到嵌入式系统,我敢说中国的企业你可以混的很好。 你得挑一个适合你的系统,然后在虚拟机安装它,开始使用它。如果你想快速学会Linux,我有一个建议就是忘记图形界面,不要想图形界面能不能提供你问题的答案,而是满世界的去找,去问,如何用命令行解决你的问题。在这个过程中,你最好能将Linux的命令掌握的不错,起码常用的命令得知道,同时建立了自己的知识库,里面是你积累的各项知识。 再下个阶段,你需要学习的是Linux平台的C++/C++开发,同时还有Bash脚本编程,如果你对Java兴趣很深还有Java。同样,建议你抛弃掉图形界面的IDE,从VIM开始,为什么是VIM,而不是Emacs,我无意挑起编辑器大战,但我觉得VIM适合初学者,适合手比较笨,脑袋比较慢的开发者。Emacs的键位太多,太复杂,我很畏惧。然后是GCC,Make,Eclipse(Java,C++或者)。虽然将C++列在了Eclipse中,但我并不推荐用IDE开发C++,因为这不是Linux的文化,容易让你忽略一些你应该注意的问题。IDE让你变懒,懒得跟猪一样。如果你对程序调试,测试工作很感兴趣,GDB也得学的很好,如果不是GDB也是必修课。这是开发的第一步,注意我并没有提过一句Linux系统API的内容,这个阶段也不要关心这个。你要做的就是积累经验,在Linux平台的开发经验。我推荐的书如下:C语言程序设计,谭浩强的也可以。C语言,白皮书当然更好。C++推荐C++PrimerPlus,Java我不喜欢,就不推荐了。工具方面推荐VIM的官方手册,GCC中文文档,GDB中文文档,GNU开源软件开发指导(电子书),汇编语言程序设计(让你对库,链接,内嵌汇编,编译器优化选项有初步了解,不必深度)。 如果你这个阶段过不了就不必往下做了,这是底线,最基础的基础,否则离开,不要霍霍Linux开发。不专业的Linux开发者作出的程序是与Linux文化或UNIX文化相背的,程序是走不远的,不可能像Bash,VIM这些神品一样。所以做不好干脆离开。 接下来进入Linux系统编程,不二选择,APUE,UNIX环境高级编程,一遍一遍的看,看10遍都嫌少,如果你可以在大学将这本书翻烂,里面的内容都实践过,有作品,你口头表达能力够强,你可以在面试时说服所有的考官。(可能有点夸张,但APUE绝对是圣经一般的读物,即使是Windows程序员也从其中汲取养分,Google创始人的案头书籍,扎尔伯克的床头读物。) 这本书看完后你会对Linux系统编程有相当的了解,知道Linux与Windows平台间开发的差异在哪?它们的优缺点在哪?我的总结如下:做Windows平台开发,很苦,微软的系统API总在扩容,想使用最新潮,最高效的功能,最适合当前流行系统的功能你必须时刻学习。Linux不是,Linux系统的核心API就100来个,记忆力好完全可以背下来。而且经久不变,为什么不变,因为要同UNIX兼容,符合POSIX标准。所以Linux平台的开发大多是专注于底层的或服务器编程。这是其优点,当然图形是Linux的软肋,但我站在一个开发者的角度,我无所谓,因为命令行我也可以适应,如果有更好的图形界面我就当作恩赐吧。另外,Windows闭源,系统做了什么你更本不知道,永远被微软牵着鼻子跑,想想如果微软说Win8不支持QQ,那腾讯不得哭死。而Linux完全开源,你不喜欢,可以自己改,只要你技术够。另外,Windows虽然使用的人多,但使用场合单一,专注与桌面。而Linux在各个方面都有发展,尤其在云计算,服务器软件,嵌入式领域,企业级应用上有广大前景,而且兼容性一流,由于支持POSIX可以无缝的运行在UNIX系统之上,不管是苹果的Mac还是IBM的AS400系列,都是完全支持的。另外,Linux的开发环境支持也绝对是一流的,不管是C/C++,Java,Bash,Python,PHP,Javascript,。。。。。。就连C#也支持。而微软除VisualStdio套件以外,都不怎么友好,不是吗? 如果你看完APUE的感触有很多,希望验证你的某些想法或经验,推荐UNIX程序设计艺术,世界顶级黑客将同你分享他的看法。 现在是时候做分流了。大体上我分为四个方向:网络,图形,嵌入式,设备驱动。 如果选择网络,再细分,我对其他的不是他熟悉,只说服务器软件编写及高性能的并发程序编写吧。相对来说这是网络编程中技术含量最高的,也是底层的。需要很多的经验,看很多的书,做很多的项目。 我的看法是以下面的顺序来看书: APUE再深读–尤其是进程,线程,IPC,套接字 多核程序设计-Pthread一定得吃透了,你很NB UNIX网络编程–卷一,卷二 TCP/IP网络详解–卷一再看上面两本书时就该看了 5.TCP/IP网络详解–卷二我觉得看到卷二就差不多了,当然卷三看了更好,努力,争取看了 6.Lighttpd源代码-这个服务器也很有名了 7.Nginx源代码–相较于Apache,Nginx的源码较少,如果能看个大致,很NB。看源代码主要是要学习里面的套接字编程及并发控制,想想都激动。如果你有这些本事,可以试着往暴雪投简历,为他们写服务器后台,想一想全球的魔兽都运行在你的服务器软件上。 Linux内核TCP/IP协议栈–深入了解TCP/IP的实现 如果你还喜欢驱动程序设计,可以看看更底层的协议,如链路层的,写什么路由器,网卡,网络设备的驱动及嵌入式系统软件应该也不成问题了。 当然一般的网络公司,就算百度级别的也该毫不犹豫的雇用你。只是看后面这些书需要时间与经验,所以35岁以前办到吧!跳槽到给你未来的地方! 图形方向,我觉得图形方向也是很有前途的,以下几个方面。 Opengl的工业及游戏开发,国外较成熟。 影视动画特效,如皮克斯,也是国外较成熟。 GPU计算技术,可以应用在浏览器网页渲染上,GPU计算资源利用上,由于开源的原因,有很多的文档程序可以参考。如果能进火狐开发,或google做浏览器开发,应该会很好。 嵌入式方向:嵌入式方向没说的,Linux很重要。 掌握多个架构,不仅X86的,ARM的,单片机什么的也必须得懂。硬件不懂我预见你会死在半路上,我也想走嵌入式方向,但我觉得就学校教授嵌入式的方法,我连学电子的那帮学生都竞争不过。奉劝大家,一定得懂硬件再去做,如果走到嵌入式应用开发,只能祝你好运,不要碰上像Nokia,Hp这样的公司,否则你会很惨的。 驱动程序设计:软件开发周期是很长的,硬件不同,很快。每个月诞生那么多的新硬件,如何让他们在Linux上工作起来,这是你的工作。由于Linux的兼容性很好,如果不是太低层的驱动,基本C语言就可以搞定,系统架构的影响不大,因为有系统支持,你可能做些许更改就可以在ARM上使用PC的硬件了,所以做硬件驱动开发不像嵌入式,对硬件知识的要求很高。可以从事的方向也很多,如家电啊,特别是如索尼,日立,希捷,富士康这样的厂子,很稀缺的。 LDD–Linux驱动程序设计与内核编程的基础读物 深入理解Linux内核–进阶的 Linux源代码–永无止境的 当然你还的看个方面的书,如网络啊什么的。 学习linux内核的建议 学习linux内核,这个可不像学一门语言,c或者java一个月或者3月你就能精通掌握。学习linux内核是需要一步一步循序渐进,掌握正确的linux内核学习路线对学习至关重要,本篇文章就来分享学习linux内核的一些建议吧。 1.了解操作系统基本概念。如果不会,可以学习《操作系统:设计与实现》AndrewS.Tanenbaum写的那本。以MINIX为例子讲解操作系统的概念。非常推荐。 2.有了操作系统的基本概念以后,可以了解Linux的机制了。推荐《Linux内核设计与实现》RobertLove写的。这本书从概念上讲解了Linux有什么,他们是怎么运行的。这本书要反复认真看透。 3.有了Linux内核的了解,还需要具体研究Linux内核源码。经典的就是《深入理解Linux内核》DanielP.Bovet写的。学习这本书的时候,要对着内核代码看着学。这本书学起来相当费力了,那么多多代码要研究。不过这本书如果学明白了,恭喜你,Linux内核你已经很熟悉了。 4.如果要开发设备驱动,可以学习《linux设备驱动程序》O‘Reilly出版社的。这本作为驱动的入门是很好的资料。另外还有一本《精通Linux驱动程序开发》也是不错的教材,可以参考着看。学习驱动,免不了要学习一些硬件的协议和资料,研究哪个就找到相应的硬件文档,把硬件的工作原理搞明白。这些就不细说了。 5.网络部分,学些Linux网络部分就学习《深入理解LINUX网络技术内幕》。这本书把Linux的网络部分讲的非常清晰透彻。但是通常不做这方面的工作研究,也不用研究这么深,毕竟现在相关职位较少。 6.现在Linux相关的工作,多集中在一些嵌入式开发领域,arm,mips等,要学习以下这些体系架构的的资料,了解CPU的设计和工作方式。ARM就看对应的芯片手册,讲的很细致。MIPS就看《seemipsrun》,有一二两版,两版内容有些差异,推荐都看。 7.补充一点经验。不要认为Linux很庞大,很复杂,就觉的很难学。任何东西认真学下来都是能学会的,看你都恒心和毅力了。另外,不要走弯路,不要看市面上讲什么Linux0.11的那些书,直接学你要学的东西。就像学C语言看什么谭浩强一样,弯路走了,力气没少花,还严重影响学习效果。 关于linux内核学习路线,再多说几句应用编程,有时候经常会需要的: 1.学习Linux应用编程,建议看《unix环境高级编程》,把里面的例子都做一遍,会对整个Linux编程有系统都认识。 2.针对Linux,有本《Linux系统编程》,学完上一本,这本很快看一遍就懂了。主要是针对Linux具体懂一些内容,讲的挺全了,很实用。 3.Linux网络编程,系统的学习一下《unix网络编程。卷1,套接字联网api》,基本上网络应用相关的程序就都没问题了。 这些内容,分几年时间,分步计划学习,就会成为Linux高手了。个人建议参加华清远见的培训,学习效率会高很多,有目的性的参加培训,缩短周期,快速成型才是时代所需。 这是我们推荐的Linux核心学习系列

    时间:2020-10-09 关键词: bsd Linux 内核

  • Linux 内核何以发展至今?

    Linux 内核何以发展至今?

    当来自芬兰的21岁的学生Linus Torvalds在1991年编写Linux内核代码的第一行时,他可能没想到它会成为今天的庞然大物。 当年 8 月 25 日,Torvalds 在 Minix Usenet 新闻组里发了一封帖子,称自己正在做一个自由的操作系统,“就是个兴趣爱好,不会搞得像 GNU 那么大那么专业”。 事情的发展显然远超他的预期,如今小到传感器,大到超级计算机,从智能手机、手表、汽车等日常用品到航天器等设备,Linux 内核的身影已无处不在。 随着迄今为止最大版本 Linux Kernel 5.8 于今年 8 月初的发布,Linux 内核已拥有超过 2 万名贡献者,历史 commit 数超过 100 万次,迎来一个新的里程碑。 上周恰逢 Linux 29 周年纪念日,Linux 基金会发布了一份详尽的 Linux 内核报告,涵盖了自 1991 年 9 月 17 日首次发布以来,到 2020 年 8 月 2 日最新版本的 Linux 内核历史。 版本控制:从 BitKeeper 到 Git Linux 基金会从 2008 年开始每年发布 Linux 内核报告,但此前一直难以将其发展过程完整串联起来。 今年,借助 Daniel German 博士的 cregit 工具,他们成功追溯到了第一个版本,Linux 内核的发展时间线变得清晰。根据版本控制方式,可大致分为以下三个阶段: pre-version control(前版本控制):1991 年 9 月 - 2002 年 2 月 4 日 BitKeeper:2002 年 2 月 4 日 - 2005 年 4 月 15 日 Git:2005 年 4 月 16 日至今 版本控制对社区协作能力影响重大,这在 2000 年代初是一件令人颇为苦恼的事情。使用版本控制系统,也就是 BitKeeper 之前,贡献者需要将补丁提交至邮件列表,待 Torvalds 接受后放进源码树,再发布整个树的新版本。 在这种方式下,具体是谁在做贡献、贡献的数量和路径都不够透明。 2002 年 2 月 4 日,BitKeeper 的使用标志着 Linux 内核 commit 历史的开启。然而 BitKeeper 为专有软件,这一决定在社区中遭受了长期质疑。 直到 2005 年,BitKeeper 拥有者 Larry McVoy 决定收回无偿使用 BitKeeper 的许可。Torvalds 本人当时又对现成的 CVS 和 Subversion 等集中式版本控制工具感到不满,因此自己动手,用十天时间写出了 Git 的第一个版本。 Git 目前已成为开发者们非常熟知且广泛使用的分布式版本控制系统。Linus Torvalds 则表现得更多的是迫于无奈,他曾声称自己“根本不想做源代码管理,觉得这是计算机世界中最无趣的事情”。 自从版本控制系统由 BitKeeper 改为 Git 后,Linux 内核每年的贡献者和 commit 数量都在稳步增长。历年的内核报告数据显示,2005 年 5 月发布的 2.6.12 版本平均每小时收到 2 次 commit。 15 年后,2019 年的平均数是每小时 9.4 次。而在最新的 5.8 内核中,平均每小时 commit 数达到了 10.7 次。 繁杂且自成体系的内核代码 首个内核版本 linux-0.01.tar.Z 由 88 个文件和 10,239 行代码组成,运行在 i386 这样单一的硬件架构上。到了 5.8 版本,这一数据扩张为 69,325 个文件和 28,442,673 行代码,并能够在 30 多种主要的架构上运行。 数量上的庞大仅是 Linux 内核代码的表象,它自身更是形成了一套复杂的体系,不熟悉的人往往不知从何处下手,极有可能“牵一发而动全身”。这或许也是内核维护者难寻的原因之一。 Linux 内核发布第一天起的某些代码仍在当前版本中使用,例如 Torvalds 和大学好友 Lars Wirzenius 共同编写的 vsprintf 例程,它也是为数不多存在至今的首次 commit 中的源代码。 今年的内核报告提到,有 2,964 个能被追溯至 1991 年的 token 如今在 5.8 版本中也能找到。5.8 版本超过一半的代码写于近 7 年内,但之前所有年份都对此版本有贡献。过去的代码不断在后续的版本中留下痕迹。 持续膨胀的内核文件量和代码行数未见得完全是一件好事,为了使系统不变得臃肿,内核维护者需要做一些修枝剪叶的工作。 Linux 内核中未使用的代码和文件都会被视情况删除,有一些版本还会进行大的清理,例如 2018 年的 4.17 版本,删除了 8 个架构,净减少代码大约 180,000 行。 不仅仅是源码,Linux 内核维护者还会关注空白行和代码注释,以确保源码的可读性。 开发者原创证书和标签管理 2004 年对开发者原创证书(Developer Certificate of Origin,简称 DCO)的标准化是 Linux 内核史上的一个关键变化点。DCO 的引入为开发者和用户提供了法律保护,同时又不至于增加程序负担。 它极大地提高了跟踪补丁进入内核的路径的能力,加上版本控制系统向 Git 的过渡,DCO 有效地减轻了开发者做贡献的开销,因此变得很受欢迎,后来也被许多其他开源项目采用。 随着 DCO 的标准化使用,现在几乎所有的 commit 都有一个 Signed-off-by 标签。通常每个 commit 平均会有两个该标签,能够反映代码在合并之前的维护者层次结构,有助于追溯补丁进入代码的路径。 Signed-off-by 之外,Linux 内核还增加了表示审查的标签(Reviewed-by 和 Acked-by)。审查对内核代码的质量来说相当重要,标签的加入令这个过程更加清晰,有越来越多的维护者选择使用标签来表示已审查。 在审查 git 仓库时,Linux 基金会发现了一些比较有趣的标签,像是 "Enithusiastically-ack'd by"、"Thanksto"、"Based-on-the-Original-screenplay-by"、"Catched-by-andrightfully-ranted-at-by" 等等。 但这些标签并没有像上述两类一样被广泛采用。 行之有效的发布模式 Linux 内核的发布模式已渐趋成熟,现在基本固定为 Prepatch(或"-rc")、Mainline、Stable 和 Long Term Stable 四类版本。 社区曾对发布周期进行了大量的探讨和实验,并逐渐找到了行之有效的发布模式,发布周期也几乎完全可预测——每个发布周期由时长两周的“合并窗口”开始,这时,新功能经适当的 review 后可被纳入接下来要发布的 git 仓库。 一旦它被标记为 rc1,那么集成测试、调试和稳定化的周期就开始了。然后每周对 rc 候选版本进行标记,直到达到目标质量和稳定性。发布后,随着下一个合并窗口的到来,这个周期又开始循环。 内核的主线树由 Linus Torvalds 维护,这棵树引入了所有新功能。新的主线(Mainline)内核每 2 到 3 个月发布一次。但这样的发布节奏较慢,难以满足大多数用户的需求。因此,从 2005 年开始,每周发行一次稳定版(Stable)内核。 用户还想要受维护时间更长的版本,于是 2006 年发布的 2.6.16 版本成为第一个长期支持(LTS)版本内核。此后每年都有一个新的 LTS 内核,该内核将由内核社区维护至少 2 年(从 4.4 版本开始延长至 6 年)。 Linux 内核官网公布了所有现存 LTS 版本的发行日期、EOL 日期及维护者(目前 6 个 LTS 版本都由 Greg Kroah-Hartman 和 Sasha Levin 这两人维护)。 贡献者:长尾的力量不可忽视 不少组织都在为 Linux 内核做贡献,贡献者排行榜前列几乎都被 Intel、Red Hat、IBM、SUSE、Google、Samsung、AMD、Oracle、华为和 ARM 这样的大企业占据。 从 2007 年到 2019 年,Linux 内核共接受了来自 1,730 个组织的 780,048 次 commit。排在最前面的 20 个组织占了 68% 的 commit 量。 在过去十年中,每年有超过 400 个组织为 Linux 内核做出贡献。其中相当一部分可能只有过一次 commit。从每年的 commit 比例来看,其中 1/3 贡献来自神秘的长尾。也就是图中最上面浅灰色 “Others” 的部分。 Linux 基金会指出,企业的贡献会根据业务需求和战略的不同而有所变化。前 20 名贡献者中,有些是 2007 年之后才加入,有些在此前做过很多贡献的公司,被收购后便不再继续参与。贡献者的多样性为内核发展赋予了一些弹性。 除了组织贡献者,Linux 内核社区成员也致力于增加个人贡献者的多样性,他们通常愿意花费自己的时间来指导新的开发者。 Linux 基金会有一个 Kernel Mentorship(LKMP)项目,用来帮助新加入开源的开发者进行实验、学习,并为开源社区做出贡献。 内核社区的共同目标:高质量、可靠性 报告的最后,Linux 基金会指出,内核社区的重点是保持一个共同的目标,即拥有一个没有回归的高质量操作系统,愿意根据需要创建新的流程和工具,以帮助提高效率,并继续提升 Linux 内核的可靠性。 内核测试现在也引入了一些自动化测试工具:静态分析工具如 sparse(语义解析器)、smatch(源匹配器)和cocicheck(语义补丁,测试特定的 bug),由 0-day 和 Hulk Robot 这样的自动测试机器人在 Linux 内核树上运行。 机器人在发现和跟踪 bug 上起到不少作用。这些测试工具能够帮助开发人员跟上上游内核的速率变化,并继续改进内核版本,提升其稳定性。 Linux 内核如今被应用于诸多领域,基金会认为,改进基础设施,进行正确的安全分析,是接下来要应对的重大挑战之一。 目前 Linux 内核已拥有一个很好的基础,它应当继续引领创造最佳实践,以促进整个开源软件行业的发展。

    时间:2020-09-10 关键词: commit Linux 内核

  • 改变 Linux 内核的贡献方式

    改变 Linux 内核的贡献方式

    最近,微软Linux基金会董事会成员萨拉·诺沃特尼(Sarah Novotny)在接受外国媒体TheRegister采访时表示:“ Linux内核维护者需要更好或替代的工具来共同招募新的 用于维护Linux Earn内核。” 今年六月底,Linus Torvalds 关于“Linux 内核维护者难寻”的讨论引起众多开发者的关注。以 Linux 内核如今的体量,对内核的维护和文档的建设都将是非常艰难的工作。另外,Torvalds 也反复提到过,内核维护工作是一件枯燥的事情,年轻人可能不会感兴趣。 对此,Novotny 透露,Linux 基金会一直在就内核继任者的问题进行讨论,并且已经在着手制定计划。为了引入新的贡献者,他们认为应当从工具入手,不是 C 编译或各种工具链等开发工具,而是提交和讨论代码的工具。 多年以来,Linux 内核邮件列表一直作为内核开发人员之间进行协作的主要工具而存在,纯文本电子邮件是内核开发的入门门槛。 电子邮件机制确实是有效的,但它对新的贡献者来说也确实是一项障碍。Novotny 指出,”我们需要建立一种更好的或不同的方式,来审视所用的工具和 Linux 项目中正在进行的工作,因为我们需要新的贡献者来维护 Linux“。 Linux 基金董事会目前的想法是,从现有的基于文本的电子邮件系统迁移,或在此基础上拓展一个新近成长起来的开发者更为熟悉的方式。 是否应当迁移到类似 GitHub issues 和 PR 之类的功能上?什么时候会有迁移的动作?Novotny 现在还说不准,但她肯定”人们进入该工作流程的方式需要进行扩展“。

    时间:2020-09-08 关键词: novotny Linux 内核

  • PowerVR G6100 Series6 ‘Rogue’内核将推动OpenGL ES3.0的普及

      PowerVR GPU系列现可提供从单簇到六簇内核的多种组合   全球移动通信大会,西班牙巴塞罗那 —— 2013 年 2 月 25 日 —— 领先的多媒体、处理器、通信和云技术提供商 ImaginaTIon Technologies (IMG.L) 宣布,推出突破性PowerVR Series6 ‘Rogue’系列中面积最小的新成员,将有助于实现OpenGL ES 3.0的普及。   PowerVR G6100是新款面积优化的GPU IP内核,具备一组‘Rogue’架构的执行单元簇,是目前市场上支持OpenGL ES 3.0规范的最小面积、最高效率GPU内核。PowerVR Series6是最早实现OpenGL ES 3.0的GPU架构之一*。   PowerVR G6100加入后, Series6图形IP系列构成了完整且灵活的1、2、4和6簇GPU路线图,以适应从大众化智能手机和平板电脑到高端设计等各种移动和嵌入式市场的不同需求。   ImaginaTIon合作伙伴最新推出的产品已可显示出采用OpenGL ES 3.0的优势,通过将更多处理操作移到GPU上,能取得最快的绘图与运算性能,并减轻移动设备的CPU资源与降低功耗。G6100推出后,ImaginaTIon将能推动OpenGL ES 3.0的大规模普及,同时对从最大众化的手机到功能最强的平板电脑和游戏机来说,这都将突显GPU日益提升的重要性。   G6100是专为移动解决方案实现高品质绘图与高效率GPU运算性能所设计的。对移动产品来说,面积空间有限,但仍然需要先进的OpenGL ES 3.0绘图性能。其他的IP解决方案都无法以相同的芯片面积提供与G6100相同的特性组合或性能。   在设计支持OpenGL ES 3.0功能的高清晰度或多屏幕低成本设备时,G6100可提供晶硅面积与性能间的最佳平衡。G6100的单一USC(统一着色簇)可与高性能材质映射单元结合,能够与前一代的多处理器GPU一样,提供相同的填充速率。   ImaginaTIon Technologies营销执行副总裁Tony King-Smith表示:“通过PowerVR Series6,我们可为合作伙伴提供具备真正可扩展性的产品蓝图,以适应从海量市场的移动和嵌入式设备到高端游戏与GPU运算的所有需求。PowerVR G6100能以非常小的面积提供最佳性能与最低功耗。此外,它具备与所有其他‘Rogue’内核的软件兼容性,这意味着能将整个系列产品的软件开发成本降到最低。”   他补充道:“我们相信G6100 将能推动市场大量采用支持OpenGL ES 3.0 功能的超便携式移动设备,从大众化智能手机到令人振奋的新款可穿戴式电脑都将使用。”   PowerVR Series6 ‘Rogue’架构介绍   根据可扩展的运算簇数量,PowerVR Series6架构能够针对日益成长的各种市场需求进行设计,包括智能手机、平板电脑、PC、游戏机、汽车和电视等从移动到最高性能嵌入式绘图设备。利用这些可编程运算单元阵列,PowerVR G6xxx内核可提供领先的GPU运算功耗效率,并将功耗与带宽需求降到最低。   PowerVR Series6 GPU可为所有常用的以及新兴的GPU运算API提供完整支持,包括OpenCL 1.x和Renderscript Compute/Filterscript,并能为移动和嵌入式设备提供性能与功耗间的最佳平衡。Series6系列产品的成员是专为支持这些最新的绘图API特性所设计,包括OpenGL ES 3*/2/1.1、OpenGL 3.x/4.x,以及完全符合WHQL的DirectX9.3/10,此外,某些产品成员已可支持DirectX11.1功能。   PowerVR Series6 GPU系列产品提供了多项新技术与特性组合,包括先进的可扩展运算簇架构;包括无损影像和参数压缩,以及备受尊崇的PVRTC2™材质压缩等高效压缩技术;增强的调度架构;基于Imagination处理器技术的专用内部管理处理器;以及新一代Tile Based Deferred Rendering架构。结合这些特性使架构具备高度的延迟冗余度,所需的内存带宽也为业界最低,同时还能根据不同配置提供每mm2或每mW的最佳性能。   关于PowerVR   Imagination的PowerVR绘图技术已获得全球领先厂商的授权,用来开发最具指标性的热门产品,包括智能手机、平板电脑、电视,以及具备最先进用户界面和最高性能游戏的游戏机应用程序。   PowerVR GPU技术是由全球最庞大的专属绘图处理器工程团队所开发。它能与Imagination的PowerVR Insider生态系统互补,为拥有超过35,000名开发人员的活跃社区提供完整的支持与工具。这些开发人员已经为内置PowerVR技术的设备创造了数十万种最优化的应用程序。   Imagination的PowerVR绘图技术是移动和嵌入式绘图的业界标准。PowerVR Series6已经获得多家合作伙伴的采用,并且已有产品出货。   编者注   *更多完整的一致性资讯,请访问www.khronos.org。   更多有关 Imagination 科技在全球移动通信大会上的信息,请访问   http://www.virtualpressoffice.com/eventExhibitor.do?page=ep&showId=2332&companyId=1524。   关于 Imagination Technologies   Imagination Technologies 是全球领先的多媒体、处理器和通信技术提供商,可开发并授权领先市场的处理器解决方案,包括图形、视频、影像、CPU 和嵌入式处理、多重标准通信、跨平台 V.VoIP 和 VoLTE,以及云连接技术。这些用来开发系统单芯片 (SoC) 的硅和软件知识产权 (IP) 解决方案拥有完善的软件、工具和生态系统支持。目标市场包括移动电话、联网家庭消费产品、移动和平板电脑、车载电子产品、网络、电信、医疗、智能能源和连网传感器。Imagination 的授权客户包括多家全球领先的半导体制造商、网络厂商和 OEM/ODM 厂商。公司总部位于英国,并在全球设有销售和研发办公室。更多信息,请访问:www.imgtec.com。  

    时间:2020-09-05 关键词: ip GPU powervr opengl g6100 es3.0 内核

  • 如何为远程医疗设备选择合适的实时操作系统?

    如何为远程医疗设备选择合适的实时操作系统?

      发达国家的医疗保健服务已经超越了以医院为中心的模式,以初级和二级医疗为重点而不仅局限于医院。这些举措推动了用于医院之外、通常由病人自己使用的远程医疗设备的发展。   对远程医疗设备的迫切需求正在推动市场增长。美国2010年的无线消费医疗设备销售额达到6亿美元,2011年有望达到13亿美元 ,然而与全球医疗设备市场每年2000 亿美元的销售额相比仍然微不足道。   操作系统 - 关键区分要素   操作系统是所有电子医疗设备的关键区分要素,而且制造商也非常明白这一点。事实上,他们往往在选择板卡前先选择操作系统。      图 1 不同行业中首先选择操作系统的项目所占比率   本文的讨论未包括消费级医疗设备,例如其发生故障时不会造成严重后果。对于出现故障时会导致严重后果的设备,可将其操作系统的关键特征归类如下:   · 可信性:在规定的时间内对事件进行及时正确地响应   · 连接性:直接或通过网络与不同设备和系统进行通讯   · 数据完整性和安全性:安全地存储数据并防止未经授权的查阅   以上每个特征都值得深入讨论,在此我们只重点介绍其中最重要的一种特征--可信性。      图2 一种简单的远程病人监护网络   选择GPOS 还是RTOS?   可信性将可用性和可靠性合二为一。可用性要求系统能够及时响应请求的概率,可靠性则表明响应的正确率。对一个可靠的操作系统的要求是排除使用通用操作系统(GPOS),因为GPOS不能提供严格的可用性和可靠性的保障。   与此相反,实时操作系统(RTOS)本身就是为了保证可用性和可靠性而精心设计的。设计人员可以信赖实时操作系统随时响应需求的可用性和按要求完成任务的可靠性。因此,可以得出这样的结论,即:大部分的医疗设备需要实时操作系统。   实时操作系统架构   即使像配药机这样简单的设备也不允许出现故障。假如故障导致数据损坏,配药机可能改变剂量,最终的严重后果可想而知。既然操作系统架构对系统的可靠性有重要影响,那么首先就应对它进行严格评估。实时操作系统最常见的三种架构是实时执行、宏内核和微内核。   实时执行架构   基于实时执行架构,所有的软件组件包括内核、网络协议栈、文件系统、驱动程序和应用程序都在同一个内存地址空间内运行。这种架构虽然高效,但它有两个明显缺点。首先,任何模块内的单个指针错误都可能损坏内核或任何其他模块所用的内存。其次,系统崩溃后不会留下诊断信息。   宏内核架构   有些实时操作系统通过宏内核架构(其中的程序可作为内存受保护的进程运行)解决可能引起整个系统故障的内存错误。这种架构的确能防止用户故障代码损坏内核。但是,内核组件仍与其他服务共享相同的地址空间。因此,任何服务中的单个编程错误都可能导致整个系统崩溃。   微内核架构   在微内核实时操作系统中,设备驱动程序、文件系统、网络协议栈和应用程序都运行在内核外部的独立地址空间,因此它们不仅与内核隔离,而且彼此之间也互不影响。一个组件出现故障不会导致整个系统瘫痪,组件中的内存故障不会影响其他进程或内核。这样,操作系统就能自动重启故障组件。      图 3 病人监护系统中的微内核操作系统   实时操作系统的关键特征   在众多操作系统特征中,除了系统架构必须仔细评估,其他重要特征包括:   · 确保实时性   · 防止优先级反转   · 确保可用性   · 监视和重启进程   确保实时性   对所有需要确保实时性的系统而言,抢占式内核至关重要。例如,病人摔倒时触发了报警器应能抢占进程并发出警报。   为确保优先级高的进程随时获得所需的CPU周期,实时操作系统的内核需要进行抢占式运行,此外内核的设计必须尽可能简单,以保证最长的不可被抢占代码路径有执行时间的上限。只要操作系统的内核能将任务密集的运行分配到外部进程或线程,并只包括路径短的服务就能在操作系统内核实现这种简洁性设计。

    时间:2020-09-04 关键词: 操作系统 监控系统 远程医疗 医疗设备 内核

  • Linux 声音子系统开始清理术语:内核模块速度最快

    Linux 声音子系统开始清理术语:内核模块速度最快

    前段时间,Linux之父Linus Torvalds 通过了 Linux 中避免 master/slave 等术语的提案,也就是在 Linux 内核编码规范中添加了“包容性术语(Linux Kernel Inclusive)”准则。新的包容性术语文档适用于贡献到 Linux 内核的新代码,但最终还是希望可以替换现有不使用包容性术语的代码。 目前 Linux 声音子系统(Linux Sound Subsystem)已经开始在 Linux 5.9 中提交了相关补丁,跟进这一术语准则,这应该是当前能看到的内核中最早跟进的模块。 可以看到,SUSE 的声音子系统维护者 Takashi Iwai 已经为即将到来的 Linux 5.9 准备了许多补丁,包括在 ALSA/sound 中多处地方替换“blacklist”与“whitelist”,相应更改为“denylist”与“allowlist”。 同时,vmwaster API 中的“slave”也替换为“follower”,不过,因为“master(调控)”在声音系统中与音量控制相关,所以“master”在实际的 API 中仍然是首选。 详情可以查看此处声音相关的提交日志:https://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound.git/log

    时间:2020-07-23 关键词: Linux 内核

  • 国内电子书厂商无视 Linux 内核协议,被群嘲

    国内电子书厂商无视 Linux 内核协议,被群嘲

    近日消息,国内电子书厂商文石(Onyx)被指拒绝发布其电子书设备源码,违反 GPL v2 开源协议。既然违反规定,就要受到惩罚。 Onyx 的电子书设备是在 Linux 内核基础上的改版,而 Linux 内核基于 GPL v2 许可证,该许可证有很明显的 “传染性”,要求二次分发项目也必须开源(本质是也必须基于 GPL v2,关于 GPL v2 的更多信息,可以查看:人话版 GPL 2.0 协议)。 如上图,有用户在 Reddit 上放出一张对话截图,有人向 Onyx 指出了其违规问题,而 Onyx 官方回应 “技术团队表示目前不能把源码开放”,并希望他人谅解。似乎是承认了自己已经违规,但是也没有办法改正。 Onyx 的态度激起许多人的不满,甚至把对 Onyx 的批评上升到国家层面。 部分批评者认为,Onyx 事件暴露了中国厂商不尊重开源协议,以及法律无法有效保障开源协议的不足。最便捷的解决办法就是,限制软件使用,“对于大多数中国公司而言,诸如 GPL 之类的许可证只是垃圾桶中的一张纸…… 保护自己的唯一方法就是不要与他们共享代码。” 这是我们不愿看到的一幕。 事实上,世界各地违反开源协议开发软件的事件时有发生。无论在哪里,国家力量都很难防止违法违规个案的发生,更重要的是通过法律追责,整治侵权行为,世界各国也都是这么做的。美国联邦巡回上诉法院也是在 2008 年,才首次在实际判例中,主张开源协议的著作权效力。 不过也有人对开源协议在中国的法律效力提出质疑,认为此类诉讼在中国无法实现,进而导致开源协议制度在中国形同虚设。 其实中国已经在实际诉讼案例中,承认了开源协议的法律效力,并严惩侵权行为。 2019 年 12 月,北京高级人民法院对被告柚子(北京)科技有限公司、柚子(北京)移动技术有限公司、与原告数字天堂(北京)网络技术有限公司侵犯计算机软件著作权纠纷做出终审判决。 原告数字天堂公司 HBuilder 软件中有三个使用 GPL 的插件,两被告公司的 APICloud 软件复制并修改了 HBuilder 软件中的三个插件,但 APICloud 并没有按照 GPL 的规定全部开源。最终,法院判令被告停止侵权并赔偿 71 万元。 这起判例证明,中国法律可以保障开源协议效力,也可以维护著作权人的权益。 中国的开源生态正逐步建立与完善。包括开源中国在内,国内还有开源社等开源社区,为开源理念发声;国产木兰许可证第二版也已经过开源促进会批准,国际通用;华为、BAT 等巨头在开源社区上的贡献率年年攀升,许多开源布道者和开发者,也将个人时间和精力投入开源建设,竭力维护自由与分享的精神…… 全球技术发展正遭受各种政治与社会因素的冲击,开源应该是维护 “技术中立”的武器,而不应该以个例为由,成为另一种形式的封锁。

    时间:2020-07-18 关键词: Linux 内核

  • 不必担心美国管制Linux内核会让中国软件行业为难

    不必担心美国管制Linux内核会让中国软件行业为难

    随着美国在相关领域对中国的制裁逐步收紧,许多基本软件产品最初受到美国的干预,中国公司被禁止使用它们。 一般的操作系统都是基于Linux内核开发的,在这个基础上,相关企业根据特定使用场景,开发出了很多涉及各方面的操作系统。可能一般人能够接触到的操作系统,要属手机操作系统和电脑操作系统两类。这两种操作系统用户群体极广,但美国即使对此进行管制,中国也有相应的替代产品。像手机操作系统这一块,华为就受到美国制裁,而不得不使用其自主开发的鸿蒙操作系统。 在桌面操作系统这一块,因为大部分是基于Linux内核开发的,国内的相关产品已能达到业内主流水平。即使微软限制中国使用Windows操作系统,中国也不会因此受到多大影响。但如果美国管制开源技术的话,那结果就完全不同了。国内很多基于Linux内核开发的操作系统,都将面临被禁用的结果。很多与之相关的软件也没法使用,那对于中国软件行业的发展无疑是一个巨大打击。 不过这个担心或许是多余的,根据Linux基金会的一份白皮书声明,开源技术不会受到任何一个国家的管制。这一块要想实现完全自主研发,需要的时间成本很大,因为国内在内核开发这块还没有较大发展。开源技术如果受到管制,相当于一切又得从零开始。 或许美国有这样的打算,它自然希望看到中国经济发展陷入困境。但即使美国的话语权再大,也没法干涉所有的事情。中国在这一块也无需太过担心,美国目前针对的还只是国内的某些企业,对整体的经济影响不大。 从这件事可以看出,核心技术上,中国还是得有一个备用方案。即使一时间用不上,也能防范可能的威胁。像华为如果没法开发鸿蒙系统,在操作系统这一块也会被美国限制,这将让其陷入更大的困境。

    时间:2020-07-16 关键词: Linux 内核 Windows

  • 浅析Linux内核的五大主要功能

    浅析Linux内核的五大主要功能

    我们首先要了解下什么是linux内核,那么Linux内核是Linux操作系统的核心,也是整个Linux功能体现的核心,它是用C语言编写的,符合Posix准。Linux早是由芬兰黑客Linus Torvalds为尝试在英特尔X86架构上提供自由免费的类UNIX操作系统而开发的。该计划开始于1991年,这里有一份Linus Torvalds当时在Usenet新闻组comp.os.minix所登载的帖子,这份著名的帖子标志着Linux计划的正式开始。在计划的早期有一些Minix黑客提供了协助,而今天全球无数程序员正在为该计划无偿提供帮助。 现今Linux是一个一体化内核(Monolithic Kernel)系统,设备驱动程序可以完全访问硬件。Linux内的设备驱动程序可以方便地以模块化(Modularize)的形式设置,并在系统运行期间可直接装载或卸载。 inux内核主要功能包括进程管理、内存管理、文件管理、设备管理、网络管理等。 1、进程管理:进程是在计算机系统中资源分配的小单元。内核负责创建和销毁进程,而且由调度程序采取合适的调度策略,实现进程间的合理且实时的处理器资源的共享。从而内核的进程管理活动实现了多个进程在一个或多个处理器上的抽象。内核还负责实现不同进程间、进程和其他部件之间的通信。 2、内存管理:内存是计算机系统中主要的资源。内核使得多个进程安全而合理地共享内存资源,为每个进程在有限的物理资源上建立一个虚拟地址空间。内存管理部分代码可分为硬件无关部分和硬件有关部分:硬件无关部分实现进程和内存之间的地址映射等功能;硬件有关部分实现不同体系结构上的内存管理相关功能并为内存管理提供与硬件无关的虚拟接口。 3、文件管理:在Linux系统中的任何一个概念几乎都可以看做一个文件。内核在非结构化的硬件上建立了一个结构化的虚拟文件系统,隐藏了各种硬件的具体细节,从而在整个系统的几乎所有机制中使用文件的抽象。Linux在不同物理介质或虚拟结构上支持数十种文件系统。例如,Linux支持磁盘的标准文件系统ext3和虚拟的特殊文件系统。 4、设备管理:Linux系统中几乎每个系统操作终都映射到一个或多个物理设备上。 除了处理器、内存等少数的硬件资源之外,任何一种设备控制操作都由设备特定的驱动代码来进行。内核中必须提供系统中可能要操作的每一种外设的驱动。 5、网络管理:内核支持各种网络标准协议和网络设备。网络管理部分可分为网络协议栈和网络设备驱动程序。网络协议栈负责实现每种可能的网络传输协议(TCP/IP协议等);网络设备驱动程序负责与各种网络硬件设备或虚拟设备进行通信。 以上就是linux内核的五大功能的简单介绍了,各位观众老爷了解了吗,可以一起讨论讨论啊。

    时间:2020-06-22 关键词: Linux 内核

  • Linux 5.6内核将支持USB4:代码不足2000行

    Linux 5.6内核将支持USB4:代码不足2000行

    据最新消息,Linux 5.6版内核会正式支持USB4,预计将在2020年4月份发布。 USB4标准是今年9月刚公布的,基于Intel开放出来的雷电协议,带宽再次翻番到40Gbps,与雷电3完全相同,同时向下兼容雷电3、USB 3.x/2.0,而且只有Type-C一种接口。 两个多月前,Intel开源工程师就向Linux内核提交了支持USB4的代码和补丁,新代码还不到4000行,因为USB4基本就是将雷电3的翻版,很多代码也都是通用的。 而最终呈现在Linux 5.6内核里的USB4相关代码,只有不足2000行,非常紧凑,但要啥有啥,包括主机与设备支持、源代码和一系列其他功能。 Windows 10何时原生支持USB4还没有说法,但肯定也不会多么复杂。

    时间:2020-01-15 关键词: 代码 雷电3 usb4 Linux 内核

  • linux网络——iptables与网关

    linux网络——iptables与网关

    概述 最近做关WiFi家庭网关项目,接触到很多新的知识,本文对linux的iptables、网关中的NAT转换、DMZ、端口映射和端口触发等概念进行总结 linux iptables linux iptables是linux2.6内核以后使用的一套网络工具,对其进行合理的配置,可实现防火墙、NAT转换等网关功能 好,那么iptables怎么配置,这些配置是如何实现的呢 iptables配置方法 应用层的iptables是一个可执行程序,iptabltes- h可看到命令帮助,这里首先要说明一下iptables中的3个层次递进的概念:表(table)、链(chain)和规则(target),iptables应用程序命令就是对某个表的某个链的某个规则操作 iptables默认有4张表,nat、filter、mangle和raw,项目中使用了nat和filter,所以这里只说nat和filter 每个表都有几条默认的链,nat默认有PREROUTING、INPUT、OUTPUT、POSTROUTING4个链,filter默认有INPUT、FORWARD、OUTPUT3个链,表不可增减,但是表中的链可自定义增加或删除 命令格式 : iptables -t [table] -[opt] [chain] -j ... 命令的格式变化太多,且无需记住所有命令,关键是实际中如何使用,常用哪些,后续再说 iptables内核实现 这里不会分析源码,只注重大局和框架,上图最方便 上图表示的是网络数据从网卡驱动接收程序中跳转到协议层后,都经历了哪些东东,这些过程属于linux的net子系统,与设备无关 所有报文都经过这个图,从PREROUTING这里,报文的mac已经被剥离,即从以后是三层处理,主要关注报文的ip地址,先抛开这些点是干嘛的,理一理数据报的流向 PREROUTING点表示还未进行路由之前,经过路由后,报文的流向无非是两个结果,要么该报文是发往本机的,即上面一条路,要么是发往其他设备的,走下面一条路 如果是发往本机,则经过IUPUT点,到达Localhost,即发往上层协议处理,处理之后,还会经过一个路由,判断发往哪里 如果是发往其他设备,则经过FORWARD点进行转发 最后所有数据报都会经过POSTROUTING点,出设备 这些点和iptables中的表和链是什么关系?此即彼 iptables在内核中的实现是通过netfilter完成的,本质上是在这些预先设置好的点上添加各种内核钩子函数,当程序执行到这些点上时,按照iptables应用程序配置的规则进行处理,是接收、丢弃、转发,还是NAT转换…,iptables和内核通信通过netlink完成,当然出于某些特殊需求,你也可以自己添加钩子函数,怎么添加,看/linux-2.6-xxx/net/netfilter/下的几个源码自然会了 NAT转换 NAT转换是干嘛?转换ip地址,为什么要转换?一是地址不够了,二是保护内网 地址不够的问题就要涉及到网络地址划分了,不展开说,地址分为A、B、C、D、E五类,所有地址中选取一些地址作为私有地址,只用于内网,它们是 10.0.0.0 ~ 10.255.255.255 172.16.0.0 ~ 172.31.255.255 192.168.0.0 ~ 192.168.255.255 怎么保护,外网不可访问内网,内网可以访问外网 iptables的表nat专门用于设置和处理NAT转换的规则,内网访问外网资源时,将源ip地址转换为一个外网地址,该过程叫SNAT,iptables设置后,也可以让外网访问内网部分资源,将目的ip地址转换为一个内网地址,该过程叫DNAT,说白了,核心在于对网络结构的理解,对iptables进行配置,以控制数据流的走向 DMZ DMZ是干嘛的,官话是位于外网和防火墙之间的一个区域,可放置一些私人服务器资源,供外网访问,上图来理解 上图中,共有三个区域,外网、DMZ和内网,一般用户家中如果不放置私人服务器等东东,没有DMZ 外网在网关左侧,DMZ和内网在网关右侧,表明DMZ和内网都是私有地址,内网包括用户会使用的PC、手机等设备,这些设备必须与外网严格隔离,不可被外网入侵,DMZ区域放置一些可以被外网访问的服务器 一般的规则是:外网可访问DMZ,不可访问内网,DMZ不可访问外网和内网,内网可访问外网和DMZ 但是规则都是人定的,关键在于iptables的配置,怎么玩都行其实

    时间:2019-11-21 关键词: 防火墙 内核

  • 内核启动流程分析

    内核启动流程分析

    内核启动流程分析之编译体验 Linux源码编译过程 方法: 解压缩下载好的linux-2.6内核源代码 ; 给内核打补丁 ; 打补丁命令:patch -p n 会生成一个.config文件->再执行内核配置命令:make menuconfig 就会在默认配置基础之上,出现一个配置菜单,就可以此基础之上进行配置了。 使用厂家提供的设置文件 把厂家的配置文件复制成.config文件,再make menuconfig. cp config_厂家 .config -> make menuconfig 补充: menuconfig 中的基本操作: 1. 高亮字母是索引,直接敲相应字母会跳转到相应索引 2. [ ] 中输入’?’ 会跳到帮助信息 3. 输入‘/’ 会跳到搜索功能 编译内核 直接执行:make 会编译生成 zImage 或者执行:make uImage 就会生成uImage uImage就是 :头部+ 真正的内核(vmlinux) 内核启动流程分析之配置 配置的结果是生成.config文件,打开这个.config文件,可以看到有很多的配置项,配置成y或M。 我们以一个配置项:CONFIG_DM9000 为例,看一下谁在使用这个配置。 搜索一下:grep 'CONFIG_DM9000' * -nR 可以看到使用的包括几类: C源码: CONFIG_DM9000 一个宏,一般赋值为1 来源于include/linux/autoconf.h 子目录Makefile :drivers/net/Makefile 在这里体现y和M的区别 内核子目录Makefile 格式: obj-y +=xxx.o //表示xxx.c文件会被编译到内核里面去 obj-m +=xxx.o //表示xxx.c文件会被编译成内核模块.ko文件 include/config/auto.conf 也是来源于.config,也是自动生成的 这个文件被顶层的Makefile包含 include/linux/autoconf.h 这个文件是自动生成的,来源于 .config 执行:make uImage 时执行的操作 1. .config自动生成include/linux/autoconf.h文件 2. .config自动生成include/config/auto.conf文件 3. autoconf.h给C源码使用 4. auto.conf文件被包含到顶层的Makefile中,然后在子目录Makefile中被用到: obj-$(CONFIG_DM9000 ) +=dm9000.o `auto.conf中 CONFIG_DM9000 = y` 当变量$(CONFIG_DM9000 )等于y时,就会编译进内核;等于M,会编译成模块;如果没有设置的话,也不处理,表示没有使用。 内核启动流程分析之Makefile 子项目下的Makefile 已知有文件:a.c b.c 要在Makefile中设置成编译进内核,可用:obj-y +=a.o b.o 实现 如果用a.c b.c 组合成一个模块呢? 可用: obj -m +=ab.o ab-objs :=a.o b.o 这样,编译时 a.c 会编译成 a.o ; b.c 编译成 b.o ; 然后 a.o 和 b.o 链接成ab.ko 这个在Documentationkbuildmakefiles.txt中都有说明 架构相关的Makefile 执行:make uImage 时,Makefile会定位到 arch/arm/Makefile 这个Makefile肯定会被包含到顶层Makefile中去。 果然在顶层目录的Makefile中包含这句:include $(srctree) /arch/$(ARCH)/Makefile 顶层目录的Makefile 执行:make uImage 时,会依赖哪些文件呢,顺序是什么? 我们上面知道在arch/arm/Makefile中uImage的依赖为vmlinux->根据跟踪,得到如下索引: 执行:#make uImage 进行编译,可以看到这行命令: 给出了链接文件等等,依赖文件和上面分析的是一一对应的。 我们得到分析流程的两大结果: 第一个文件:arch/arm/kernel/head.S 链接脚本(定义内核中的文件怎么排布的): arch/arm/kernel/vmlinux.lds 内核启动流程分析之内核启动 篇幅较长,点我跳转

    时间:2019-10-01 关键词: 内核启动流程分析 内核

  • 锐龙3000处理器的CPU、IO温度揭秘 95°C高温怕不怕

    锐龙3000处理器的CPU、IO温度揭秘 95°C高温怕不怕

    现代的高性能处理器除了要拼性能之外,还有一个因素不容忽视,那就是CPU核心温度,导致温度高的原因很复杂,核心数、频率、工艺、功耗等都会影响,但我们能知道的就是温度高了很不好,会导致性能下降。 在锐龙3000系列处理器中,AMD宣传的一个重点就是不仅性能比友商酷睿处理器更好,而且温度、功耗也低。我们实际测试之后也知道,锐龙3000处理器高负载下的温度也不低。 那么锐龙3000系列的内部温度到底是怎样的呢?TH网站德国站的编辑Igor Walossek做了一期很有意思的视频,不放散热器的情况下用红外温度计测试了CPU内部的温度。 他测试的是一款不超过8核的锐龙3000处理器,里面有两部分组成—;—;上面较大的核心是12nm工艺的IO核心,下面较小的是7m CPU核心。 在没有散热器的情况下,他用红外温度计追踪了CPU内部的IO核心、CPU核心的温度。 首先看CPU核心的温度,为了保护CPU,AMD设置了热阈值,温度上限是94.5°C,顶盖内外的温差大概是16K,也就是16°C,所以他视频中看到的CPU核心温度在80°C左右。 上面的12nm IO核心没有热阈值,温差也不知道,观察到的温度达到了85°C。 上面的温度依然不是极限状态下的,因为没有散热器,Igor Walossek也不敢玩得太过,以免CPU被高温损毁。

    时间:2019-10-01 关键词: CPU 温度 io 锐龙3000 内核

  • 内核态与用户态通信方式——Nelink

    内核态与用户态通信方式 Linux下内核空间与用户空间进行通信的方式主要有system call、sysctl、procfs、模块参数、debugfs、relayfs、sysfs和netlink等。 Why NetlinK full-duplex 模块参数、sysfs、procfs、debugfs和relayfs都是基于文件系统,用于内核向用户发送消息;sysctl和system call是用户向内核发送消息。它们都是单工通信方式。netlink是一种特殊的通信方式,用于在内核空间和用户空间传递消息,是一种双工通信方式。使用地址协议簇AF_NETLINK,使用头文件include/linux/netlink.h。 simple to add 为新特性添加system call、sysctl或者procfs是一件复杂的工作,它们会污染kernel,破坏系统的稳定性,这是非常危险的。Netlink的添加,对内核的影响仅在于向netlink.h中添加一个固定的协议类型,然后内核模块和应用层的通信使用一套标准的API。 Netlink Socket APIs 用户空间 创建 int socket(int doamin, int type, int protocal); domain填AF_NETLINK,type为SOCK_RAW或者SOCK_DGRAM。protocal可选NETLINK_ROUTE、NETLINK_FIREWALL、NETLINK_ARPD、NETLINK_ROUTE6和NETLINK_IP6_FW,或者传入自定义协议类型。 绑定 int bind(int fd, (struct sockaddr *)&nladdr, sizeof(nladdr)); netlink地址结构如下 struct sockaddr_nl{ sa_family_t nl_family; //AF_NETLINK unsigned short nl_pad; //0 __u32 nl_pid; //进程pid __u32 nl_groups; //多播组掩码 } 如果进程仅仅使用一个netlink,nl_pid可以传入该进程的pid, my_pid = getpid(); 如果一个进程的多个线程需要不同的netlink,使用如下方法获得nl_pid: pthread_self nlmsg_len; msg.msg_iov = &iov; msg.msg_iovlen = 1; 接收 接收时需要创建足够的buf, struct sockadddr_nl nladdr; struct msghdr msg; struct iovec iov; iov.iov_base = (void *)nlh; iov.iov_len = MAX_NL_MSG_LEN; msg.msg_name = (void *)&nladdr; msg.msg_namelen = sizeof(nladdr); msg.msg_iov = &iov; msg.msg_iovlen = 1; recvmsg(fd, &msg, 0); 内核空间 内核空间的API由net/core/af_netlink.c支持。 可以在netlink.h中添加自定义协议类型: #define NETLINK_TEST 17 创建 struct sock *netlink_kernel_create(int unit, void (*input)(struct sock *sk, int len)); unit是netlink.h中定义的协议类型,*input是一个回调函数指针,接收到消息会触发这个函数。 发送 发送消息使用struct sk_buff *skb。 用以下方式设置本地地址: NETLINK_CB(skb).groups = local_groups; NETLINK_CB(skb).pid = 0; 因为是在内核,pid = 0 用以下方式设置目的地址: NETLINK_CB(skb).dst_groups = dst_groups; NETLINK_CB(skb).dst_pid = dst_pid; 发送单播函数为 int netlink_unicast(struct sock *sk, struct sk_buff *skb, u32 pid, int nonblock); *sk为netlink_kernel_create()返回的结构体指针; skb->data指向消息; pid为应用程序的pid; block表明如果当接收缓冲非法时数据分块还是返回错误值。 发送多播函数为 void netlink_broadcast(struct sock *sk, struct sk_buff *skb, u32 pid, u32 group, int allocation); group是所有需要接收多播消息的组掩码和; allocation是内核内存分配标志,中断上下文中使用GFP_ATOMIC,其他情况使用GFP_KERNEL。 销毁 sock_release(nl_sk->socket); example user-space 初始化 #define MAX_NLMSG_PAYLOAD_LEN 128 #define NETLINK_GROUP_MASK(group) (1 MAX_NLMSG_PAYLOAD_LEN)) { return -1; } memset((void*)&iov, 0x0, sizeof(iov)); memset((void*)&msg, 0x0, sizeof(msg)); msg_len = NLMSG_SPACE(data_len); nlh = (struct nlmsghdr *)malloc(msg_len); if (NULL = nlh) { return -2; } /* fill nlmsghdr */ memset(nlh, 0x0, msg_len); nlh->nlmsg_len = msg_len; nlh->nlmsg_pid = getpid(); nlh->nlmsg_type = msg_type; nlh->nlmsg_flags = 0; if (data) { memcpy(NLMSG_DATA(nlh), data, msg_len); } /* fill iovec */ iov.iov_base = (void *)nlh; iov.iov_len = nlh->nlmsg_len; msg.msg_iov = &iov; msg.msg_iovlen = 1; if (sendmsg(fd, &msg, 0) < 0) { /* error process */ free(nlh); return -3; } free(nlh); return 0; } 接收 int usr_netlink_recv(int fd, char *buf, int len) { struct iovec iov = {buf, len}; struct sockaddr_nl nl_src_addr; struct msghdr msg; int recv_len; memset(&msg, 0x0, sizeof(struct msghdr)); memset(&nl_src_addr, 0x0, sizeof(struct sockaddr_nl)); msg.msg_name = (void *)&nl_src_addr; msg.msg_namelen = sizeof(nl_src_addr); msg.msg_iov = &iov; msg.msg_iovlen = 1; recv_len = recvmsg(fd, &msg, 0); if (recv_len < 0) { /* recv error */ } else if (recv_len == 0) { /* recv EOF */ } return recv_len; } kernel 初始化 static struct sock *sg_knl_xxx_sk = NULL; static int sg_knl_xxx_pid = -1; void knl_netlink_init() { struct net init_net; sg_knl_xxx_sk = netlink_kernel_create(&init_net, NETLINK_TEST, 0, knl_neklink_recv, NULL, THIS_MODULE); } 接收 void knl_netlink_recv(struct sock *skb) { struct nlmsghdr *nlh = nlmsg_hdr(skb); sg_knl_xxx_pid = nlh->nlmsg_pid; } 发送 int group_mask(int group) { return (1 MAX_PAYLOAD_LEN)) { /* error process */ return; } skb = alloc_skb(msg_len, GFP_KERNEL); if (!skb) { /* erro process */ return; } memset((void *)skb, 0x0, msg_len); nlh = nlmsg_put(skb, 0, 0, msg_type, msg_len, 0); if(data) { memcpy(NLMSG_DATA(nlh), data, data_len); } NETLINK_CB(skb).pid = 0; /*from kernel */ NETLINK_CB(skb).dst_group = group_mask(group); /* if unicast */ netlink_unicast(sg_knl_xxx_sk, skb, sg_knl_xxx_pid, MSG_DONTWAIT); /* if mulicast */ //nlmsg_multicast(sg_knl_xxx_sk, skb, 0, group_mask(group), 0); }

    时间:2019-09-02 关键词: 通信 内核

  • 兆易创新推出GD32V系列RISC-V内核32位通用MCU新品

    兆易创新推出GD32V系列RISC-V内核32位通用MCU新品

    2019年8月22日,北京 — 业界领先的半导体供应商兆易创新GigaDevice(股票代码603986)宣布,在行业内率先将开源指令集架构RISC-V引入通用微控制器领域,正式推出全球首个基于RISC-V内核的GD32V系列32位通用MCU产品,提供从芯片到程序代码库、开发套件、设计方案等完整工具链支持并持续打造RISC-V开发生态。 作为GD32 MCU家族基于RISC-V内核的首个产品系列,全新的GD32VF103系列RISC-V MCU面向主流型开发需求,以均衡的处理效能和系统资源为RISC-V进入市场主流应用提供了高性价比的创新之选。新品首批提供了14个型号,包括QFN36、LQFP48、LQFP64和LQFP100等4种封装类型选择,并完整保持了与现有产品在软件开发和引脚封装方面的兼容性。这种前所未有的创新性设计在GD32的Arm®内核产品与RISC-V内核产品之间搭建起快速通道,将跨越处理器内核的产品选型和设计切换变得灵活自如,从而更易于实现代码移植并缩短开发周期。全面适用于工业控制、消费电子、新兴IOT、边缘计算、人工智能及垂直行业的深嵌入式市场应用。   全面优化的RISC-V处理器内核 GD32VF103系列MCU采用了全新的基于开源指令集架构RISC-V的Bumblebee处理器内核,是兆易创新(GigaDevice)携手中国领先的RISC-V处理器内核IP和解决方案厂商芯来科技(Nuclei System Technology)面向物联网及其它超低功耗场景应用自主联合开发的一款商用RISC-V处理器内核。 Bumblebee内核采用32位RISC-V开源指令集架构并支持定制化指令,更优化了中断处理机制。不仅配备了64位宽的实时计时器、可以产生RISC-V标准定义的计时器中断,还支持数十个外部中断源,具有16个中断级别和优先级,并支持中断嵌套和快速向量中断处理机制。低功耗管理可以支持两级休眠模式。内核支持标准JTAG接口及RISC-V调试标准,适用于硬件断点和交互式调试。Bumblebee内核也支持RISC-V标准的编译工具链,以及Linux/Windows图形化集成开发环境。 Bumblebee内核设计了二级变长流水线微架构,配备精简的指令预取单元和动态分支预测器,并融入多种低功耗设计方法。能够以二级流水线的代价,达到传统架构三级流水线的性能和频率,实现了业界一流的能效比与成本优势。这使得GD32VF103系列MCU在最高主频下的工作性能可达153 DMIPS,CoreMark®测试也取得了360分的优异表现,相比GD32 Cortex®-M3内核产品性能提升15%的同时,动态功耗降低了50%,待机功耗更降低了25%。 GD32VF103系列RISC-V 内核32位通用MCU   主流均衡的首发产品组合 GD32VF103系列RISC-V MCU提供了108MHz的运算主频,以及16KB到128KB的片上闪存和6KB到32KB的SRAM缓存,gFlash®专利技术支持内核访问闪存高速零等待。Bumblebee内核还内置了单周期硬件乘法器、硬件除法器和加速单元应对高级运算和数据处理的挑战。 芯片采用2.6V-3.6V供电,I/O口可承受5V电平。配备了1个支持三相PWM互补输出和霍尔采集接口的16位高级定时器可用于矢量控制,还拥有多达4个16位通用定时器、2个16位基本定时器和2个多通道DMA控制器。全新设计的中断控制器(ECLIC)提供了多达68个外部中断并可嵌套16个可编程优先级,以增强高性能控制的实时性。 为广泛的主流应用配备的多种外设资源,包含多达3个USART、2个UART、3个SPI、2个I2C、2个I2S、2个CAN2.0B和1个USB 2.0 FS OTG,以及外部总线扩展控制器(EXMC)。其中,全新设计的I2C接口支持快速Plus (Fm+)模式, 频率最高可达1 MHz (1MB/s),是以往速度的两倍。SPI接口也已经支持四线制并新增多种传输模式,还可方便扩展Quad SPI NOR Flash实现高速访问。内置的USB 2.0 FSOTG接口可提供Device、HOST、OTG等多种模式。外部总线扩展控制器(EXMC)更方便连接NOR Flash,SRAM等外部存储器。 新品集成了2个采样率高达2.6M SPS的12位高速ADC,提供了多达16个可复用通道,并支持16-bit硬件过采样滤波功能和分辨率可配置功能,还拥有2个12位DAC。多达80%的GPIO具有多种可选功能还支持端口重映射,持续以灵活丰富的连接性满足主流开发应用需求。 GD32VF103系列RISC-V内核通用32位MCU产品线 芯来科技CEO胡振波表示:“兆易创新是中国集成电路产业的标杆,也是中国通用MCU供应商的龙头。芯来科技目前已经具备领先的RISC-V处理器内核IP和工具链研发能力,并处于中国RISC-V嵌入式处理器研发与产业化的最前列。双方的合作必将让RISC-V落地生根,为中国通用MCU在AIoT时代带来新突破、形成新格局,并与广大用户携手共赢。” 兆易创新执行副总裁、MCU事业部总经理邓禹表示:“RISC-V体系已经在全球快速崛起,成为半导体产业及工业控制、物联网、智能终端等应用领域的迅猛发展趋势。兆易创新在行业内首家推出基于RISC-V架构的32位通用MCU产品并持续打造RISC-V开发生态,也将进一步满足市场对于开放性架构的差异化需求并有利于发挥成本优势,让不断丰富完善的GD32 MCU‘百货商店’持续为用户提供更多创新之选。”   持续打造的RISC-V开发生态 兆易创新一直在为GD32生态系统提供丰富和完善的支持,包括多种开发板和应用软件在内的RISC-V开发生态也已准备就绪,GD32V系列产品的使用者可以利用全新的开发工具和程序代码库轻松实现设计构想。新增的开发工具包括GD32VF103V-EVAL全功能评估板以及GD32VF103R-START、GD32VF103C-START和GD32VF103T-START入门级学习板,可以分别对应四种不同封装和管脚,方便用户进行开发调试。另外还提供了GD32VF103-BLDC电机控制开发板、GD-LINK调试量产工具以及一系列来自合作伙伴的GD32 RISC-V终端设计方案。 兆易创新还联合芯来科技为GD32V系列MCU提供了免费集成开发环境Nuclei Studio。这个全新IDE基于开源的Eclipse架构,并集成了GCC、OpenOCD等RISC-V相关工具。用户可以快速上手并方便的完成代码编写、交叉编译、在线调试、程序烧写等一系列开发流程。第三方合作伙伴也提供了更多IDE和工具选择,包括Huawei IoT Studio、SEGGER J-Link V10及Embedded Studio等均已支持。嵌入式操作系统包括μC/OS II、FreeRTOS、RT-Thread、Huawei LiteOS等也已全面适配并可以直接连接至云。这些都极大程度的简化了开发难度。   即刻开始RISC-V的开发体验 GD32V系列新品全部符合工业级高可靠性和温度标准,并提供至少十年的持续供货保证。芯片的静电防护(ESD)防护水平在人体放电(HBM)模式可达5KV,器件放电模式(CDM)可达2KV,远高于行业安全标准,从而适用于复杂环境并让终端产品更可靠耐用。 全新的GD32VF103系列RISC-V MCU现已即刻上市。样片和开发工具都可以通过GD32技术网站获取,各授权经销商渠道及GD32天猫旗舰店也已同步发售。

    时间:2019-08-23 关键词: MCU gd32v系列 内核

首页  上一页  1 2 3 4 5 6 7 8 9 10 下一页 尾页
发布文章

技术子站

更多

项目外包