1. 编写一个操作系统,应该先编写一个编译器那编译器是用机器码写的吗
你可以用C或者汇编 编写内核 内核出来了以后 你用任何语言编写GUI都不是问题
2. 操作系统的代码是由谁编译的,执行的
操作系统的代码也是用某种语言写和程序,所以由对应语言的编译器编译(如果是汇编语言程序,就由汇编程序进行汇编),执行当然是由CPU来做了!
3. UNIX操作系统是怎么被编译的
unix下一般用gcc编译C语言,g++编译c++
编译其实是四个过程:预处理、编译、汇编、链接
由gcc这个程序执行。
gcc只是个程序,程序也就是一堆二进制码构成的东西罢了!
写个字符串变成二进制码的程序不冲突呀!
4. 普及知识!跪求答案! 操作系统是怎么开发、编译(怎么编译的)并且运行在设备上(这个问题的意思是
就我知道的向你说一说:
1,操作系统用的是c语言开发的:
但这c语言和普通的c语言是有区别的,不能使用库函数。
这个c语言的编译器也和普通的编译器有区别的。《30天自制操作系统》-用的是开源的c编译器并且经过修改的。
2,第一扇区的bootstrap
bootloader或者说bootlstrap是用汇编语言写的
但是这个汇编器和拿来开发应用程序也是有区别的,
就拿汇编中的伪指令org和p应用程序的汇编编译器是无法达到想要的目的的。
如果第一扇区是启动分区,那么对应的最后两个字节为511-0x55AA
bootloader开始就是一条跳转指令0xeb开头的后面是偏移量,紧接着就是这个媒介的配置信息
,紧接着才是我们要写的16bit的汇编语言。
这里要做的事就是:
读取硬盘上的数据放到内存中准备运行,保存配置数据,由16bit实地址模式切换到32模式。。。
本人原来照葫芦画瓢画过。
但是切换到32bit下要用到内存保护机制,内存映射机制,虚拟内存机制。。。这些和计算机硬件的密切相关。无奈本人了解的计算机硬件一般都是十六位的,而且大多与概念相关。
而且对于的intel指令手册都是英文的,总而言之能力有限无法进行下去。
如果要开发操作系统,以我看:
计算机组成原理特别是32bit下的内存映射保护相关内容必须知道
汇编和c语言那时必须的会
耐心时间
推荐书籍《30天自制操作系统》
通过开发操作系统可以加深 汇编与计算机硬部件 汇编和c语言 相关连的理解。
如果你想试一试可以在虚拟机下玩一玩。
——以上内容仅供参考——
5. 世界上第一个操作系统是如何编写的
人家就问第一个操作系统是怎么做出来的,楼下一堆人都没说到点子上。
这个问题就像是没有生产机器,那第一台机器是怎么生产出来的。
第一台计算机,或者称之为打孔计算机,破译机。它的作用就是读0和1的不同排列组合,通过这些组合来解译不同的意思。比如 0010代表什么意思,1101代表什么意思。这些是一开始就设定好了的,就像是中国古代的算盘一样,上面的算子代表5,下面的算子代表1是一个道理。
好了,开始就设定好这个解码功能后,这台破译机就可以读信息了,它通过什么读呢?那时候没有数据,没有数字信号,只有模拟信号,它们就读打孔纸。就是在纸上写,然后打出一个一个孔,像卡纸一样。设备就读这个孔的排列,根据不同的排列去找这个排列代表了什么,然后给出答案。这就是最初的计算机原理,非常简单,它就是一个密码解释器,或者说是简单的编译器。
那时候就是用来算加减法等一些计算,它就是一个大型的计算器。
后来发展的复杂一些了,也就是增加了更多的0和1的组合来丰富机器的解释库,来计算更复杂的公式。
这时候你要问了,这些0和1的解释库是存在哪里的?这就是为什么以前的计算机房间那么大个。它们是通过电子管的开和关来代表了0和1,通过电路给电子管通电,比如说那张纸打的孔,有一个像探头一样的东西,探测到那里有一个孔,或者没有孔,就给出电信号来控制不同的电子管组合的通路和断路,最后给出结果。
比如我用纸戳一个1+1=?,我就戳一个(0000 0000 0000 0001)代表1(00001 001000 ....)代表+ (0000 0000 0000 0001)代表1,然后给机器读,机器读出来后,就会根据电子管的通断组合,最后将结果反馈回来。一开始是用亮了多少盏灯来表示计算结果,有了显示器后,才把它变成了显示画面。
显示画面其实也是有一个库的,比如0001,你就给我显示1,00010,你就给我显示2,它会找对应的库,这个库一开始就用不同的电路
搭建做好,无非就是不同的电路通断,电压,电流等各种奇怪的组合来完成 。它自身有一套神奇的检测机制,这个就不说了,我也说不清楚。
那么回到最开始的问题,世界上第一个操作系统是怎么出现的?就是用手在纸上写出来的。
一开始不能算是系统,比如我要算一个公式,a /b +1+a+5*b,举个例子,这个公式我要经常用,我不可能每次都要去戳很多纸,所以我只需要先做一个模板,然后留出一个空白,需要的时候,把a和b戳出来就可以了,这样就很方便了。
后来这些公式越来越复杂,甚至是出现了不同的计算,比如说, 如果a<100,那么就执行xxxx,如果a>100,就执行xxxx。然后这个模板就越做越大,需要戳的纸也越来越长。
好家伙,后来实在戳不过来了,十个手指都戳破了,甚至计算机也运行不过来了,更复杂的运算根本做不了。不行,不能这样下去了。
后来就开始有人研究了,电子技术的发展越来越高科技,电子管也做得越来越小,最后用集成电路来控制开关,但是其实原理都是一样的。可以运算的公式和能力也越来越强。其实还是不同的电子管组合成不同的开关,你以为这个组合就是几个电子组的组合吗?不,已经达到上亿,上千亿个电子管的组合了,这也是集成电路的优势。
一开始是用纸来保存信息,但是前面说了,纸已经不够用了,就开始出现了软盘,光盘。光盘上的凹凸点,代表了0和1,其实就是存储的介质发生了变化,后面发明了磁盘,发明了光盘,甚至是软盘、机械硬盘,SSD等不同的储存介质,这些其实就是保存的方式不同而已,其实它们保存的数据还是和打孔纸一样,就是0和1的数据,只是相比纸而言,保存得更多,更方便,也更容易被机器读取。
这时候保存的介质发生了变化 ,那么读取这些数据的那个探头也发生了变化,变成了像软盘的磁头,光盘的激光头等。
当这种保存的介质从纸变成了硬盘后,就会出现一个问题,一开始写这些孔的时候,是用笔和给纸戳一个窟窿来让机器识别,现在要怎么把0和1这种数据写到磁盘里呢?这里就发明了键盘了,最初的键盘当然和现在不一样,但是原理是一样的。还是按一个键,给一个电信号,磁头收到了电信号,会判断是0还是1,如果是0,就是反磁,如果是1就是正磁。一开始的键盘,就是只有几个键,1键和0键。
后来有人觉得整天打0和1太麻烦了,如果我要打a这个符号,我就要按(0000000000000000),按这么多下,我的手都要变成一指禅了,于是就发明更复杂的键盘,比如我要打a,b,c,d,我就一开始就设定好,我打a,就直接发送一串机器码(0000000000000000),我要打b就发送一串机器码(0000000000000001),类似这样的。其实也是给键盘做好一个约定,我一开始就把一些特定的,经常使用到的符号或其他有代表性的字母、数字,把它们对应的0和1组合的机器码先做成一个表格,存到键盘的识别库里,我按哪一个字符,你就给我发送哪一个字符对应的机器码就可以了,这样我就不用从早到晚按0和1这两个键,按个没完。这么一设定,我就不用记太多的机器码组合了,一开始就把这些组合给分门别类。
这样发展到这里,键盘的雏形就出来了,也为汇编的发展埋下了伏笔。汇编其实就是最接近或者它就是机器码的一种组合语言,机器是可以直接识别出来。
前面说了,为了执行不同的公式和复杂的计算,就出现了这同的模板,只需要修改模板上的参数,就可以重复执行这些模板。
现在这些板从纸上存到了软盘上,现在就更方便了。以前用纸的时候,用过一次,纸就没用了,现在软盘上的数据一直在,我只需要用磁头把原来填的数据擦掉,重新写个新的参数就可以了。你可以理解成当时在纸上我用铅笔写参数,用过一次,用橡皮擦给擦掉重复写。但是纸是需要打孔的,打了孔,橡破擦也没用,已经是一个孔了,你也补不上,所以那纸就废掉了。
但是软盘不一样,软盘是可以重复写的。可以把磁消掉重新在那个位置写一个新的参数,这样就可以重复利用了。
后来这些模板越做越复杂,最后慢慢的发展成了一个小型的,有自己一些独立功能的计算系统,这可以理解为,它有了系统的一些特性,但是还不算系统。
后来这些模板更强大了,有人觉得,因为需要更加强大的功能,一般的模板已经没办法满足了,而且通过这种最原始的abcd来拼凑这些公式、模板,太累了。于是就有人开始写中间解释器。
怎么理解呢?前面说了,一开始大家都是写1和0组合,觉得太累了,于是把1和0的不同组合做成了一个库,我只需要输入1+1,abcd这种键盘上约定好的字母,键盘就发送对应的1和0组合给机器,机器就可以直接识别了。
现在需求越来越复杂,发现光打这些abcd,需要打越来越多的代码,发现和之前打1和0一样累了,怎么办呢?于是就有人打算再创一个中间库,把这些abcd,1,2,3等组合做成一个库,不同的组合代码不同的意思,这就是从机器向交互语言的发展了初期了。
这个库一开始还是用abcd等最初的那个键盘库打上去的,当然做的也很累,但是只要这个库完善好了,后面要继续发展更高级的交互语言就简单多了,以后所有交互语言写出来的东西,都通过这个库翻译成机器语言库,机器语言库就可以识别了。
于是有了交互语言库,大家就不用打太多的字符来拼凑成不同的模板了,因为交互语言库有了不同的单词组合成更加有意义符号,人一看就懂,不需要那些零零散散的字母,没有任何意义在里面,还需要死记硬背。
这就有点像是古代的文言文,你一听不知道他在说什么,然后去查一下文言文字典,这样你才能知道他在说什么。
现在你可以用白话言语来交流了,这样就更轻松了,你可以直接和他对话。
至于机器听不听的懂你说的意思,这个不要紧,有解释库,你把解释库做好了,你说的每一句话会自动翻译成机器语言,就可以了。
随着语言的越来越强大,现在就可以写出更加复杂的模板了,后来显示器的发展越来越强大,让这些模板出现了更丰富的画面,其实它显示什么东西,也还是会有一个库的,只要约定好,我返回的这串代码代表了什么东西,你就显示什么东西就可以了。甚至后来有了图片。
其实图片的显示也有自己的一个约定,就是我返回什么代码,你就解析成什么颜色点,然后不同的代码组合,就会现出一大串的颜色点组合在一起,就变成了有颜色的图片和画面。其实文字也是图片的一种,就是一种图信号。
回到模板上来,后来慢慢的,这些模板越来越强大,甚至有人开始动起心思,开始给这些模板加皮肤,加各种好看或者神奇的功能,让它更加好用,于是最初始的系统就这么慢慢的发展起来了。
其实系统它不是突然就有的,是在整个机器的发展的过程中,慢慢的累积到一定程度后,顺应发展而来的。
这些模板也是从最简单的公式模板慢慢发展成了现在有了自己的界面,有了自己的独立运算功能和各种娱乐功能等强大的系统。
最初的系统,也就是这些模板的诞生,其实是很辛苦的,它们需要有一定的积累,一些基础的识别库的完善,这些都是需要最初的那代人,一开始就约定好,然后慢慢地完善起来,然后高级的语言和系统才能通过这些库来和机器交流。
6. 不同的操作系统如何编译一段软件的代码
首先,准备好命令行和编辑器。针对主流操作系统分别做简单的解释:Linux:已经具备了命令行和一个叫GCC 的编辑器。在命令行中输入gcc ,如果“command not found”,那么请安装GCC。Mac OS X:命令行是Terminal,位于Applications/Utilities。你需要下载XCode ,它包含Apple的编辑器。Windows:微软在免费下载的Visual Studio Express中提供了编辑器,但是Cygwin 界面更友好。安装中要注意的是:要选择“Devel”部分中所有的安装包。下载:基本上所有的源数据包都有.tgz或者.tar.gz的后缀,有文件名和版本号,比如example-3.2.8.tar.gz。建立一个名为“source”或者“build”的目录,下载并放在该目录中。解压缩:从命令行进入工作目录(用cd命令):cd source 最快的方法是:tar -xzvf example-3.2.8.tar.gz这会将所有的源代码解压到一个新的子目录中,而且文件名跟应用是一样的。进入目录只需要敲:cd example-3.2.8读文档:在代码的文件包中会有像README 和INSTALL之类的文件,一定要读。你也可以使用less 命令在命令行中读取:less INSTALL 或者直接用合适的格式打开它们,它们会告诉你要安装哪些包、安装指南、注意问题等。Building:虽然各有不同,但大抵方法如下:输入:./configure 运行配置工具会告诉你缺少哪些软件和重要的文件的位置。有时候你需要自己指明特定文件在你计算机上的位置,比如:./configure --ssl-dir=/usr/local/include Configuration 过程要用几分钟,当它完毕的时候,你就可以编译了。如果出现错误,参考下面的Troubleshooting。编译请输入:make一切顺利就开始编译了。编译会占用一段时间而且当运行时会占用你电脑的所有进程。不要担心,当编译结束的时候,如果你仍然没有看到已错误,那你已经搞定了。剩下要做的只是将不同的文件放到文件系统中:make installTroubleshooting: 如果以上的步骤有遇到错误,有方法让你知道问题所在。确认你是否严格地按要求执行以上步骤。【
7. 操作系统的源代码指的是什么
操作系统的源代码是组成操作系统的所有源程序集,一般是汇编或C等语言编写而成,至于与计算机硬件打交道。一旦公开源代码,将意味着版权的丧失。
源代码经过编译后生产可执行文件、动态连接库、资源等文件,这样就实现了对操作系统内部算法和技术细节的封装,从而达到“不可见”的目的。