裸机下怎么进行编程?需要什么技术?

panwill2000 2006-07-19 10:47:46
这个问题捆饶了很久了,以前较早的是穿孔机,然后到今天的存储结构,但很想知道下,第一个操作系统是在什么环境下编译的?(比如裸机环境) ,是先用电子设备烧进去吗?象bios,然后在......,请高人指点
...全文
1251 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
zyl910 2006-08-16
  • 打赏
  • 举报
回复
真正意义上的裸机是没有BIOS的,所以只能靠人工去拨开关。

最底层的硬件控制是用in/out指令去访问硬件的IO端口,发送控制字。
BIOS中断服务程序只是为了建立一个介面,屏蔽设备细节。
DOS中断服务程序就相当重要,比如进程管理和文件系统。
而对于像Windows/Linux这样的保护模式操作系统,是无法利用16位的BIOS的,所以靠驱动程序直接访问IO端口来控制硬件。至于操作系统接口,是使用中断调用方式还是API函数方式并没有本质上的区别,Windows API本质上是通过中断调用向内核请求服务的,这不过作为函数方式更易理解。
zyl910 2006-08-16
  • 打赏
  • 举报
回复
对于8086,处理器复位后会将CS设为FFFFh、IP设为0h,即从FFFF0h这个地址开始运行。
主板通过硬件布线使该物理地址指向主板BIOS的ROM区。在该地址,BIOS存放的是一条跳转执行,以跳到启动自检代码中去。
到了80286,由于地址总线扩展到了24位,有了不可见寄存器。所以表面上还是 FFFF:0 这个地址。但实际上CS寄存器的不可见部分描述的基地址是 FFFFF0h,再加上偏移0,所以物理地址是FFFFF0h,内存空间的最高16字节。
到了80386,真正的32位处理器,它也沿用“内存空间的最高16字节”这种设计:将CS寄存器的不可见部分描述的基地址设为 FFFFFFF0h。


这时,有两个疑点:
一、对于286、386,它们复位后CS寄存器于实模式下寄存器工作方式不同,那么会不会造成段错误。答案是不会,这是因为BIOS位于该地址的那个jmp指令是远跳转,会重新设置CS寄存器。
二、每种处理器的启动地址不同,而BIOS地址是硬件布线连接的,那怎么兼用呢?其实,我们本来就是为不同的处理器设计不同的主板,本来就不会出现混用的情况。



主板BIOS的工作:
1.jmp跳转到启动自检代码
2.检查处理器
3.检查基本硬件(内存、定时器、DMA……)
4.在 C0000h~DFFFFh 查找各个设备的BIOS,并跳转,以执行该设备的自检代码。这就是我们在开机时最先看见显卡自检画面的原因
5.识别常规硬件:键盘、鼠标、硬盘、PCI总线及PCI总线上的设备……
6.根据CMOS设置,尝试从第一启动设备启动。一般我们设为从硬盘启动,所以BIOS会将硬盘的第一个扇区(0柱面0磁头1扇区,或LBA地址0。1扇区是512字节)加载到物理地址700h,然后跳转到该地址启动。


对于软盘,第一个扇区就是引导扇区。而硬盘就复杂了,第一个扇区叫MBR(主引导记录),中间存放了分区表,MBR中的代码就是从分区表中找到活动的分区,然后将该活动分区的第一扇区加载到内存并跳转执行。

注意文件系统(FAT、NTFS、EXT3……)是由操作系统定义的,所以在引导过程中没有文件概念。只有等到执行引导扇区时,才开始解析文件系统,装入系统内核。但此时由于条件限制,不会建立完整的文件系统(比如早期的DOS规定IO.SYS、MSDOS.SYS必须是最前面的那几个簇)。只有等内核装入后才会建立完整的文件系统。有了文件系统,剩下的事就开始有条理了:装载驱动程序,使硬件正常工作;读取配置文件(或注册表),根据用户设置来显示桌面(或停在登陆界面)





现在理解中国为什么没有自己的家用操作系统了吧。传统的计算机科学教育(90年代前)主要是算法教育,根本忽略平台。现在都是Java、Net跨平台应用,根本不让你接触平台细节。不了解平台,怎可能写出操作系统!

现在越来越觉得自己以前在DOS时代学习编程是最幸福的,直接掌控电脑中的一切……
神杀中龙 2006-08-16
  • 打赏
  • 举报
回复
裸机上 有 BIOS指令,我理解的 写 汇编时,不调用 DOS中断,而只调用 BIOS中断,
应该就可以 执行了。
BIOS中断-> DOS中断/LinuxShell中断 -> Windows API(Linux API)
Cody2k3 2006-08-16
  • 打赏
  • 举报
回复
Windows API本质上是通过中断调用向内核请求服务的,这不过作为函数方式更易理解。
--------------------------
以前是INT 2E,现在已经不是了,现在是sysenter/sysexit
Galatin 2006-08-15
  • 打赏
  • 举报
回复
牛人,拜读,学习
ycangmsw 2006-08-15
  • 打赏
  • 举报
回复
90%的人不认真看教材。这个问题在多数教材上说的很清楚了。
shewenjie 2006-08-14
  • 打赏
  • 举报
回复
呵呵学习到不少……
panwill2000 2006-08-12
  • 打赏
  • 举报
回复
谢谢naniandeyu(捍卫真理) 的回答,非常满意,在这之前曾向大学问教授时,被教授耻笑问的太幼稚,那个教授的意思是这些是你操心的吗?你是在用电脑,不是在做电脑,就好象你看电视,却没必要知道内部的各个器件.......就这样把这个问题避开了,但后来心理怎么也不塌实,最后通过naniandeyu(捍卫真理)的回答,搞清楚了计算机的一些知道.
fly4free 2006-08-12
  • 打赏
  • 举报
回复
哪里的教授啊……他的存在简直侮辱教授这个名字。

你可以反驳,“我是在用电脑,可是我是在学编程,要知道原理才能编的更好。用你的比喻,我就是修理电器的,在看电视的同时也修理电视,你不会就直说嘛!”
lmcctvjava 2006-07-29
  • 打赏
  • 举报
回复
收藏了
xulxqqqq 2006-07-29
  • 打赏
  • 举报
回复
说的好啊 佩服
hillt 2006-07-27
  • 打赏
  • 举报
回复
受教了,学海无涯啊
yeahbaby 2006-07-27
  • 打赏
  • 举报
回复
拜9楼强人 naniandeyu(捍卫真理) ,茅塞顿开,茅塞顿开!
ff5dq4 2006-07-26
  • 打赏
  • 举报
回复
以前也知道 不过想在全忘记了

只隐约记得 开机 开始读bios 的时候 第一条 jmp 指令 跳的 某个地方去 自检
还要对1MB 内存进行 装载
BAYNPU 2006-07-25
  • 打赏
  • 举报
回复
不错!受到启蒙!
qlmi 2006-07-24
  • 打赏
  • 举报
回复
受教了!
Channie 2006-07-24
  • 打赏
  • 举报
回复
哈,不错不错,和微机原理书上的差不多,看来是行内人啊
fishboy007 2006-07-24
  • 打赏
  • 举报
回复
嗯 说得真不错啊 学到不少东西
我是新手,以后多来学习了
naniandeyu 2006-07-23
  • 打赏
  • 举报
回复
这个问题很好,说明搂主是个寻根究底的人,任何求知欲强的人都会通过探索层层深入,最后到最根本

的问题。

最痛恨一知半解的人乱回答别人的问题,或者找风马牛不相及的答案糊弄人!这样的人就别搞技术了,

去搞政治更合适!


你的困惑感应该和蛋鸡问题类似,到底是先有操作系统还是先有汇编器?其实只要对计算机史了解的话

就不会迷惑了。原始的电子计算机是没有操作系统也没有汇编器的,那时编程是靠写一条条机器指令(

就是高低电位组成的信号)进行的,没多久,出现了汇编语言,就是用符号来表示原本的指令,由程序

员写出这些符号指令,再由其他人对表翻译成真正的机器指令。这就是所谓的手工汇编。后来又出现了

用程序来代替人的查表,就是现在的机器汇编,从此汇编语言诞生。运行汇编程序并不一定要有操作系

统,只要把程序加载到内存,然后cpu逐条执行就可以了,而操作系统也未必非要汇编语言来写,也可以

用机器指令写的。也就是说他们在逻辑上并非一定的因果关系。所以历史上也没有明确的先后关系,是

同时交错进行的。那时没有操作系统的概念,只是一个个工具程序而已。你的困惑还在于最初程序是如

何输入进计算机的,现在要把一个程序加载到内存,需要借助别的程序,那这个“别的程序”又是怎么

到内存里的呢?还是蛋鸡问题。其实,最早把程序加入计算机里的方法是搬开关,一位一个开关来代表

高低电位。后来打卡片,再用光电转换输入。再后来出现了磁介质,存储和加载靠程序对磁介质读写来

完成,这就不需要借助体力和外部设备了,存储和加载都在计算机内部完成。那么这个“最初的加载程

序”当然不是靠程序加载的,是靠人力加载的(可以搬开关,也可以打孔。)

再后来呢,由于输入汇编指令太累,所以有人就开发了一中程序,叫“自动编程器”,就是输入一条高

级指令,由那个程序解释成多条机器指令,这就是后来的高级语言。


ps:其实计算机的本质就是一条条电信号(机器指令)来推动运行的,和一台内部有很多齿轮的精密大

钟没什么两样,都是机器!什么操作系统啦,什么程序啦,都是我们抽象后给他们起的名字,他们本质

还是一个个机器指令,注意,我很反对某些人说机器指令就是1、0数字组成的,这很不确切容易使人误

解(可能他自己就误解了),应该说是由高低电位组成的,只不过我们把高电位看作1,低电位看作0。

我还很鄙视某些缺乏探索精神的所谓的“技术人员”,在他们看来好像在键盘上按一个键,然后显示器

上显示出字符,这么一个简单的过程是理所应当的,不值得探索,殊不知就是这个简单的过程也是很多

很多内部指令的结果,这些都不思考更不要指望他们去思考“最初的操作系统”类的问题了。一句话,

没有探索的欲望和好奇心,就不要搞研究!


本人很欢迎这方面的交流: qq:18654232
zsl6658 2006-07-22
  • 打赏
  • 举报
回复
交叉编译环境将你程序编译成目标机器的程序,下载到目标裸机上.搞定!
加载更多回复(5)
第一章 1、设计现代OS的主要目标是什么?P1 答:其主要目标是有效性、方便性、可扩充性、开放性。 2、OS的作用可表现在哪几个方面?P2-P3 答:1、OS作为用户与计算机硬件系统之间的接口;2、OS作为计算机资源的管理者;3、OS实现了对计算机资源的抽象; 3、为什么说OS实现了计算机资源的抽象?P4 答:完全无软件的计算机系统(即裸机),它向用户提供的是实际硬件接口(物理接口),用户必须对物理接口的实现细节有充分的了解,并利用机器指令进行编程,因此该物理机器必定是难以使用的。为了方便用户使用I/O设备,人们在裸机上覆盖上一层I/O设备管理软件。通常把覆盖了上述软件的机器称为扩充机器或虚机器。它向用户(进程)提供了一个对硬件操作的抽象模型,用户更容易地使用计算机便件资源。由该层软件实现了对计算机硬件操作的第一个层次的抽象。为了方便用户使用文件系统,人们又在第一层软件上再覆盖上一层用于文件的管理软件,同样由它来实现对文件操作的细节,并向上提供一组对文件进行存取操作的命令,用户可利用这组命令进行文件的存取。此时用户所看到的是一台功能更强、使用更方便的虚机器。该层软件实现了对硬件资源操作的第二个层次的抽象。OS是铺设在计算机硬件上的多层系统软件,它们不仅增强了系统的功能,而且还隐藏了对硬件操作的细节,由它们实现了对计算机硬件操作的多个层次的抽象。值得说明的,对一个硬件在底层进行抽象后,在高层还可再次对该资源进行抽象,成为更高层的抽象模型。随着抽象层次的提高,抽象接口所提供的功能就越来越强,用户使用起来也更加方便。 4、试说明推动多道批处理系统形成和发展的主要动力是什么?P4-P5 答:为了进一步提高资源的利用率和系统吞吐量,在该系统中,用户所提交的作业都先存放在外存上并排成一个队列,称为“后备队列”;然后,由作业高度程序按一定的算法从后备队列中选择若干个作业调入内存,使它们共享CPU和系统中各种资源。在OS中引入多道程序设计技术可带来以下好处:提高CPU和利用率、可提高内存和I/O设备利用率、增加系统吞吐量。主要动力:1、不断提高计算机资源的利用率;2、方便用户;3、器件的不断更新换代;4、计算机体系结构的不断发展; 5、何谓脱机I/O和联机I/O?P6 答:由于程序和数据的输入和输出都是在外围机的控制下完成的,或者说,它们是在脱离主机的情况下进行的,该技术是脱机输入/输出方式;反之,在主机的直接控制下进行输入/输出的方式称为联机输入/输出)ON-LINE I/O)方式。1、减少了CPU的空闲时间;2、提高了I/O速度。

21,459

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧