社区
汇编语言
帖子详情
裸机下怎么进行编程?需要什么技术?
panwill2000
2006-07-19 10:47:46
这个问题捆饶了很久了,以前较早的是穿孔机,然后到今天的存储结构,但很想知道下,第一个操作系统是在什么环境下编译的?(比如裸机环境) ,是先用电子设备烧进去吗?象bios,然后在......,请高人指点
...全文
1304
25
打赏
收藏
裸机下怎么进行编程?需要什么技术?
这个问题捆饶了很久了,以前较早的是穿孔机,然后到今天的存储结构,但很想知道下,第一个操作系统是在什么环境下编译的?(比如裸机环境) ,是先用电子设备烧进去吗?象bios,然后在......,请高人指点
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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)
裸机
C:嵌入式
编程
实战
本书深入讲解
裸机
环境下C语言在嵌入式系统中的实际应用,涵盖从基础语法到外设控制、中断处理、链接脚本与底层驱动开发的全过程。通过STM32微控制器实例,读者将掌握无操作系统下的硬件初始化、串行通信、内存管理与模块化
编程
等核心技能。书中强调代码可维护性与工程实践,融合预处理器技巧、调试方法与开源工具链使用,帮助开发者真正理解嵌入式系统的运行机制。适合有一定C基础、希望深入底层开发的
技术
人员和工程师阅读与实践。
ARM处理器
裸机
开发实战__机制而非策略
ARM处理器
裸机
开发实战——机制而非策略.7z 配套数据的光盘里面的代码,很不错的资料!
RTOS:什么是操作系统内核?它与
裸机
编程
的差异又是什么?
摘要: 本文探讨了操作系统内核的概念及
裸机
编程
与操作系统
编程
的区别。内核作为计算机的核心,负责资源管理、多任务处理和安全机制。
裸机
编程
直接操控硬件,性能更优但复杂度高;操作系统
编程
通过内核抽象简化开发,支持多任务并提升稳定性,但存在性能开销。实际选择取决于应用场景:简单功能适合
裸机
,复杂任务推荐操作系统。两者各有优劣,需根据需求权衡。
单片机电机控制
编程
操作系统环境
编程
与
裸机
编程
的比较
如果
需要
实现更高的性能、更高的实时性和更精确的控制,那么使用
裸机
编程
更适合。在单片机
编程
中,有两种主要的方法:操作系统
编程
和
裸机
编程
。无论使用哪种
编程
方式,都
需要
对电机控制的基础知识和原理有深入的了解。
裸机
编程
可以在更高的实时性下运行,因为它不
需要
经过操作系统的调度和管理。由于
裸机
编程
不
需要
操作系统,因此可以在更低的系统资源开销下运行。由于操作系统提供了更高级别的抽象,程序员可以更容易地
进行
扩展。由于
裸机
编程
可以直接操作硬件,因此可以实现更精确的控制。由于
裸机
编程
可以直接操作硬件,因此可以实现更高的性能。
裸机
编程
的几种模式、架构与缺陷。
大多数嵌入式的初学者都是从单片机
裸机
编程
开始的,对于初学者来说,
裸机
编程
更加直观、简单,代码所见及所得,调试也非常方便,区别于使用操作系统
需要
先了解大量的操作系统基础知识,调度的基本常识,还
需要
注意各种资源的共享与竞争等概念,并且调试也没有那么直观等等。
裸机
编程
在一些比较简单的项目上还是具有一定的优势的。接下来我们来看看
裸机
编程
的常见模式和架构。
汇编语言
21,499
社区成员
41,617
社区内容
发帖
与我相关
我的任务
汇编语言
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
复制链接
扫一扫
分享
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章