linux的发展史是啥?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux的发展史是啥?相关的知识,希望对你有一定的参考价值。
1998年,国人第一次在本土市场上接触到Linux,给我们创造这个机会的是Turbo Linux。通过与国内大型IT媒体的密切合作,Turbo Linux将自由软件和Linux的概念借助报刊附送光盘的形式广为传播,并率先建立起国内Linux认证体系,无论在市场造势和商业策略的制订上都取得了领先的成功。1999年起,以蓝点(BluePoint)和冲浪(Xteam Linux)为代表的本土产品异军突起,使中文Linux真正变成中国人的事业。
接着,以红旗Linux为代表的“国家队”正式介入中文Linux领域。红旗软件汇集中国科学院20多年在开放系统上的研究成果,以及10多年来中文系统的开发经验,率先推出的红旗Linux服务器,扬起国产软件的一面旗帜,在业界引起强烈反响。
最后杀出的一匹黑马,是以联想为代表的IT传统实力派,坐拥庞大的PC销量带来的OEM预装市场,联想推出了幸福Linux,对其他Linux厂商造成了强大的冲击和市场压力。
中文Linux的进程简单明了,而从这一过程中也足以看到,国人对Linux的无限热爱之情。在各大厂商频频活跃于众人眼前的同时,诸位Linux的忠实追随者也纷纷建立了各式各样的Linux论坛,并在其中发表自己的高谈阔论,为中文Linux的发展摇旗呐喊。
应用推广一直以来都是Linux最大的难题,在国内也是如此。不过,经过两年的发展,在嵌入式系统、服务器和桌面应用等应用领域,国产Linux推广应用趋势已经逐渐明朗化。据专家预测,未来几年中,嵌入式Linux系统将在中国市场上有高速增长,工业控制类产品将走在前面,网络设备将紧随其后。
服务器一直以来都是Linux应用值得自豪的一个领域,政府、银行、邮电、保险等关键部门已经开始规模推广。Linux服务器的稳定性、安全性、可靠性已经得到业界认可,一大批中间件、数据库、网络及应用软件纷纷运行在Linux平台上。产业的形成也已日渐清晰,红旗、Turbo Linux、中软等公司已经形成开发、服务、市场、销售体系。
Linux桌面系统的僵局一度很难打破,但是厂商们还是在努力地发展和推广桌面Linux,红旗的桌面Linux OEM协议在上半年就已经突破了100万份,而中软等厂商也都推出了新的桌面版本。尽管我们可能质疑它的实际应用意义,但我们看到,厂商更多的用意是培育市场,争取更大的市场份额。专家的客观分析表明,桌面Linux应用时代的到来还需假以时日。 参考技术A 在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万人使用。
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单向顺应硬件商硬件开发驱动的历史。 参考技术B 粘贴也没有意思参考 http://doc.linuxpk.com/29.html 参考技术C Unix是较早被广泛使用的计算机操作系统之一,它的第一版于1969年由Ken Thompson在AT&T贝尔实验室实现,1973年Ken Thompson与Dennis Ritchie用C语言重写了Unix的第三版内核。
1969年,Unix系统的第一个版本(由Ken Thompson在AT&T贝尔实验室实现)
20世纪70年代末:AT&T成立Unix系统实验室
20世纪70年代末:CSRG(加州大学伯克利分校计算机系统研究小组)使用Unix对操作系统进行研究
BSD Unix和Unix System V形成了当今Unix的两大主流。可查看《Linux就该这么学》了解更多Linux
大多数现代系统中堆栈增长的方向是啥?
【中文标题】大多数现代系统中堆栈增长的方向是啥?【英文标题】:What is the direction of stack growth in most modern systems?大多数现代系统中堆栈增长的方向是什么? 【发布时间】:2010-10-14 11:10:02 【问题描述】:我正在准备一些 C 语言培训材料,我希望我的示例适合典型的堆栈模型。
C 堆栈在 Linux、Windows、Mac OSX(PPC 和 x86)、Solaris 和最新的 Unix 中的发展方向是什么?
【问题讨论】:
为什么向下版本:***.com/questions/2035568/… 【参考方案1】:堆栈在 x86 上向下增长(由架构定义,pop 递增堆栈指针,push 递减。)
【讨论】:
【参考方案2】:堆栈的增长通常不取决于操作系统本身,而是取决于运行它的处理器。例如,Solaris 在 x86 和 SPARC 上运行。 Mac OSX(如您所述)在 PPC 和 x86 上运行。 Linux 可以在任何东西上运行,从我的工作中的大 honkin' System z 到 puny little wristwatch。
如果 CPU 提供任何类型的选择,操作系统使用的 ABI / 调用约定指定如果您希望您的代码调用其他所有人的代码,您需要做出哪种选择。
处理器及其方向是:
x86:向下。 SPARC:可选。标准 ABI 使用 down。 PPC:我认为是。 System z:在链表中,我不骗你(但仍然失败,至少对于 zLinux)。 ARM:可选择,但 Thumb2 具有仅向下的紧凑编码(LDMIA = 之后递增,STMDB = 之前递减)。 6502:下降(但只有 256 个字节)。 RCA 1802A:任意方式,取决于 SCRT 实施情况。 PDP11:关闭。 8051:向上。在最后几台上显示我的年龄,1802 是用于控制早期穿梭机的芯片(我怀疑,根据它的处理能力来感应门是否打开 :-) 和我的第二台计算机,@ 987654322@(关注我的ZX80)。
PDP11 详细信息来自 here,8051 详细信息来自 here。
SPARC 架构使用滑动窗口寄存器模型。架构上可见的细节还包括寄存器窗口的循环缓冲区,这些缓冲区在内部有效并缓存,在溢出/下溢时带有陷阱。有关详细信息,请参阅here。正如the SPARCv8 manual explains,SAVE 和 RESTORE 指令就像 ADD 指令加上寄存器窗口旋转。使用正常数而不是通常的负常数会产生向上增长的堆栈。
上述 SCRT 技术是另一种技术 - 1802 使用了一些或它的 16 个 16 位寄存器用于 SCRT(标准调用和返回技术)。一个是程序计数器,您可以通过SEP Rn
指令将任何寄存器用作PC。一个是堆栈指针,两个被设置为始终指向 SCRT 代码地址,一个用于调用,一个用于返回。 没有寄存器被以特殊方式处理。请记住,这些细节来自记忆,它们可能并不完全正确。
例如,如果 R3 是 PC,R4 是 SCRT 调用地址,R5 是 SCRT 返回地址,R2 是“堆栈”(引用,因为它是在软件中实现的),SEP R4
会将 R4 设置为PC 并开始运行 SCRT 调用代码。
然后它将 R3 存储在 R2“堆栈”上(我认为 R6 用于临时存储),向上或向下调整它,抓取 R3 后面的两个字节,将它们加载到 到 R3,然后执行SEP R3
并在新地址运行。
要返回,它会 SEP R5
将旧地址从 R2 堆栈中拉出,向其添加两个(以跳过调用的地址字节),将其加载到 R3 和 SEP R3
以开始运行前一个代码。
在完成所有基于 6502/6809/z80 堆栈的代码之后,最初很难理解,但仍然以一种撞墙的方式优雅。此外,该芯片的一大卖点是一整套 16 个 16 位寄存器,尽管您立即丢失了其中的 7 个(5 个用于 SCRT,2 个用于 DMA 和内存中断)。啊,营销对现实的胜利:-)
System z 实际上非常相似,使用它的 R14 和 R15 寄存器进行调用/返回。
【讨论】:
要添加到列表中,ARM 可以在任一方向上增长,但可以通过特定的硅实现设置为一个或另一个(或者可以通过软件进行选择)。我处理过的少数人一直处于成长模式。 在我目前所见的一小部分 ARM 世界 (ARM7TDMI) 中,堆栈完全由软件处理。返回地址存储在一个寄存器中,如果需要,该寄存器由软件保存,并且前/后递增/递减指令允许将其和其他内容以任一方向放在堆栈中。 一个HPPA,堆栈长大了!在相当现代的建筑中相当罕见。 对于好奇的人,这里有一个关于堆栈如何在 z/OS 上工作的好资源:www-03.ibm.com/systems/resources/Stack+and+Heap.pdf 我不确定我对 a stack grows down 的表述是什么(例如,它向东增长)。 “向下”是否意味着堆栈指针的值随着push
操作而减小并随着pop
操作而增加?【参考方案3】:
它变小是因为分配给程序的内存有“永久数据”,即程序本身的代码在底部,然后是堆在中间。您需要另一个固定点来引用堆栈,这样您就可以在顶部。这意味着堆栈会向下增长,直到它可能与堆上的对象相邻。
【讨论】:
【参考方案4】:在 C++ 中(适用于 C)stack.cc:
static int
find_stack_direction ()
static char *addr = 0;
auto char dummy;
if (addr == 0)
addr = &dummy;
return find_stack_direction ();
else
return ((&dummy > addr) ? 1 : -1);
【讨论】:
哇,好久没看到“auto”关键字了。 (&dummy > addr) 未定义。仅当两个指针指向同一个数组或结构时,才定义将两个指针提供给关系运算符的结果。 试图调查你自己的堆栈的布局——C/C++ 根本没有指定的东西——一开始是“不可移植的”,所以我不会真正关心这一点。不过,看起来这个功能只能正常工作一次。 没有必要为此使用static
。相反,您可以将地址作为参数传递给递归调用。
另外,通过使用static
,如果您多次调用此函数,后续调用可能会失败...【参考方案5】:
向下增长的优势在于,在旧系统中,堆栈通常位于内存的顶部。程序通常从底部开始填充内存,因此这种内存管理最大限度地减少了测量堆栈底部并将其放置在合理位置的需要。
【讨论】:
不是“优势”,真的是重言式。 不是重言式。正如@valenok 指出的那样,关键是要有两个不断增长的内存区域不会相互干扰(除非内存已满)。【参考方案6】:在 MIPS 和许多现代 RISC architectures(如 PowerPC、RISC-V、SPARC...)中,没有 push
和 pop
指令。这些操作是通过手动调整堆栈指针显式完成的,然后相对于调整后的指针加载/存储值。所有寄存器(除了零寄存器)都是通用的,所以理论上任何寄存器都可以是堆栈指针,堆栈可以在程序员想要的任何方向增长
也就是说,在大多数架构上,堆栈通常会向下增长,这可能是为了避免堆栈和程序数据或堆数据增长并相互冲突的情况。还有sh-'s answer提到的重要寻址原因。一些例子:MIPS ABI 向下增长并使用$29
(A.K.A $sp
) 作为堆栈指针,RISC-V ABI 也向下增长并使用 x2 作为堆栈指针
在 Intel 8051 中,堆栈变大了,可能是因为内存空间太小(原始版本为 128 字节)以至于没有堆,并且您不需要将堆栈放在顶部以便将其与从底部增长的堆
您可以在https://en.wikipedia.org/wiki/Calling_convention中找到有关各种架构中堆栈使用的更多信息
另见
Why does the stack grow downward? What are the advantages to having the stack grow downward? Why do stacks typically grow downwards? Does stack grow upward or downward?【讨论】:
【参考方案7】:在大多数系统上,堆栈会增长,我在https://gist.github.com/cpq/8598782 的文章解释了它增长的原因。很简单:如何在一块固定的内存中布局两个不断增长的内存块(堆和栈)?最好的解决办法是把它们放在相反的两端,让它们相互生长。
【讨论】:
那个要点现在似乎已经死了:( @Ven - 我可以搞定【参考方案8】:这个宏应该在没有 UB 的情况下在运行时检测到它:
#define stk_grows_up_eh() stk_grows_up__(&(char)0)
_Bool stk_grows_up__(char *ParentsLocal);
__attribute((__noinline__))
_Bool stk_grows_up__(char *ParentsLocal)
return (uintptr_t)ParentsLocal < (uintptr_t)&ParentsLocal;
【讨论】:
【参考方案9】:只是对其他答案的一个小补充,据我所知,这还没有涉及到这一点:
堆栈向下增长使堆栈内的所有地址相对于堆栈指针都有一个正偏移。不需要负偏移,因为它们只会指向未使用的堆栈空间。当处理器支持堆栈指针相对寻址时,这会简化对堆栈位置的访问。
许多处理器的指令允许使用相对于某个寄存器的仅正偏移量进行访问。其中包括许多现代建筑,以及一些古老的建筑。例如,ARM Thumb ABI 为堆栈指针相关的访问提供了在单个 16 位指令字中编码的正偏移量。
如果堆栈向上增长,所有相对于堆栈指针的有用偏移量都将为负数,这不太直观且不太方便。它也与寄存器相对寻址的其他应用程序不一致,例如访问结构体的字段。
【讨论】:
以上是关于linux的发展史是啥?的主要内容,如果未能解决你的问题,请参考以下文章