1.22汇编语言编译器新贵,NASM
"新"是相对于旧来说的,老的汇编器MASM和TASM已经过时了,从名称上可以看出字母n是在m之后,其功能必然有所超越才会被大家接受。
请用一句话概括NASM优势在哪里?免费+语法简洁使人舒适+支持linux平台。这里所说的任何一个理由都是其它同类产品不具备的,敏锐的同学是不是察觉到了什么。。。哈哈,怎么给人的感觉是:其它编译器不是花钱就是语法怪异让人不爽,要么就不支持linux,看上去选择nasm是没得可选了?我就不自问自答了,反正NASM语法很接近咱们当初学的intel语法,我是用得很爽呢。这里就不再比较其优越性了,大家若感兴趣还是自行查阅吧。
同样是为了抒发一下对这位新贵的爱慕之情,简要的介绍还是要的:
NASM是一个为可移植性与模块化而设计的一个80x86的汇编器。它支持相当多的目标文件格式,包括Linux和'NetBSD/FreeBSD','a.out','ELF','COFF',微软16位的'OBJ'和'Win32'。它还可以输出纯二进制文件。它的语法设计得相当的简洁易懂,和Intel语法相似但更简单。它支持'Pentium','P6','MMX','3DNow!','SSE' and 'SSE2'指令集,
介绍完了之后,咱们讨论下为什么要用汇编语言开发系统呢?就目前来看,无论再怎么要求开发过程简单,也避免不了用汇编语言,尤其是开发操作系统这类底层软件。越底层的软件就越要与硬件直接打交道,这就要求在语言层面上给开发人员提供访问端口寄存器的方法。显然,目前的高级语言都做不到这一点,像C语言这类偏底层的语言都不支持修改寄存器,用汇编语言则是不可避免的事了。
包括我在内的很多同学一听要用汇编了,都有一种小小的恐惧感,认为这是一种不好掌握的东西(我没有称之为语言而是称之为东西,是因为曾经有个女同学都不知道汇编是什么),而且程序编写起来特别麻烦,要考虑的东西太多了,代码逻辑写起来不够直接,似乎总是在迂回…以至于我们经常被汇编语言“搞定”。我个人的感觉是,当我熟悉了汇编语言后,甚至觉得有一点亲切呢,当然了,任何陌生的事物经过熟悉的过程后都会变得有亲切感,关键是咱们得扛到对它熟悉为止,不能让心里的畏惧战胜自己。用汇编语言和cpu直接对话,想想就有点小兴奋呢。
不过好在我们需要用汇编的地方只是一些硬件访问、中断调用、端口读写、线程切换之类(怎么看上去好多…),我们可以写出一些通用的代码来减少汇编的枯燥。总之,只有不得不用时我们才会向汇编语言屈服(其实也没那么悲壮啦^_^)。
1.3操作系统的宿主环境。
操作系统虽然是软件,但其可不是一般的软件。我们平时写出来的程序都是基于操作系统之上,程序本身是由操作支持的,开发人员只要专注于自己这块业务逻辑就好了,很多复杂的问题是不需要开发人员考虑的。而操作系统这个软件靠谁来支持呢?是靠你自己…这是用一身老骨头扛出来的,现在明白为什么linux之父linus那么强壮了吧,不是谁都能随随便便成功的,所以,写操作系统那可是要有个好身板,要多锻炼身体才能熬得住,看完这章赶紧出去跑步吧^_^,玩笑玩笑。如果一般应用软件能称得上鱼香肉丝的话,那操作系统得相当于龙虾鲍鱼,这可是硬菜,不出去跑个几公里都啃不下来呢。哈哈,其实也没那么夸张,现在有很多计算机大牛写了好多开源软件帮助我们调试操作系统。话说,自从有了虚拟机,我再也用不着锻炼身体了,每次出现bug时不需要重启真机了,只需要重启虚拟机就好。
1.31什么是虚拟机
虚拟机在当今已经不是陌生的概念了,要是在几年前,我还得搬出个概念放在这给大家看看。个人觉得,要解释一个东西是什么,不如直接解释这个东西解决了哪些问题,这样大家自然就从本质上真正理解了它是什么。
没有虚拟机的时候,一台机器只有交给一个用户使用,而且一个人根本无法将这台机器的性能完全发挥出来,造成了极大的浪费不算,还有很多人正等着用呢。于是出现了虚拟机的需求:将一台物理机通过软件逻辑分割成几个虚拟的计算机,每个计算机之间互不干涉,即使一台虚拟计算机崩溃了也只是影响了它自身,不会让整个物理机瘫痪,安全可靠,可以自由测试而不必担心损伤物理机。这不仅在硬件投入上节省了大笔开销,还让更多的人同时使用了计算机资源。
现在很多厂商都在搞虚拟化,如域名的虚拟空间,还有如火如荼的阿里云、这是虚拟机的应用。虚拟机就是用软件来模拟硬件。虚拟机只是一个普通的进程,该进程模拟了硬件资源,在虚拟机中运行的程序其所做出的任何行为都先被虚拟机检查,由虚拟机分析后,代为向操作系统申请。
上面对虚拟机的解释是主观上的理解,我可不愿意说概念了,因为概念是对事物的抽象。抽象就意味着不易理解,容易把简单的事复杂化。我举个简单的例子来说明什么是虚拟机。
假设V是虚拟机进程,U是普通的用户程序。程序运行起来才叫进程,进程是要有pcb的,程序老实的放在磁盘上不动,那可不叫进程。虚拟机跑起来后,就形成了进程V,在它被调度期间,cpu执行的是此进程中的指令。让虚拟机执行U程序,有如解释器进程在解析脚本文件一样,此时的U程序是被当作参数传给了V程序,U程序就像文章一样由V进程阅读。还是拿解释型语言举例子,比如python语言,其脚本从来就没有直接作用于cpu上,而是其字节码交给了python解释器,这个解释器将通过python虚拟机来代为完成python脚本中的代码行为。
让我们说得再具体一点,比如在linux平台上,写了一个python脚本文件file.py,其中有这样一句代码:fh=open(“hello.txt”,'w'),这是在用可写的方式打开hello.txt文件,将其句柄返回给fh。自此操作文件句柄fh,便是操作了文件hello.txt。python虚拟机是一个进程,它是直接作用在硬件之上的。当它分析python脚本file.py中上面的那句代码时,发现有关键字open(当然关键字得是python解释器支持的,此解释器为它们而生才行),于是执行了open(“hello.txt”,'w')函数,其内部是封装的系统调用(系统调用这方面内容以后咱们在自己的系统中细说。),通过系统调用,python虚拟机替python脚本完成了打开hello.txt的工作。
选择虚拟机的一个原因;
它在宿主系统上只是一个进程,在宿主系统如linux眼里,它与一般的用户进程是没任何区别的。进程咱们都可以随意启动,虚拟机也是一样的,在这一点保证了使用上的方便性。
如果您有一般的软件开发经验,就会了解,很少有程序能一下就编译通过。当然,如果您的编程经验无比丰富,代码无比规范,无比了解编译器,确实不需要虚拟机来调试了,编写完成后直接就能运行。以上我用了三个“无比”,打造了似乎没有人能达到这种水平的假象,其实是有的。不知道大家听说过Jon Skeet大神没有,他是谷歌软件工程师,《c# In Depth》就是他的神来之笔。看看别人对他是怎样评价的,看完之后您就知道我说的并不夸张了:
“他并不需要调试器,只要他盯着代码看几眼,bug自己就跑出来了”。
“他根本不需要什么编程规范,他的代码就是规范”
还有还有,这个最威武霸气…
“如果他的代码没有通过编译,编译器厂商就会道歉”
为了表示对大神的崇拜,我刻意把上面空出一行。每次看到第三个评论,我的血液中就会流淌一些让我振奋的东西,我深知自己还差得很远,以至于每次贪睡的时候,心灵深处总会传来一句充满爱的关怀:还特么不起来看书。
如果咱们都不能保证写出这样质量出色的代码,咱们还是老老实实的装虚拟机吧(土豪随意)。因为如果要把操作系统装在真机器上,每次调试的时候,无论代码是否崩溃,都是要重启计算机的。为了保护咱们的爱机,虚拟机必装不可。不知道你们心疼电脑吗,反正我要是一天开电脑三次以上,我就会很自责,不知道这种性格和水瓶座有没有关系。
说了虚拟机的好处,那咱们有哪些虚拟机可用呢。一般的有qemu、bochs、virtualBox、xen和vmware等。
我们要用的就是bochs.选择bochs的理由如下:
对于虚拟机的选择,能工作能调试够用就行了,遇到问题时再寻求新方案也不迟,毕竟咱们的重点是后面的写操作系统,学太多的虚拟机也没啥用。
介绍一下bochs吧,怎么也得让大家有个初步的印象。下面的内容是我从维基百科翻译过来的,其实就是从繁体中文翻译成了简体中文^_^,而且只有几个繁体字,哈哈。
Bochs(发音:box)是一个以LGPL许可证发放的开放源代码的x86、x86-64IBM PC兼容机模拟器和调试工具。它支持处理器(包括保护模式),内存,硬盘,显示器,以太网,BIOS,IBM PC兼容机的常见硬件外设的仿真。
许多客户操作系统能通过该仿真器运行,包括DOS,Microsoft Windows的一些版本,AmigaOS 4,BSD,Linux,MorphOS,Xenix和Rhapsody (Mac OS X的前身)。Bochs能在许多主机操作系统运行,例如Windows、Windows Mobile、 Linux、Mac OS X、iOS和PlayStation 2。
Bochs主要用于操作系统开发(当一个模拟操作系统崩溃,它不崩溃主机操作系统,所以可以调试仿真操作系统)和在主机操作系统运行其他来宾操作系统。它也可以用来运行不兼容的旧的软件(如电脑游戏)。
它的优点在于能够模拟跟主机不同的机种,例如在Sparc系统里模拟x86,但缺点是它的速度却慢得多。
介绍完了,不知道您看了吗,不看也行,反正以后咱们实际应用时还会细说的。