当前位置: 技术问答>linux和unix
又是2个弱弱的问题:)
来源: 互联网 发布时间:2015-11-10
本文导语: 弱弱问题集: 1, 操作系统是祼机上的第一个程序,它本身也是个很庞大复杂的程序,是个程序就要编译,链接,而编译,链接,又是个程序。到底最初的不需要编译,链接就能执行的程序是什么?linux大多数源码最...
弱弱问题集:
1,
操作系统是祼机上的第一个程序,它本身也是个很庞大复杂的程序,是个程序就要编译,链接,而编译,链接,又是个程序。到底最初的不需要编译,链接就能执行的程序是什么?linux大多数源码最低也就低到汇编,汇编不是机器码,应该也需要程序将它翻译成机器码,C语言就更不用说了。
谁能告诉我,假设我只有一堆硬件,其它的什么也没有,按一张图纸连接好线路,组装成了一个PC,现在我要给它编一个操作系统,让它动起来,我都需要有步骤,有次序的做些什么?(注明,我并不是很有野心的要写操作系统,我只是想了解这个过程)
2,
为什么最适合编写操作系统的语言是C?书上说,“因为C语言编写操作系统的最大优点是具有很高的可移植性,因为C语言是和机器无关的,而汇编语言是和具体的硬件环境相关的。”但是C语言和机器无关是通过不同操作系统下的GNU C/C++编译器实现的。也就是说C语言是个规范,不同操作系统编译C程序是针对不同机器的,也就是说硬件相关性被操作系统及其C编译器透明化了。 现在有了Java,为什么不用java写操作系统呢?为什么java不是最适合写操作系统的语言呢?java上虚拟机能做到的。
如果程序的编译,链接是操作系统之下,裸机之上的程序,我觉得java才是最适合编写操作系统的语言
1,
操作系统是祼机上的第一个程序,它本身也是个很庞大复杂的程序,是个程序就要编译,链接,而编译,链接,又是个程序。到底最初的不需要编译,链接就能执行的程序是什么?linux大多数源码最低也就低到汇编,汇编不是机器码,应该也需要程序将它翻译成机器码,C语言就更不用说了。
谁能告诉我,假设我只有一堆硬件,其它的什么也没有,按一张图纸连接好线路,组装成了一个PC,现在我要给它编一个操作系统,让它动起来,我都需要有步骤,有次序的做些什么?(注明,我并不是很有野心的要写操作系统,我只是想了解这个过程)
2,
为什么最适合编写操作系统的语言是C?书上说,“因为C语言编写操作系统的最大优点是具有很高的可移植性,因为C语言是和机器无关的,而汇编语言是和具体的硬件环境相关的。”但是C语言和机器无关是通过不同操作系统下的GNU C/C++编译器实现的。也就是说C语言是个规范,不同操作系统编译C程序是针对不同机器的,也就是说硬件相关性被操作系统及其C编译器透明化了。 现在有了Java,为什么不用java写操作系统呢?为什么java不是最适合写操作系统的语言呢?java上虚拟机能做到的。
如果程序的编译,链接是操作系统之下,裸机之上的程序,我觉得java才是最适合编写操作系统的语言
|
PC机已经成了一个标准,这个标准决定了CPU首先执行的是BIOS程序,BIOS的入口地址(CPU第一条执行的指令)由硬件来决定的,一般这个BIOS程序是由主板厂商实现的,所以对于操作系统来说是透明的,而BIOS将对CPU的控制权交给操作系统的入口地址是一种规范,这个地址是不会改变的(这个地址就是存储器上的某个位置)!!!!
你可以将BIOS看作是一个简单的操作系统,它也有自己的中断处理与驱动,只是目前的BIOS没有多任务的功能,操作系统的最前面一段代码由汇编写成,而操作系统在这个时候却要访问硬件(需要用中断的方式),它自身此时却没有处理中断的能力,只有借助于BIOS了。操作系统中的驱动是比BIOS驱动更强的东东,它提供了更高级的功能,当你的应用程序需要访问硬件时,就需要借助于操作系统的驱动。当操作系统完全启动之后,早已把BIOS的那块程序复盖了,所以应用程序就再不能调用BIOS的功能了(当然最重要的是保护模式的原因)。BIOS是由什么语言来写并不重要,重要的是用什么语言来写最适合,由于现在的CPU在硬件上都不支持虑拟机,所以它只认机器码,那么无论你用C或是其它来写,必须最后生成机器码才行。当然,用汇编加C的方式是现在通用的做法
保拟模式与实模式相对应的,引入保护模式的最根本的原因是进行内存保护的需要,现代操作系统都是可以支持多任务的,如果一个进程可以任意访问其它进程的资源的话,那么岂不是在一个进程中可以为所欲为????一个进程死了之后,其它进程也要受到影响!!!为了避免这种情况的发生,就引入了保护模式。
在X86上,系统启动之后首先是在实模式下,而实模式下按16位寻址,这种情况主要是为了兼容,再者,进入保护模式前需要做一些准备工作的。
在保护模式下,CPU按32寻址,这样可以利用的内址空间可达4G,比16位的方式提高了可利用空间。在保护模式下可以利用MMU,CACHE等高级功能,这样就在性能上提高了,至于MMU,CACHE等功能你去看一下<<LINUX内核完全注释>>这本书,然后在网上查阅一下你就明白了,不是一下就能说清楚的。
你可以将BIOS看作是一个简单的操作系统,它也有自己的中断处理与驱动,只是目前的BIOS没有多任务的功能,操作系统的最前面一段代码由汇编写成,而操作系统在这个时候却要访问硬件(需要用中断的方式),它自身此时却没有处理中断的能力,只有借助于BIOS了。操作系统中的驱动是比BIOS驱动更强的东东,它提供了更高级的功能,当你的应用程序需要访问硬件时,就需要借助于操作系统的驱动。当操作系统完全启动之后,早已把BIOS的那块程序复盖了,所以应用程序就再不能调用BIOS的功能了(当然最重要的是保护模式的原因)。BIOS是由什么语言来写并不重要,重要的是用什么语言来写最适合,由于现在的CPU在硬件上都不支持虑拟机,所以它只认机器码,那么无论你用C或是其它来写,必须最后生成机器码才行。当然,用汇编加C的方式是现在通用的做法
保拟模式与实模式相对应的,引入保护模式的最根本的原因是进行内存保护的需要,现代操作系统都是可以支持多任务的,如果一个进程可以任意访问其它进程的资源的话,那么岂不是在一个进程中可以为所欲为????一个进程死了之后,其它进程也要受到影响!!!为了避免这种情况的发生,就引入了保护模式。
在X86上,系统启动之后首先是在实模式下,而实模式下按16位寻址,这种情况主要是为了兼容,再者,进入保护模式前需要做一些准备工作的。
在保护模式下,CPU按32寻址,这样可以利用的内址空间可达4G,比16位的方式提高了可利用空间。在保护模式下可以利用MMU,CACHE等高级功能,这样就在性能上提高了,至于MMU,CACHE等功能你去看一下<<LINUX内核完全注释>>这本书,然后在网上查阅一下你就明白了,不是一下就能说清楚的。
|
1.不需要编译与链连的可执行的程序就是机器码,但机器码也需要放在硬件上才能上电后运行,在计算机早期情况下,可能由手工的方法将机器码用打孔的方式放在了存储卡上,而硬件设置成从存储卡上读取数据并启动,这就是一个最简单的“操作系统”,然后可能用同一种方法来实现第一个“编译器”,之后就可以用这个操作系统与编译器来实现其它程序的编译连接,然后再升级自己的操作系统与编译器,这就是鸡与蛋的问题了
在现代这样发达的信息世界里,如果需要自己实现一个操作系统,那么你需要先在另一台有操作系统等丰富软件的机子上来开发,如果是同一种类型的CPU,那么就直接利用现有机子上的编译器与开发环境来开发就行了,如果不是同一类CPU,就需要交叉编译环境,这方面的东东比较复杂,你可以在网上找一下资料,有了操作系统之后,就需要开发一个在此操作系统上的编译器(也可以不用,示具体情况而定,说起来比较复杂的),然后就需要开发在此操作系统之上的应用程序了
在现代这样发达的信息世界里,如果需要自己实现一个操作系统,那么你需要先在另一台有操作系统等丰富软件的机子上来开发,如果是同一种类型的CPU,那么就直接利用现有机子上的编译器与开发环境来开发就行了,如果不是同一类CPU,就需要交叉编译环境,这方面的东东比较复杂,你可以在网上找一下资料,有了操作系统之后,就需要开发一个在此操作系统上的编译器(也可以不用,示具体情况而定,说起来比较复杂的),然后就需要开发在此操作系统之上的应用程序了
|
2.一台没有操作系统的机子,由硬件决定CPU从内存(或者其它存储器上)取第一台指令并执行,从此CPU的控制权就交给了那个第一条指令。。。。。。你的JAVA程序是一种需要用虚拟机来解释的,那么你的JAVA虚拟机如果可以用硬件来实现的话,那么你就可以直接用JAVA来写操作系统,如果没有这种硬件支持的话,你怎么让你的JAVA代码执行呢(CPU只认机器码)???JAVA虚拟机还不是用C来实现的啊,当然还一种办法,在硬件上用C写一个JAVA虚拟机,再在上面运行JAVA的操作系统,但JAVA执行效率并不高,操作系统对效率的要求却相对较高,所以一般都不用JAVA写操作系统。
C语言之所以最适合写操作系统,因为它灵活,高效,移植性好(各种平台下都有C编译器),年代久远(程序员基本上都是从C学起),而且操作系统基本都是用C来写的,这种广泛的支持下,还有其它语言在编写操作系统的必要吗?
C语言之所以最适合写操作系统,因为它灵活,高效,移植性好(各种平台下都有C编译器),年代久远(程序员基本上都是从C学起),而且操作系统基本都是用C来写的,这种广泛的支持下,还有其它语言在编写操作系统的必要吗?
|
对一个磁盘操作,有两种方式:其一是直接操作扇区,其二就是你所说的按一定的逻辑组织方式(就是所谓的文件系统)来操作。当操作系统还没有完全启动起来的时候(就是文件系统驱动还没有运行起来的时候),按第一种方法(就是你最先所说的调用BIOS驱动的方法),当操作系统正常运转之后,按第二种方法来操作硬盘(或者其它存储体)。
磁盘的主引导区是一种规范,这是约定好的,至于目录区与数据区那是人为的逻辑
磁盘的主引导区是一种规范,这是约定好的,至于目录区与数据区那是人为的逻辑
|
现在的编译器是操作系统之下的软件,汇编编译器最终同样是二进制码,现在的汇编编译器一般也都是由C写成的
GCC是编译工具,用它来编译LINUX源代码,然后再将编译后生成的文件存储在磁盘上,由这个磁盘来启动你的目标操作系统就行了,你可以在网上查找一下如何制作一个小型的LINUX操作系统的文章
java虚拟机是一个运行在操作系统上的软件,它本身也是可执行文件,在操作系统下,它的确需要调用到操作系统的API才行,但是你可以在嵌入式上做一个在硬件上可以直接运行的JAVA虚拟机,只不过这个虚拟机包含了操作系统的功能,它本身就是操作系统与虑拟机的结合体
现在好像没什么编译器把JAVA代码直接编译成机器语言的,都是生成了中间代码,由JAVA虚拟机来解释运行的,如果直接将JAVA代码编译成机器语言的话,就损失了JAVA本身所具的优势了
GCC是编译工具,用它来编译LINUX源代码,然后再将编译后生成的文件存储在磁盘上,由这个磁盘来启动你的目标操作系统就行了,你可以在网上查找一下如何制作一个小型的LINUX操作系统的文章
java虚拟机是一个运行在操作系统上的软件,它本身也是可执行文件,在操作系统下,它的确需要调用到操作系统的API才行,但是你可以在嵌入式上做一个在硬件上可以直接运行的JAVA虚拟机,只不过这个虚拟机包含了操作系统的功能,它本身就是操作系统与虑拟机的结合体
现在好像没什么编译器把JAVA代码直接编译成机器语言的,都是生成了中间代码,由JAVA虚拟机来解释运行的,如果直接将JAVA代码编译成机器语言的话,就损失了JAVA本身所具的优势了