自由软件社区是一个充满自由和梦想的地方,在10余年的时间里它创造了一个又一个奇迹。然而,这些奇迹的创造者不只是Stallman,也不只是Linus Torvalds,而是活跃在世界各地的不计其数的开发人员。 在使用各种功能强大的自由软件时,我总会对其开发者充满崇敬之情,期盼有朝一日自己也能成为他们中的一员。很多对自由社区充满向往之情的人,虽然也想努力融身于其中,但又不知该怎么做。那么,就请与我们一起从编写一个简单的操作系统开始吧! 我们要做的事情 有人可能担心自己既没有学过计算机原理,也没有学过操作系统原理,更不懂汇编语言,对C语言也一知半解,能写操作系统吗?答案是没问题。我将带大家一步一步完成自己的操作系统。当然如果学一学上述内容再好不过。 首先要明确处理器(也就是CPU)控制着计算机。对PC而言,启动的时候,CPU都处在实模式状态,相当于只是一个Intel 8086处理器。也就是说,即使你现在拥有一个奔腾处理器,它的功能也只能是8086级别。从这一点上来讲,可以使用一些软件把处理器转换到著名的保护模式。只有这样,我们才可以充分利用处理器的强大功能。 编写操作系统开始是对BIOS控制,取出存储在ROM里的程序。BIOS是用来执行POST(Power On Self Test,自检)的。自检是检查计算机的完整性(比如外设是否工作正常、键盘是否连接等)。这一切完成以后,你就会听到PC喇叭发出一声清脆的响声。如果一切正常,BIOS就会选择一个启动设备,并且读取该设备的第一扇区(即启动扇区),然后控制过程就会转移到指定位置。启动设备可能是一个软盘、光盘、硬盘,或者其它所选择的设备。在此我们把软盘作为启动设备。如果我们已经在软盘的启动扇区里写了一些代码,这时它就被执行。因此,我们的目的很明确,就是往软盘的启动扇区写一些程序。 首先使用8086汇编来写一个小程序,然后将其拷贝至软盘的启动扇区。为了实现拷贝,要写一个C程序。最后,使用软盘启动计算机。 需要的工具 ● as86:这是一个汇编程序,它负责把写的代码转换成目标文件。 ● ld86:这是一个连接器,as86产生的目标代码由它来转换成真正的机器语言。机器语言是8086能够解读的形式。 ● GCC:著名的C编程器。因为我们需要写一个C程序将自己的OS转移到软盘中。 ● 一张空软盘:它用于存储编写的操作系统,也是启动设备。 ● 一台装有Linux的计算机:这台机器可以很旧,386、486都可以。 在大部分标准Linux发行版中都会带有as86和ld86。在我使用的Red Hat 7.3中就包含有这两个工具,并且在默认的情况下,它已经安装在机器里。如果使用的Linux没有这两个工具,可以从网上下载(http://www.cix.co.uk/~mayday/),这两个工具都包含在一个名为bin86的软件包中。此外,有关的文档也可以在网上获得(www.linux.org/docs/ldp/howto/Assembly-HOWTO/as86.html)。 开始工作 使用一个你喜欢的编辑器输入以下内容: entry start start: mov ax,#0xb800 mov es,ax seg es mov [0],#0x41 seg es mov [1],#0x1f loop1: jmp loop1 这是as86可以读懂的一段汇编程序。第一个句子指明了程序的入口点,声明整个过程从start处开始。第二行指明了start的位置,说明整个程序要从start处开始执行。0xb800是显存的开始地址。#表明其后是一个立即数。执行语句: mov ax,#oxb800 ax寄存器的值就变为0xb800,这就是显存的地址。下面再将这个值移至es寄存器,es是附加段寄存器。请记住8086有一个分段的体系结构。它的各段寄存器为代码段、数据段、堆栈段和附加段,对应的寄存器名称分别为cs、ds、ss和es。事实上,我们把显存地址送入了附加段,因此,任何送入附加段的东西都会被送到显存中。 要在屏幕上显示字符,就需要向显存中写两个字节。前一个是所要显示字符的ASCⅡ值,第二个字节表示该字符的属性。属性包括字符的前景色、背景色及是否闪烁等等。seg es指明下一个将要执行的指令是指向es段的。所以,我们把值0x41(在ASCⅡ中表示的字符是A)送到显存的第一个字节中。接下来要把字符的属性送到下一个字节当中。在此输入的是0x1f,该属性指的是在蓝色背景下显示白色的字符。因此,如果执行这个程序,就可以在屏幕上得到显示在蓝底上的一个白色的A。接着是一个循环。因为在执行完显示字符的任务后,要么让程序结束,要么使用一个循环使其永远运行下去。把该文件命名为boot.s,然后存盘。 此处显存的概念说得不是很清楚,有必要进一步解释一下。假设屏幕由80列×25行组成,那么第一行就需要160字节,其中一个字节用于表示字符,另外一个字节用于表示字符的属性。如果要在第三行显示某一字符的话,就要跳过显存的第0和1字节(它们是用于显示第1列的),第2和3字节(它们是用于显示第2列的),然后把需要显示字符的ASCⅡ码值入第4字节,把字符的属性写入第5字节。 把程序写至启动扇区 下面写一个C程序,把我的操作系统写入软盘第一扇区。程序内容如下: #include <sys/types.h> /* unistd.h 需要这个文件 */ #include <unistd.h> /* 包含有read和write函数 */ #include <fcntl.h> int main() { char boot_buf[512]; int floppy_desc, file_desc; file_desc = open("./boot", O_RDONLY); read(file_desc, boot_buf, 510); close(file_desc); boot_buf[510] = 0x55; boot_buf[511] = 0xaa; floppy_desc = open("/dev/fd0", O_RDWR); lseek(floppy_desc, 0, SEEK_CUR); write(floppy_desc, boot_buf, 512); close(floppy_desc); } 首先,以只读模式打开boot文件,然后在打开文件时把文件描述符复制到file_desc变量中。从文件中读取510个字符,或者读取直到文件结束。在本例中由于文件很小,所以是读取至文件结束。然后关闭文件。 最后4行代码打开软盘驱动设备(一般来说是/dev/fd0)。使用lseek找到文件开始处,然后从缓冲中向软盘写512个字节。 在read、write、open和lseek的帮助页中,可以看到与函数所有有关的参数及其使用方法。程序中有两行比较难懂: boot_buf[510] = 0x55; boot_buf[511] = 0xaa; 该信息是用于BIOS的,如果它识别出该设备是一个可启动的设备,那么在第510和511的位置,该值就应该是0x55和0xaa。程序会把文件boot读至名为boot_buf的缓冲中。它要求改变第510和第511字节,然后把boot_buf写至软盘之上。如果执行代码,软盘上的前512字节就包含了启动代码。最后,把文件存为write.c。 编译运行 使用下面的命令把文件变为可执行文件: as86 boot.s -o boot.o ld86 -d boot.o -o boot cc write.c -o write 首先将boot.s文件编译成目标文件boot.o,然后将该文件连接成最终的boot文件。最后C程序编译成可执行的write文件。 插入一个空白软盘,运行以下程序: ./write 重新启动电脑,进行BIOS的界面设置,并且把软盘设为第一个启动的设备。然后插入软盘,电脑从软盘上启动。 启动完成后,在屏幕上可以看到一个字母A(蓝底白字),启动速度很快,几乎是在瞬间完成。这就意味着系统已经从我们制作的软盘上启动了,并且执行了刚才写入启动扇区的程序。现在,它正处在一个无限循环的状态。所以,如果想进入Linux,必需拿掉软盘,并且重启机器。 至此,这个操作系统就算完成了,虽然它没有实现什么功能,但是它已经可以启动机器了。 下一期我将在这个启动扇区程序里加入一些代码,使它可以做一些比较复杂的事情(比如使用BIOS中断、保护模式切换等等)。
|
相关推荐
首先我们先进行需求分析:我们到 自己动手写Web自动化测试框架6-自动化测试框架的规划 软件测试 自己动手写Web自动化测试框架6-自动化测试框架的规划 转贴:生生不息bloghttp://www.colblog.net 从今天开始,...
《动易系统的论坛转贴工具详解与应用》 在互联网信息交流日益频繁的今天,论坛作为用户互动的重要平台,其内容分享与传播的作用不容忽视。动易系统的论坛转贴工具,便是为了解决用户在论坛间便捷分享内容而设计的一...
【凹丫丫ASP.NET新闻系统学习(转贴)】是一个基于Visual Studio 2005(VS2005)和SQL Server 2005的教程资源,旨在帮助开发者学习如何构建一个基本的新闻信息发布系统。这个系统可能涵盖了新闻的添加、编辑、删除...
4. **界面设计**:在用户界面方面,需要设计友好的操作界面,让用户可以方便地选择要转发的帖子,并添加自己的评论或者设置转发参数。 5. **多线程处理**:为了提高用户体验,转贴操作可能会在后台线程中执行,这样...
这可能意味着文件包含了多个转贴的帖子,每个帖子可能有自己的元数据,如作者、发表时间、类别、回复数量等。 【压缩包子文件的文件名称列表】:虽然没有给出具体的子文件名称,但通常一个动网论坛的备份可能会包含...
标题中的“动易系统的论坛转贴工具 -ASP源码.zip”揭示了这是一个基于ASP(Active Server Pages)编程语言开发的论坛转贴工具的源代码。ASP是微软公司推出的一种服务器端脚本环境,用于创建动态交互式网页。这个工具...
在“导电泡棉转贴装置”这个特定的场景下,我们可能是在讨论一种用于电子政务设备或系统中的特殊组件。 导电泡棉是一种具有导电性能的泡沫材料,通常用于电子设备的屏蔽、接地或防静电保护。在电子政务设备中,这种...
11. **桌面窗口**和**窗口句柄**:桌面窗口通常是指用户交互的主窗口,窗口句柄是操作系统用来标识窗口的标识。在易语言中,可以通过句柄来操作窗口,如改变窗口大小、位置或者发送消息。 12. **取窗口标题长度**和...
"转贴"功能则意味着程序能够抓取或导入动网论坛上的帖子,将其复制到其他论坛或者系统中,这样的功能对于数据迁移、论坛备份或者多平台同步有重要作用。 在深入这个主题之前,我们需要了解易语言的一些基本概念: 1...
由于现在流行的转贴工具都是基于浏览器的,转换速度比较慢,还得打开浏览器才能使用(同时受到浏览器版本限制)。 <br> 而这个小程序则完全不依赖于浏览器,以BFC采集器的UBB转换模块为基础,转换速度超快,...
总的来说,实现jQuery的转贴功能需要对DOM操作、事件处理、Ajax请求以及不同社交网络的API有深入理解。通过合理地组织代码和利用jQuery的功能,可以创建一个高效且易于维护的分享系统,提升网站的互动性和用户参与度...
去除Html中的干扰码等(样例中以轻之国度的干扰码为例) 配置文件语法: 方法类型(整数) 最大匹配长度(整数) 字符串1(删除开头) 字符串2(删除结尾) 方法类型: 1:删除单行 2:删除行与行之间的
东度极品论坛转贴工具东度极品论坛转贴工具
在“动网转贴”项目中,用户可能可以通过界面浏览帖子,搜索特定内容,甚至进行简单的互动操作。 作为学习和参考的实例,这个项目能帮助你掌握易语言的基本语法和编程技巧,了解网络编程的基本流程,以及如何设计和...
做任何事,首要端正思想。才能坚持,才能不懈,才能有方向有目标。
系统中,以及如何操作转贴功能。这些步骤可能包括上传文件、在后台管理界面激活插件、设置转换规则等。在实际应用中,确保遵循文档中的步骤,以避免任何潜在的问题。 "ConvertX" 文件可能是插件的主要执行文件或...
标题中的“windows 下的grep,转贴”表明我们要讨论的是如何在Windows操作系统中使用grep命令,这个命令通常在Unix或Linux环境中用于搜索文本文件中的特定模式。在Windows中,由于默认命令行环境(CMD)不支持grep,...
在生产过程中,首先需要将FPC精确对位,然后通过专用设备或手工操作将胶纸贴附在FPC上。这个过程要求高精度,以确保FPC的各个焊盘与设备上的连接器对应无误。转贴组件可能包含有定位工具、压合装置等,以保证在贴合...
7. **安装操作系统**:在格式化后的RAID5卷上安装操作系统,确保操作系统支持硬件RAID。 8. **监控和维护**:配置完成后,定期通过ACU检查阵列的健康状况,及时更换故障硬盘以避免数据丢失。 在实际应用中,RAID5...