导航:首页 > 操作系统 > as86linux

as86linux

发布时间:2022-10-18 19:54:36

A. 有什么软件能起到引导盘的作用

首先要明确处理器(也就是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 /* unistd.h 需要这个文件 */
#include /* 包含有read和write函数 */
#include
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,必需拿掉软盘,并且重启机器。

至此,这个操作系统就算完成了,虽然它没有实现什么功能,但是它已经可以启动机器了。

B. 鸿蒙系统当时在编译的时候用的是什么编程语言

根据华为公布的方舟编译器资料 可以推测鸿蒙系统是用C、C++语言编写

如何看待华为鸿蒙系统的开发?


可以预见的鸿蒙系统。


1、除华为外其他国产手机公司不会安装或重视。由于google禁售的是华为,对于小米等其他国产手机公司不禁售,因此小米等其他国产公司不会安装鸿蒙系统,即便出于公共形象的压力而安装,也不会真正重视,最多就是做个样子。


反正,内斗内行吧——除非华为让渡鸿蒙系统的控制权!


2、鸿蒙系统即便能够兼容安卓应用,在过了新鲜期之后,如何提升用户体验度是关键。如果像阿里OS一样可以远程删除用户的app,就直接死翘翘吧。


保持软件开发商的利益和用户体验度的平衡,是鸿蒙系统能否生存的关键。开发商没有得到利益,不会开发鸿蒙系统的app;用户体验度差,用户就不会用鸿蒙系统。

C. linux如何安装as86

这个工具包含在
Binutils
软件包里,请在网上搜寻
binutils
rpm包,下载到自己的电脑上安装它。
对于已经下载的软件包,你用鼠标点右键,从弹出菜单中选择用
安装程序
运行就可以了。

D. 如何从零开始自制操作系统

步骤一:编写汇编程序(linux版)
在linux下,我使用as86和ld86这2个程序来产生代码。(我这里以linux的Ubuntu发行版为例)。
as86对于我们这个任务来说足够简单,因此也比较适合我们。
另外一个原因恐怕是在1990年的时候,linux系统的创始者,被奉为神明的linus大牛就是使用as86来编写linux的启动代码的。
无论如何,在PC机上凡是类UNIX的系统都有这套汇编器,而且一般是在bin86软件包内。
在Ubuntu下要安装bin86软件包,只需要在终端中输入命令 sudo apt-get install bin86 即可。

下面是我们的代码:

1 entry start
2 start:
3 mov ax,#0xb800
4 mov ds,ax
5 mov byte[0],#0x41
6 mov byte[1],#0x1f
7 hlt
8

上面这段就是我们需要的as86汇编代码。在linux下将它保存为boot.s文件。
entry start 这一句正如字面意思所言,我们的程序就从start这里开始。
代码的意义等我们讲完windows版本的汇编代码再在步骤二解释,我们先在linux终端中输入命令把代码汇编成机器指令:
as86 -o boot.o boot.s
ld86 -o boot boot.o

这样我们就在linux中得到了我们接下来要写入U盘的文件boot,
而且我们希望PC从U盘启动的时候就运行我们的boot小程序(而不是试图在U盘上启动别的什么操作系统)。

步骤一:编写汇编程序(windows版)
在windows中我没找到可以用的bin86软件包,我下载了一个cygwin版本的,不过它的ld86总是报错。
而我平时一直喜欢用MinGW做C\C++的编译器,索性我们就使用这个windows版的gcc中自带的汇编程序gas。
在linux中当然也可以使用gas,不过这反而增加了点麻烦

E. 求Intel的as86和ld86的下载地址

这个软件包里面有的http://oldlinux.org/Linux.old/gnu/binutils/

F. linux的汇编,nasm用“-l xx.lst“生成lst文件,请问gnu的as怎么生成lst文件谢谢

as86倒是也用的-l选项来生成列表文件,不过至于gnu as,它是为gcc而存在的,功能应该不会太复杂,有没有生成列表文件的选项,不知道。

G. linux如何安装as86

这个工具包含在 Binutils 软件包里,请在网上搜寻 binutils rpm包,下载到自己的电脑上安装它。
对于已经下载的软件包,你用鼠标点右键,从弹出菜单中选择用安装程序运行就可以了。

H. 汇编怎么编译程序

汇编程序设计-王爽.上面有详细的过程.你学过的汇编书上没有介绍?神奇!

I. linux configure 指定依赖项目录

你可以在config的时候设置CFLAGS和CPPCFLAGS环境变量,在环境变量中加入"-I/sandbox/include"之类的

J. linux内核中bootsect 关闭软驱电动机的程序,看不懂

  1. 汇编是在x86平台i386的汇编,用的语法比较老用的as86汇编器,ld86连接器,这种语法类似intel汇编,但是linux0.11里就开头用了这个,后面用的都是at&t汇编,后面的版本也全部用at&t替换了

  2. loading system,,,上面下面都有13 10 ascii是回车换行 加起来24个字符

  3. .org 508 是告诉汇编器分配内存地址时放在508字节位置, 后面+.word=510 然后加上末尾的0xaa55的mbr标记刚好凑齐512字节 组成一个可被bios识别的引导程序

阅读全文

与as86linux相关的资料

热点内容
dockerpythonweb 浏览:969
程序员算法有多强 浏览:713
pythonworkbook模块 浏览:242
什么app能查医生 浏览:175
轻量级的编程语言 浏览:338
程序员那么可爱生孩子 浏览:432
后缀him3加密文件是什么软件 浏览:984
坚果隐藏app为什么要140版本才能用 浏览:313
淘宝dns服务器地址 浏览:259
领英转型app哪个好用 浏览:943
压缩软件的图标 浏览:97
卖鞋哪个app是真的 浏览:469
python迭代是累计吗 浏览:419
程序员哪些平台接私活 浏览:175
单片机充电电路原理图 浏览:1000
android软件云服务器地址 浏览:213
如何用服务器做内网穿透服务 浏览:401
oracle加密表空间重置密码 浏览:302
mdk编译后目标文件 浏览:616
老人动手解压 浏览:720