侵权投诉

改变世界的代码提交

Linuxer 2020-11-09 10:43 次阅读

背景

Linux作为最大也是最成功的开源项目,吸引了全球程序员的贡献,到目前为止,共有两万多名开发者给LinuxKernel提交过代码。令人惊讶的是,在项目的前十年(1991~2002)中,Linus作为项目管理员并没有借助任何配置管理工具,而是以手工方式通过patch来合并大家提交的代码。倒不是说Linus喜欢手工处理,而是因为他对于软件配置管理工具(SCM)非常挑剔,无论是商用的clearcase还是开源的cvs、svn等都不能入他的法眼。在他看来,一个能够满足Linux内核项目开发使用的版本控制系统需要满足几个条件:1)快2)支持多分支场景(几千个分支并行开发场景)3)分布式4)能够支持大型项目。直到2002年,Linus终于找到了一款基本满足他要求的工具——BitKeeper,而BitKeeper是商业工具,他们愿意给Linux社区免费使用,但是需要保证遵守不得进行反编译等条款。BitKeeper提供的默认接口显然不能满足社区用户的全部需要,一位社区开发者反编译BitKeeper并利用了未公开接口,这让BitKeeper公司撤回了免费使用的License。不得已,Linus利用假期十天时间,实现一款DVCS——Git,并推送给社区开发者们使用。

设计

Git已经成为全球软件开发者的标配,关于Git的介绍和用法不需多说,我今天想要谈谈Git的内部实现。不过在看本文之前,我先给大家提一个问题:如果是你来设计git(或者重新设计git),你打算怎么设计?第一个版本发布准备实现哪些功能?看完本文,再对照自己的想法做个比较。欢迎留言讨论。

学习Git的内部实现,最好的办法是看Linus最初的代码提交,checkout出git项目的第一次提交节点,可以看到代码库中只有几个文件:一个README,一个构建脚本Makefile,剩下几个C源文件。这次commit的备注写的也非常特别:Initialrevisionof"git",theinformationmanagerfromhell.

commite83c5163316f89bfbde7d9ab23ca2e25604af290Author:LinusTorvaldsDate:ThuApr715132005-0700Initialrevisionof"git",theinformationmanagerfromhell

在README中,Linus详细描述了Git的设计思路。看似复杂的Git工作,在Linus的设计里,只有两种对象抽象:1)对象数据库("objectdatabase");2)当前目录缓存("currentdirectorycache")。

Git的本质就是一系列的文件对象集合,代码文件是对象、文件目录树是对象、commit也是对象。这些文件对象的名称即内容的SHA1值,SHA1哈希算法的值为40位。Linus将前二位作为文件夹、后38位作为文件名。大家可以在.git目录里的objects里看到有很多两位字母/数字名称的目录,里面存储了很多38位hash值名称的文件,这就是Git的所有信息。Linus在设计对象的数据结构时按照<标签ascii码表示>(blob/tree/commit)+<空格>+<长度ascii码表示>+<>+<二进制数据内容>来定义,大家可以用xxd命令看下objects目录里的对象文件(需zlib解压),比如一个tree对象文件内容如下:

00000000:74726565203337003130303634342068tree37.100644h00000010:656c6c6f2e74787400270c611ee72c56ello.txt.'.a..,V00000020:7bc1b2abec4cbc345bab9f15ba{....L.4[....

对象有三种:BLOB、TREE、CHANGESET。

BLOB:即二进制对象,这就是Git存储的文件,Git不像某些VCS(如SVN)那样存储变更delta信息,而是存储文件在每一个版本的完全信息。比如先提交了一份hello.c进入了Git库,会生成一个BLOB文件完整记录hello.c的内容;对hello.c修改后,再提交commit,会再生成一个新的BLOB文件记录修改后的hello.c全部内容。Linus在设计时,BLOB中仅记录文件的内容,而不包含文件名、文件属性等元数据信息,这些信息被记录在第二种对象TREE里。

TREE:目录树对象。在Linus的设计里TREE对象就是一个时间切片中的目录树信息抽象,包含了文件名、文件属性及BLOB对象的SHA1值信息,但没有历史信息。这样的设计好处是可以快速比较两个历史记录的TREE对象,不能读取内容,而根据SHA1值显示一致和差异的文件。另外,由于TREE上记录文件名及属性信息,对于修改文件属性或修改文件名、移动目录而不修改文件内容的情况,可以复用BLOB对象,节省存储资源。而Git在后来的开发演进中又优化了TREE的设计,变成了某一时间点文件夹信息的抽象,TREE包含其子目录的TREE的对象信息(SHA1)。这样,对于目录结构很复杂或层级较深的Git库可以节约存储资源。历史信息被记录在第三种对象CHANGESET里。

CHANGESET:即Commit对象。一个CHANGESET对象中记录了该次提交的TREE对象信息(SHA1),以及提交者(committer)、提交备注(commitmessage)等信息。跟其他SCM(软件配置管理)工具所不同的是,Git的CHANGESET对象不记录文件重命名和属性修改操作,也不会记录文件修改的Delta信息等,CHANGESET中会记录父节点CHANGESET对象的SHA1值,通过比较本节点和父节点的TREE信息来获取差异。Linus在设计CHANGESET父节点时允许一个节点最多有16个父节点,虽然超过两个父节点的合并是很奇怪的事情,但实际上,Git是支持超过两个分支的多头合并的。

Linus在三种对象的设计解释后着重阐述了可信(TRUST):虽然Git在设计上没有涉及可信的范畴,但Git作为配置管理工具是可以做到可信的。原因是所有的对象都以SHA1编码(Google实现SHA1碰撞攻击是后话,且Git社区也准备使用更高可靠性的SHA256编码来代替),而签入对象的过程可信靠签名工具保证,如GPG工具等。

理解了Git的三种基本对象,那么对于Linus对于Git初始设计的“对象数据库”和“当前目录缓存”这两层抽象就很好理解了。加上原本的工作目录,Git有三层抽象,如下图示:一个是当前工作区(WorkingDirectory),也就是我们查看/编写代码的地方,一个是Git仓库(Repository),即Linus说的对象数据库,我们在Git仓看到的.git文件夹中存储的内容,Linus在第一版设计时命名为.dircache,在这两个存储抽象中还有一层中间的缓存区(StagingArea),即.git/index里存储的信息,我们在执行gitadd命令时,便是将当前修改加入到了缓存区。

Linus解释了“当前目录缓存”的设计,该缓存就是一个二进制文件,内容结构很像TREE对象,与TREE对象不同的是index不会再包含嵌套index对象,即当前修改目录树内容都在一个index文件里。这样设计有两个好处:1.能够快速的复原缓存的完整内容,即使不小心把当前工作区的文件删除了,也可以从缓存中恢复所有文件;2.能够快速找出缓存中和当前工作区内容不一致的文件。

实现

Linus在Git的第一次代码提交里便完成了Git的最基础功能,并可以编译使用。代码极为简洁,加上Makefile一共只有848行。感兴趣的同事可以通过上一段所述方法checkoutGit最早的commit上手编译玩玩,只要有Linux环境即可。因为依赖库版本的问题,需要对原始Makefile脚本做些小修改。Git第一个版本依赖openssl和zlib两个库,需要手工安装这两个开发库。在ubuntu上执行:sudoaptinstalllibssl-devlibz-dev;然后修改makefile在LIBS=-lssl行中的-lssl改成-lcrypto并增加-lz;最后执行make,忽略编译告警,会发现编出了7个可执行程序文件:init-db,update-cache,write-tree,commit-tree,cat-file,show-diff和read-tree.

下面分别简要介绍下这些可执行程序的实现:

init-db:初始化一个git本地仓库,这也就是我们现在每次初始化建立git库式敲击的gitinit命令。只不过一开始Linus建立的仓库及cache文件夹名称叫.dircache,而不是我们现在所熟知的.git文件夹。

update-cache:输入文件路径,将该文件(或多个文件)加入缓冲区中。具体实现是:校验路径合法性,然后将文件计算SHA1值,将文件内容加上blob头信息进行zlib压缩后写入到对象数据库(.dircache/objects)中;最后将文件路径、文件属性及blobsha1值更新到.dircache/index缓存文件中。

write-tree:将缓存的目录树信息生成TREE对象,并写入对象数据库中。TREE对象的数据结构为:'tree'+长度++文件树列表。文件树列表中按照文件属性+文件名++SHA1值结构存储。写入对象成功后,返回该TREE对象的SHA1值。

commit-tree:将TREE对象信息生成commit节点对象并提交到版本历史中。具体实现是输入要提交的TREE对象SHA1值,并选择输入父commit节点(最多16个),commit对象信息中包含TREE、父节点、committer及作者的name、email及日期信息,最后写入新的commit节点对象文件,并返回commit节点的SHA1值。

cat-file:由于所有的对象文件都经过zlib压缩,因此想要查看文件内容的话需要使用这个工具来解压生成临时文件,以便查看对象文件的内容。

show-diff:快速比较当前缓存与当前工作区的差异,因为文件的属性信息(包括修改时间、长度等)也保存在缓存的数据结构中,因此可以快速比较文件是否有修改,并展示差异部分。

read-tree:根据输入的TREE对象SHA1值输出打印TREE的内容信息。

这就是第一个可用版本的Git的全部七个子程序,可能用过Git的同事会说:这怎么跟我常用的Git命令不一样呢?Gitadd,gitcommit呢?是的,在最初的Git设计中是没有我们这些平常所使用的git命令的。在Git的设计中,有两种命令:分别是底层命令(Plumbingcommands)和高层命令(Porcelaincommands)。一开始,Linus就设计了这些给开源社区黑客使用的符合UnixKISS原则的命令,因为黑客们本身就是动手高手,水管坏了就撸起袖子去修理,因此这些命令被称为plumbingcommands.后来接手Git的JunioHamano觉得这些命令对于普通的用户可不太友好,因此在此之上,封装了更易于使用、接口更精美的高层命令,也就是我们今天每天使用的gitadd,gitcommit之类。Gitadd就是封装了update-cache命令,而gitcommit就是封装了write-tree,commit-tree命令。关于底层命令的更详细介绍,大家有兴趣的话可以看ProGit中的GitInternals章节。

具体的代码实现在这里就不再细述,Linus的代码风格极为简洁,能一行完成的绝不写两行。另外,对于LinuxAPI的使用自然无人出其右,我印象最深的是有好多处使用mmap建立文件与内存的映射,省去了内存申请、文件读写等操作,提升了工具性能。正如一位同事说的:Linus的代码除了不满足编程规范,其他好像真挑不出什么毛病。顺便说一句,Linus的缩进风格是Tab键(典故参见《制表符还是空格符,这是个问题》)。

启示

Linus在提交了第一个gitcommit后,并向社区发布了git工具。当时,社区中有位叫JunioHamano的开发者觉得这个工具很有意思,便下载了代码,结果发现一共才1244行代码,这更令他惊奇也引发了极大的兴趣。Junio在邮件列表与Linus交流并帮助增加了merge等功能,而后持续打磨git,最后Junio完全接手了Git的维护工作,Linus则回去继续维护LinuxKernel项目。

如果选历史上最伟大的一次Git代码提交,那一定是这Git工具项目本身的第一次代码提交。这次代码提交无疑是开创性的,如果说Linux项目促成了开源软件的成功并改写了软件行业的格局,那么Git则是改变了全世界开发者的工作方式和写作方式。在Git诞生后两年,旧金山的一个小酒馆里坐着三位年轻的程序员,决定要用Git做点什么,几个月后,GitHub上线。

回到文中开头提到的问题,如果我来设计Git的话,估计还是会从已有工具经验(如SVN使用)上来延伸设计,甚至在我最早接触Git时候曾肤浅的认为Git就是SVN+分布式。正是了解了Git的内部原理乃至阅读了Git的初始代码后才感叹其设计的精妙,Git的初始设计和实现大概能给(开源)软件产品如下启发:

解决痛点问题:Git的缘起便是Linus本人及Linux社区的诉求,而这些诉求推而广之是项目协作开发(特别是跨地域项目)的共性诉求。Linus解决了他本人遇到的痛点问题,顺便达成了一项伟大的成就。

极简设计:Linus在设计Git工具时并没有受传统SCM工具的束缚,考虑文件差异、版本对比等,而是抽象了几种基本对象就把git的设计思路给理清楚了。

MVP(minimumviableproduct,最小可用产品):这个概念大家都懂,但实际操作起来却不容易。一个MVP的配置管理工具需要哪些功能?一般来说会想到代码提交、历史追溯、版本比较、分支合并等。但Linus却将它拆解开来,快速实现了底层的基本功能,简单到只有开源社区黑客才能用。但这就够了,黑客们因此发现了它的价值,继续给它添砖加瓦。

快速发布,快速迭代:这也是源于LinuxKernel的开发经验;Linus在实现了GitMVP后,便在Linux社区邮件列表中公布,并征求意见,迭代完善。

找到合适接班人:《大教堂与集市》中也有类似的观点,它说的是:“如果你对一个项目失去了兴趣,你最后的职责就是把它交给一个称职的继承者。”不过Linus将Git交给Junio并不是因为失去了兴趣,而是因为他发现在Git基础架构建立好之后,Junio比他更擅长于实现更丰富、对普通用户界面更友好的功能,因此他就放心的将Git交给了Junio.为开源项目找到更合适的接班人,这既需要魄力也需要智慧。

原文标题:改变世界的一次代码提交

文章出处:【微信公众号:Linuxer】欢迎添加关注!文章转载请注明出处。

责任编辑:haq

原文标题:改变世界的一次代码提交

文章出处:【微信号:LinuxDev,微信公众号:Linuxer】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
分享:

评论

相关推荐

一文汇总Linux常规的硬件基础命令

cat /proc/cpuinfo # 查看 CPU 核心数,架构,名字,频率,缓存,指令集等命令
的头像 陈翠 发表于 02-24 11:16 71次 阅读
一文汇总Linux常规的硬件基础命令

使用Arduino实现心率脉搏血氧监测设计的原理图和代码免费下载

本文档的主要内容详细介绍的是使用Arduino实现心率脉搏血氧监测设计的原理图和代码免费下载。
发表于 02-24 08:00 2次 阅读
使用Arduino实现心率脉搏血氧监测设计的原理图和代码免费下载

ASCII码表免费下载

本文档的主要内容详细介绍的是ASCII码表免费下载列出了127个常用的ASCII代码。
发表于 02-24 08:00 10次 阅读
ASCII码表免费下载

使用LabVIEW的鼠标坐标反馈

当事件发生时,鼠标的位置坐标是很重要的信息,有时我们也需要提取鼠标坐标的历史轨迹来作为分析问题的工具....
发表于 02-24 08:00 14次 阅读
使用LabVIEW的鼠标坐标反馈

uboot是怎么传参给内核的?

uboot是怎么传参给内核的? linux怎么进行内存管理? 进程和线程的区别是什么 ...
发表于 02-24 07:56 0次 阅读
uboot是怎么传参给内核的?

Linux中如何加入led驱动及测试程序?

Linux中加入led驱动及测试程序详解
发表于 02-24 07:27 0次 阅读
Linux中如何加入led驱动及测试程序?

Linux内核新增的异构内存管理会带来什么不一样?

Linux 内核新增的异构内存管理(HMM)会带来什么不一样?...
发表于 02-24 07:20 0次 阅读
Linux内核新增的异构内存管理会带来什么不一样?

火星首个开源Linux系统以及飞行软件框架F Prime

从保护罩中被释放后,“毅力号”火星车将被吊车悬挂,通过尼龙绳和负责信号、控制指令传输的电缆,连接“吊....
的头像 传感器技术 发表于 02-23 15:51 109次 阅读
火星首个开源Linux系统以及飞行软件框架F Prime

只需要一秒钟,就可以使用VS Code阅读Github代码

【导语】:只需要一秒钟,就可以使用 VS Code 阅读 Github 代码。 Github 是全世....
的头像 Linux爱好者 发表于 02-23 11:38 108次 阅读
只需要一秒钟,就可以使用VS Code阅读Github代码

Linux系统中split命令的常用示例

1.命令简介 split 命令用于将一个大文件分割成较小的文件,默认每 1000 行分割成一个小文件....
的头像 Linux爱好者 发表于 02-23 11:36 87次 阅读
Linux系统中split命令的常用示例

Linux 5.12将修复系统意外关机的问题

Linux 5.11 上个星期才发布稳定版,Linux 5.12 目前仍在开发过程中。在 Linux....
的头像 Linux爱好者 发表于 02-23 11:35 147次 阅读
Linux 5.12将修复系统意外关机的问题

Linux中的fdisk命令简介

1.命令简介 fdisk 命令用于创建和维护磁盘分区表。它采用传统的问答式界面,而不是类似于 fdi....
的头像 Linux爱好者 发表于 02-23 11:24 99次 阅读
Linux中的fdisk命令简介

美国“毅力号”给火星送去Linux系统以及手机芯片?

“确认着陆!毅力号安全到达火星表面。”   就在今天凌晨4点55分,美国“毅力号”不经变轨,直接冲入....
的头像 Linux爱好者 发表于 02-23 11:16 150次 阅读
美国“毅力号”给火星送去Linux系统以及手机芯片?

Linux中iconv命令的简介和使用方法

1.命令简介 iconv命令是用来转换文件的编码方式,比如它可以将UTF8编码的转换成GB18030....
的头像 Linux爱好者 发表于 02-23 11:14 131次 阅读
Linux中iconv命令的简介和使用方法

Linux中的vim命令说明

1.简介 vim 是 Linux 操作系统中最通用的全屏幕文本编辑器,是 vi 的增强版(vi iM....
的头像 Linux爱好者 发表于 02-23 11:06 108次 阅读
Linux中的vim命令说明

ETCD集群的工作原理和高可用技术细节介绍

【导读】新年快乐!本文介绍了etcd集群的工作原理和高可用技术细节。 etcd 简介 coreos ....
的头像 Linux爱好者 发表于 02-23 10:54 117次 阅读
ETCD集群的工作原理和高可用技术细节介绍

LCD1602的驱动代码免费下载

本文档的主要内容详细介绍的是LCD1602的驱动代码免费下载。
发表于 02-23 08:00 7次 阅读
LCD1602的驱动代码免费下载

Linux基础千锤百炼的学习课件免费下载

本文档的主要内容详细介绍的是Linux基础千锤百炼的学习课件免费下载。
发表于 02-23 08:00 3次 阅读
Linux基础千锤百炼的学习课件免费下载

爆料称微软正准备开发低代码语言

据外媒ZDNet报道,著名泄密者WalkingCat在推特上透露,微软正在为Power Platfo....
的头像 lhl545545 发表于 02-22 11:23 199次 阅读
爆料称微软正准备开发低代码语言

Linux释放内存的方法

一般系统是不会自动释放内存的 关键的配置文件/proc/sys/vm/drop_caches。这个文....
的头像 陈翠 发表于 02-21 10:34 107次 阅读
Linux释放内存的方法

Linux后台启动程序的方式

通常在Linux系统运行某个程序的时候会占用当前终端控制台,当会话控制台结束后程序也随之关闭,那如何....
的头像 陈翠 发表于 02-21 10:32 119次 阅读
Linux后台启动程序的方式

Linux内核内存泄漏怎么办?

什么是内存泄漏: 程序向系统申请内存,使用完不需要之后,不释放内存还给系统回收,造成申请的内存被浪费....
的头像 Linuxer 发表于 02-20 17:14 225次 阅读
Linux内核内存泄漏怎么办?

谈一谈Linux让实时任务独占CPU的事

本文主要讨论在高实时要求、高效能计算、DPDK等领域,Linux如何让某一个线程排他性独占CPU;独....
的头像 Linuxer 发表于 02-20 17:11 233次 阅读
谈一谈Linux让实时任务独占CPU的事

从入门到高级替换If-Else的5种方法示例

本文并不肯定或者否定哪一种写法,仅仅为大家提供一些其他的编码思路或者一些值得借鉴的点子。 设计更好的....
的头像 算法与数据结构 发表于 02-20 16:27 242次 阅读
从入门到高级替换If-Else的5种方法示例

Android 12 首个开发者预览版发现隐藏代码:Pixel 6 可能同时具备指纹识别和人脸识别功能

月 20 日消息 根据在 Android 12 的首个开发者预览版中发现的隐藏代码,Pixel 6 ....
的头像 工程师邓生 发表于 02-20 10:23 184次 阅读
Android 12 首个开发者预览版发现隐藏代码:Pixel 6 可能同时具备指纹识别和人脸识别功能

美国毅力号携带Linux系统和骁龙801登陆月球

“确认着陆!毅力号安全到达火星表面。”就在昨天凌晨4点55分,美国“毅力号”不经变轨,直接冲入火星大....
的头像 如意 发表于 02-20 09:56 346次 阅读
美国毅力号携带Linux系统和骁龙801登陆月球

疯壳Android嵌入式Linux平板开发教程4-1Linux引导过程

详情地址:https://fengke.club/GeekMart/views/offline/android 购买链接:https://fengke.club/GeekMart/su_fHnaDyD1o...
发表于 02-19 14:36 0次 阅读
疯壳Android嵌入式Linux平板开发教程4-1Linux引导过程

疯壳Android嵌入式Linux平板开发教程3-8GPS

详情地址: 购买链接: 视频地址: GPS:接入GPS天线,打开菜单—GPS TEST—进行搜索附近位置点,需要将...
发表于 02-19 14:18 0次 阅读
疯壳Android嵌入式Linux平板开发教程3-8GPS

疯壳Android嵌入式Linux平板开发教程3-7摄像头

详情地址: 摄像头:菜单—摄像头,摄像头在板子左下方。 ...
发表于 02-19 14:17 0次 阅读
疯壳Android嵌入式Linux平板开发教程3-7摄像头

疯壳Android嵌入式Linux平板开发教程3-5SD卡读写

[table] [tr][td]购买链接: 视频地址: SD卡读写:插入SD卡左上方会出现sd插入标识,菜单—资源管理器—SD卡,...
发表于 02-19 14:12 0次 阅读
疯壳Android嵌入式Linux平板开发教程3-5SD卡读写

疯壳Android嵌入式Linux平板开发教程3-6USB口读写

视频地址: USB读写:接入USB,左上角有usb接入提示,打开usb存储设备,与设备读写。 ...
发表于 02-19 14:11 0次 阅读
疯壳Android嵌入式Linux平板开发教程3-6USB口读写

疯壳Android嵌入式Linux平板开发教程3-4亮度及音量调节

购买链接: 视频地址: 音量调节:点设置—声音—音量,进行调节或按按键音量+ - 亮度调节:设置—显示—亮度,进行调节 ...
发表于 02-19 14:07 0次 阅读
疯壳Android嵌入式Linux平板开发教程3-4亮度及音量调节

疯壳Android嵌入式Linux平板开发教程3-3WIFI联网及有线联网

视频地址: WIFI:在主界面点设置,打开WALN,连接搜索到的wifi。 有线网络:接上网线,打开设置—更多—以...
发表于 02-19 14:04 0次 阅读
疯壳Android嵌入式Linux平板开发教程3-3WIFI联网及有线联网

美国国防高级研究计划局(DARPA)将与Linux基金会合作

美国国防高级研究计划局(DARPA)将与Linux基金会合作,促进开放的5G、边缘计算、人工智能和物....
的头像 我快闭嘴 发表于 02-19 09:28 220次 阅读
美国国防高级研究计划局(DARPA)将与Linux基金会合作

Linux 5.12带来避免设备过热损坏的DTPM功耗控制特性

Linux 5.12的推送请求不断涌入新开放的合并窗口,这个合并窗口预计会在4月底看到它的稳定版本。....
的头像 工程师邓生 发表于 02-18 17:32 227次 阅读
Linux 5.12带来避免设备过热损坏的DTPM功耗控制特性

小米新的电视型号:小米Mi TV Q1 75

Mi TV Q1通过达到120 Hz的刷新率而成功地对市场上的大多数电视产生了影响,它具有HDR +....
的头像 倩倩 发表于 02-18 17:20 215次 阅读
小米新的电视型号:小米Mi TV Q1 75

因北美严寒与暴风雪 Linux 5.12合并窗口被迫暂停

本周,美国多个州遭遇冬季寒潮,部分区域迎来罕见的低温和暴风雪,各地基础设施建设与监管漏洞导致能源供应....
的头像 工程师邓生 发表于 02-18 15:05 282次 阅读
因北美严寒与暴风雪 Linux 5.12合并窗口被迫暂停

LineageOS ROM 放弃安卓 9 Pie 24 台机型无法再得到持续技术支持

外媒 9to5 Google 报道,作为最受欢迎的第三方 Android ROM 之一,Lineag....
的头像 工程师邓生 发表于 02-18 09:55 272次 阅读
LineageOS ROM 放弃安卓 9 Pie 24 台机型无法再得到持续技术支持

苹果M1处理器成功运行Linux

万物皆可Linux,这绝非一句玩笑话,苹果M1处理器已经可以成功运行它了。
的头像 如意 发表于 02-05 15:49 520次 阅读
苹果M1处理器成功运行Linux

神器jupyter的优势和使用教程

Python 代码编辑器怎么选?PyCharm、VS Code、Jupyter Notebook 都....
的头像 人工智能与大数据技术 发表于 02-05 09:36 170次 阅读
神器jupyter的优势和使用教程

讲解Linux之快速查找被删除的文件

日常运维过程中,我们经常需要处理磁盘空间问题,当接到告警后,第一时间会去找那些大文件,一般比如 Ce....
的头像 如意 发表于 02-04 16:29 459次 阅读
讲解Linux之快速查找被删除的文件

神器工具统一Excel和Python

单击此按钮可在Excel工作簿的侧面板中打开Jupyter Notebook。该面板是Excel界面....
的头像 数据分析与开发 发表于 02-04 16:00 217次 阅读
神器工具统一Excel和Python

JavaScript常用检测脚本实例代码免费下载

本文档的主要内容详细介绍的是JavaScript常用检测脚本实例代码免费下载。
发表于 02-03 17:02 22次 阅读
JavaScript常用检测脚本实例代码免费下载

智能手机市场根据其软件分为两种不同的类型-Android和iOS

有一个移动操作系统Ubuntu的所谓的触摸,基于流行的Linux发行- Ubuntu Linux系统....
的头像 倩倩 发表于 02-03 14:45 398次 阅读
智能手机市场根据其软件分为两种不同的类型-Android和iOS

Linux内核包的构建和安装详解

许多各种各样的UNIX和 Linux软件是源码形式的压缩文件。这些一样的安装包在编译后运行在不同的机....
发表于 02-03 10:40 38次 阅读
Linux内核包的构建和安装详解

如何在C代码中插入寄存器?

对于逻辑级数较高的路径,常用的方法之一是在其中插入流水寄存器,将路径打断,从而降低逻辑延迟,这在HD....
的头像 Lauren的FPGA 发表于 02-02 17:07 275次 阅读
如何在C代码中插入寄存器?

id命令:用于查看真实有效的用户ID和组ID

1.命令简介 id 命令用于查看真实有效的用户 ID(UID)和组 ID(GID)。 2.命令格式 ....
的头像 Linux爱好者 发表于 02-02 14:51 208次 阅读
id命令:用于查看真实有效的用户ID和组ID

readelf命令:用于读取ELF格式文件的详细信息

1.功能简介 readelf 用于读取 ELF(Executable and Linkable Fo....
的头像 Linux爱好者 发表于 02-02 14:45 253次 阅读
readelf命令:用于读取ELF格式文件的详细信息

使用javascript实现文字图片上下滚动的代码免费下载

本文档的主要内容详细介绍的是使用javascript实现文字图片上下滚动的代码免费下载。
发表于 02-02 14:36 26次 阅读
使用javascript实现文字图片上下滚动的代码免费下载

16岁高中生为一台无法正常使用的iPhone 7成功移植了Ubuntu 20.04

近日,国外一名 16 岁的开发者发布了一则视频,展示自己为一台已经无法正常使用的 iPhone 7 ....
的头像 Linux爱好者 发表于 02-02 14:35 367次 阅读
16岁高中生为一台无法正常使用的iPhone 7成功移植了Ubuntu 20.04

pidof命令:用于查找指定名称进程的进程ID

1.命令简介 pidof 命令用于查找指定名称进程的进程ID,是命令 killall5 的一个软链接....
的头像 Linux爱好者 发表于 02-02 14:16 246次 阅读
pidof命令:用于查找指定名称进程的进程ID

as命令:用于将汇编代码编译为二进制代码

  1.命令简介 as 命令是二进制工具集 GNU Binutils 的一员,是 GNU 推出的一款....
的头像 Linux爱好者 发表于 02-02 14:03 221次 阅读
as命令:用于将汇编代码编译为二进制代码

我在服务器上执行了rm -rf *

前情提要 前段时间,我在一个非公开的 Bug 赏金项目里发现了一个严重的漏洞,这个漏洞可以允许远程执....
的头像 Linux爱好者 发表于 02-02 13:56 168次 阅读
我在服务器上执行了rm -rf *

strings命令:用于打印文件中可打印字符串

  1.命令简介 strings 命令是二进制工具集 GNU Binutils 的一员,用于打印文件....
的头像 Linux爱好者 发表于 02-02 13:53 184次 阅读
strings命令:用于打印文件中可打印字符串

瑞萨电子推出业界首款基于清晰源代码格式的IEEE1588同步软件

全新完整时钟解决方案将IEEE1588软件与瑞萨时钟芯片相结合,提供更高设计灵活性,大幅降低数据包延....
发表于 02-02 13:46 1297次 阅读
瑞萨电子推出业界首款基于清晰源代码格式的IEEE1588同步软件

nm命令:用于显示目标文件中的符号

1.命令简介 nm 命令是 GNU Binutils 二进制工具集的一员,用于显示目标文件中的符号。....
的头像 Linux爱好者 发表于 02-02 13:45 199次 阅读
nm命令:用于显示目标文件中的符号

基于Ubuntu的平板电脑操作系统JingOS发布

近日,一个名为 Jingling Tech 的研发团队发布了一个基于 Ubuntu 的平板电脑操作系....
的头像 Linux爱好者 发表于 02-02 13:37 540次 阅读
基于Ubuntu的平板电脑操作系统JingOS发布

GNU Binutils的一员:ar命令

  1.命令简介 ar(ARchiver)命令是 GNU Binutils 的一员,可以用来创建、修....
的头像 Linux爱好者 发表于 02-02 11:54 243次 阅读
GNU Binutils的一员:ar命令

ldd命令:用于打印程序或者共享库文件所依赖的共享库列表

1.命令简介 ldd 命令用于打印程序或者共享库文件所依赖的共享库列表。注意,ldd 本身不是一个二....
的头像 Linux爱好者 发表于 02-02 11:37 174次 阅读
ldd命令:用于打印程序或者共享库文件所依赖的共享库列表

AM4379 AM437x ARM Cortex-A9 微处理器 (MPU)

TI AM437x高性能处理器基于ARM Cortex-A9内核。 这些处理器通过3D图形加速得到增强,可实现丰富的图形用户界面,还配备了协处理器,用于进行确定性实时处理(包括EtherCAT,PROFIBUS,EnDat等工业通信协议)。该器件支持高级操作系统(HLOS)。基于Linux的® 可从TI免费获取。其它HLOS可从TI的设计网络和生态系统合作伙伴处获取。 这些器件支持对采用较低性能ARM内核的系统升级,并提供更新外设,包括QSPI-NOR和LPDDR2等存储器选项。 这些处理器包含功能方框图中显示的子系统,并且后跟相应的“说明”中添加了更多信息说明。 处理器子系统基于ARM Cortex-A9内核,PowerVR SGX™图形加速器子系统提供3D图形加速功能以支持显示和高级用户界面。 可编程实时单元子系统和工业通信子系统(PRU-ICSS与ARM内核分离,允许单独操作和计时,以实现更高的效率和灵活性.PRU-ICSS支持更多外设接口和EtherCAT,PROFINET,EtherNet /IP,PROFIBUS,以太网Powerlink,Sercos,EnDat等...
发表于 09-25 11:51 218次 阅读
AM4379 AM437x ARM Cortex-A9 微处理器 (MPU)