裸机下怎么进行编程?需要什么技术?
这个问题捆饶了很久了,以前较早的是穿孔机,然后到今天的存储结构,但很想知道下,第一个操作系统是在什么环境下编译的?(比如裸机环境) ,是先用电子设备烧进去吗?象bios,然后在......,请高人指点 问题点数:20、回复次数:25Top
1 楼beijingbeerman(啤酒肚)回复于 2006-07-19 11:11:32 得分 0
请查看《自己动手写操作系统》Top
2 楼mydo(侯佩|hopy|ks)回复于 2006-07-19 11:34:45 得分 0
早期的操作系统都是用汇编直接写的,后来逐渐用c来写。Top
3 楼qlmi(大米)回复于 2006-07-19 20:15:53 得分 0
mydo(侯佩|hopy) ,还是不明白。
比如我有一台计算机,是裸机,上面什么都没有,那计算机怎么认识汇编代码呢?Top
4 楼celeil(蜡笔小新)回复于 2006-07-20 07:17:57 得分 0
裸机不是什么都没有,他有BIOS,BIOS引导计算机后,他会找磁盘的引导区,你在磁盘的引导区里写程序,它就把该程序读出、执行,这基本就是操作系统的第一步工作啦。当然,你先得在一台支持汇编的非裸机上编写引导区程序,然后写入磁盘的引导区,然后拿到裸机上。Top
5 楼ddstudent()回复于 2006-07-20 13:09:06 得分 0
有一个东西叫 Cross Assembler, 就是在不同的机器上编译另外机器的汇编Top
6 楼Shatty(西北游侠)回复于 2006-07-22 20:50:37 得分 0
交叉编译环境将你程序编译成目标机器的程序,下载到目标裸机上.搞定!Top
7 楼naniandeyu(捍卫真理)回复于 2006-07-23 10:47:27 得分 0
这个问题很好,说明搂主是个寻根究底的人,任何求知欲强的人都会通过探索层层深入,最后到最根本
的问题。
最痛恨一知半解的人乱回答别人的问题,或者找风马牛不相及的答案糊弄人!这样的人就别搞技术了,
去搞政治更合适!
你的困惑感应该和蛋鸡问题类似,到底是先有操作系统还是先有汇编器?其实只要对计算机史了解的话
就不会迷惑了。原始的电子计算机是没有操作系统也没有汇编器的,那时编程是靠写一条条机器指令(
就是高低电位组成的信号)进行的,没多久,出现了汇编语言,就是用符号来表示原本的指令,由程序
员写出这些符号指令,再由其他人对表翻译成真正的机器指令。这就是所谓的手工汇编。后来又出现了
用程序来代替人的查表,就是现在的机器汇编,从此汇编语言诞生。运行汇编程序并不一定要有操作系
统,只要把程序加载到内存,然后cpu逐条执行就可以了,而操作系统也未必非要汇编语言来写,也可以
用机器指令写的。也就是说他们在逻辑上并非一定的因果关系。所以历史上也没有明确的先后关系,是
同时交错进行的。那时没有操作系统的概念,只是一个个工具程序而已。你的困惑还在于最初程序是如
何输入进计算机的,现在要把一个程序加载到内存,需要借助别的程序,那这个“别的程序”又是怎么
到内存里的呢?还是蛋鸡问题。其实,最早把程序加入计算机里的方法是搬开关,一位一个开关来代表
高低电位。后来打卡片,再用光电转换输入。再后来出现了磁介质,存储和加载靠程序对磁介质读写来
完成,这就不需要借助体力和外部设备了,存储和加载都在计算机内部完成。那么这个“最初的加载程
序”当然不是靠程序加载的,是靠人力加载的(可以搬开关,也可以打孔。)
再后来呢,由于输入汇编指令太累,所以有人就开发了一中程序,叫“自动编程器”,就是输入一条高
级指令,由那个程序解释成多条机器指令,这就是后来的高级语言。
ps:其实计算机的本质就是一条条电信号(机器指令)来推动运行的,和一台内部有很多齿轮的精密大
钟没什么两样,都是机器!什么操作系统啦,什么程序啦,都是我们抽象后给他们起的名字,他们本质
还是一个个机器指令,注意,我很反对某些人说机器指令就是1、0数字组成的,这很不确切容易使人误
解(可能他自己就误解了),应该说是由高低电位组成的,只不过我们把高电位看作1,低电位看作0。
我还很鄙视某些缺乏探索精神的所谓的“技术人员”,在他们看来好像在键盘上按一个键,然后显示器
上显示出字符,这么一个简单的过程是理所应当的,不值得探索,殊不知就是这个简单的过程也是很多
很多内部指令的结果,这些都不思考更不要指望他们去思考“最初的操作系统”类的问题了。一句话,
没有探索的欲望和好奇心,就不要搞研究!
本人很欢迎这方面的交流: qq:18654232
Top
8 楼qlmi(大米)回复于 2006-07-24 12:29:59 得分 0
受教了!Top
9 楼fishboy007()回复于 2006-07-24 20:35:05 得分 0
嗯 说得真不错啊 学到不少东西
我是新手,以后多来学习了Top
10 楼Channie(邪恶十六进制)回复于 2006-07-24 20:43:29 得分 0
哈,不错不错,和微机原理书上的差不多,看来是行内人啊Top
11 楼BAYNPU()回复于 2006-07-25 11:52:56 得分 0
不错!受到启蒙!Top
12 楼ff5dq4()回复于 2006-07-26 16:46:17 得分 0
以前也知道 不过想在全忘记了
只隐约记得 开机 开始读bios 的时候 第一条 jmp 指令 跳的 某个地方去 自检
还要对1MB 内存进行 装载Top
13 楼yeahbaby()回复于 2006-07-27 08:16:48 得分 0
拜9楼强人 naniandeyu(捍卫真理) ,茅塞顿开,茅塞顿开!Top
14 楼hillt(LONELY AND NOTHING)回复于 2006-07-27 10:41:00 得分 0
受教了,学海无涯啊Top
15 楼xulxqqqq()回复于 2006-07-29 11:19:46 得分 0
说的好啊 佩服Top
16 楼lmcctvjava(无心)回复于 2006-07-29 23:29:47 得分 0
收藏了Top
17 楼panwill2000()回复于 2006-08-12 12:13:20 得分 0
谢谢naniandeyu(捍卫真理) 的回答,非常满意,在这之前曾向大学问教授时,被教授耻笑问的太幼稚,那个教授的意思是这些是你操心的吗?你是在用电脑,不是在做电脑,就好象你看电视,却没必要知道内部的各个器件.......就这样把这个问题避开了,但后来心理怎么也不塌实,最后通过naniandeyu(捍卫真理)的回答,搞清楚了计算机的一些知道.Top
18 楼fly4free(自由的飞!!)回复于 2006-08-12 21:01:41 得分 0
哪里的教授啊……他的存在简直侮辱教授这个名字。
你可以反驳,“我是在用电脑,可是我是在学编程,要知道原理才能编的更好。用你的比喻,我就是修理电器的,在看电视的同时也修理电视,你不会就直说嘛!”Top
19 楼shewenjie()回复于 2006-08-14 21:01:57 得分 0
呵呵学习到不少……Top
20 楼Galatin(找个女朋友,还是养条狗)回复于 2006-08-15 12:43:29 得分 0
牛人,拜读,学习Top
21 楼ycangmsw()回复于 2006-08-15 21:34:11 得分 0
90%的人不认真看教材。这个问题在多数教材上说的很清楚了。Top
22 楼shaoxiaoning(老豆)回复于 2006-08-16 12:06:35 得分 0
裸机上 有 BIOS指令,我理解的 写 汇编时,不调用 DOS中断,而只调用 BIOS中断,
应该就可以 执行了。
BIOS中断-> DOS中断/LinuxShell中断 -> Windows API(Linux API)Top
23 楼zyl910(编程的乐趣在于编程控制硬件,与用图形学实现绚丽效果)回复于 2006-08-16 12:28:27 得分 0
对于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时代学习编程是最幸福的,直接掌控电脑中的一切……Top
24 楼zyl910(编程的乐趣在于编程控制硬件,与用图形学实现绚丽效果)回复于 2006-08-16 12:38:20 得分 0
真正意义上的裸机是没有BIOS的,所以只能靠人工去拨开关。
最底层的硬件控制是用in/out指令去访问硬件的IO端口,发送控制字。
BIOS中断服务程序只是为了建立一个介面,屏蔽设备细节。
DOS中断服务程序就相当重要,比如进程管理和文件系统。
而对于像Windows/Linux这样的保护模式操作系统,是无法利用16位的BIOS的,所以靠驱动程序直接访问IO端口来控制硬件。至于操作系统接口,是使用中断调用方式还是API函数方式并没有本质上的区别,Windows API本质上是通过中断调用向内核请求服务的,这不过作为函数方式更易理解。
Top
25 楼Cody2k3()回复于 2006-08-16 13:01:44 得分 0
Windows API本质上是通过中断调用向内核请求服务的,这不过作为函数方式更易理解。
--------------------------
以前是INT 2E,现在已经不是了,现在是sysenter/sysexitTop




