`
Tveiker
  • 浏览: 55999 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

裸机跑起自己得程序

阅读更多
这是一个关于启动得程序。其目标是将一个程序不依赖任何操作系统而运行起来。下面是关于它的一点内容。

首先了解下PC开机后得一些动作
     1)、PC启动时Intel系列CPU进入实模式设置CS=0xffff,IP=0x0000,所以CPU先执行0xffff0处代码[ROM-BIOS起始位置]。
     2)、BIOS进行一系列自检,然后初始化位于地址0处得中断向量表。
3)、BIOS将启动盘第一个扇区(512B)装入到内存地址0x7c00处并跳到此处执行此处代码。

所以我们所写的程序就应该放在0x7c00处,即使没有操作系统我们的程序也能运行起来。
好吧Coding now,I can't wait...

    所以系统引导程序放在启动盘的第一个扇区。由BIOS加载到内存

下面了解下Linux系统引导程序/boot/Bootsec.s所做的事。
  1)、linux系统启动后将自己装入到绝对地址0x90000处。
  2)、再将其后的2K字节(Setup文件)装入到地址0x90200处
  3)、最后将内核文件装入到0x10000处

当引导程序被BIOS加载内存后,则开始运行/boot/Setup.s
  1)、Setup.s首先设置一些硬件设备,然后将内核文件从0x10000处移到0x00000处,
  2)、此时系统进入保护模式,开始执行0x00000处代码

内核文件头部是在/boot/Head.s文件中
  1)、这个文件会将LDT、GDT的首地址装入到相应得寄存器中,初始化处理器,设置好内存页面
  2)、然后调用/init/main.c中的main函数。
然后启动完成

;----------------------------------------------------------
;此程序是一个测试启动的程序。不依赖于任何操作系统
;nasm start.asm -o start.bin进行汇编生成二进制文件(512B)
;利用bximage命令生成一个软驱boot.img,
;利用dd if=start.bin of=boot.img bs=512 count=1 conv=notrunc
;将start.bin写入软驱boot.img中
;------------------------------------------------------------

	org		0x7c00       ;加载程序到0x7c00处[CS:IP=0000h:7c00h]
	mov		ax,cs        ;
	mov		ds,ax
	mov		es,ax        ;以上三条指令是将数据段和额外段调到代码段一起
	call	DispMessage  ;调用显示字符串的子过程
	jmp $                ;无限循环
DispMessage:
;------------------------------------
;关于显示的BIOS中断10h号 13h号功能
;+=========+================+=======================================+
;|功能号AH  |    功能描述     |                  入口参数              |
;+---------+----------------+---------------------------------------+
;|         |                |BH/BL=显示页/属性(字符串底色及字体颜色)    |
;|         |                |CX=字符串长度                           |
;|         |                |DH/DL字符串显示的行/列                   |
;|         |从指定位置显示    |ES:bp=字符串显示得起始逻辑地址            |
;| 13h     |  字符串         |AL=0  利用BL属性,光标不移动             |
;|         |                |  =1  利用BL属性,光标移动               |
;|         |                |  =2  [字符,属性],光标不移动             |
;|         |                |  =3  [字符,属性],光标移动               |
;+=========+================+=======================================+
;
;  BL作为字符属性:BL共八个位(一个字节),前四个位是底色属性,后四个位是
;                 字符前景属性。属性4位的最高位是高亮属性,为1时则高
;				  亮,后三位是颜色值RGB
; 当字符串不利用BL属性:即AL=2,3时[字符,属性]的意思。
;				    [字符,属性]就是说在显存中有色字符存储需要两个
;                    字节,第一个字节是字符,第二个字节则代表字符的
;				     具体属性。属性意思跟BL解析一样,只是这样更灵活
;----------------------------------------------------------------------
	mov		ax,Message
	mov		bp,ax
	mov		ah,13h
	mov		al,0
	mov		dx,0x0403
	mov		bh,0
	mov		bl,0x4f
	mov		cx,10h
	int		10h
	ret
Message:
	db	"Hello OS World!"
	times 510-($-$$) db 0 ; $代表当前行指令首地址,$$代表程序首地址
	dw  0xaa55	       ;扇区结束标志selector[510]=55h selector[511]=aah

以下就是运行截图。红底白色得Hello,OS World!


  • 大小: 19.8 KB
4
1
分享到:
评论
6 楼 Tveiker 2012-04-04  
bewithme 写道
嗯,顶住,希望有一天看到你写的OS。

谢谢,我会试着坚持得
5 楼 Tveiker 2012-04-04  
沙舟狼客 写道
能不能把你的环境给我说一下,具体怎么配置运行这段代码

Ubuntu10.10+bochs-2.5+nasm2.9
4 楼 沙舟狼客 2012-03-09  
能不能把你的环境给我说一下,具体怎么配置运行这段代码
3 楼 bewithme 2012-03-09  
嗯,顶住,希望有一天看到你写的OS。
2 楼 expone 2012-03-09  
你妹的,又一个搞OS的,希望能坚持下来。
1 楼 shirne 2012-03-09  

哈哈

相关推荐

    stm32f407裸机程序在windows的qemu上跑

    stm32f407裸机程序在windows的qemu上跑,而且控制台可以输出打印信息。里面还包含了qemu-system-arm.exe,直接开箱即用,这个是我的对应博客教程 ...

    裸机S3C6410跑流水灯程序

    总结起来,"裸机S3C6410跑流水灯程序"这个项目涵盖了嵌入式系统开发的基本要素,包括处理器的GPIO接口配置、定时器使用、中断处理以及使用RVDS进行裸机程序开发。这个过程不仅锻炼了开发者对硬件接口和底层操作的...

    MINI2440 上实现裸机 跑 UCGUI 无UCOS

    - **移植事件处理**:裸机环境下没有操作系统调度,需要自己实现键盘、触摸屏等输入设备的事件处理机制。 - **构建UCGUI应用**:根据需求创建UCGUI窗口、控件,并编写相应逻辑。 5. **2440test文件** 提供的...

    USB_Device:裸机本机USB驱动程序实现

    在裸机环境中,即没有操作系统支持的情况下,实现USB驱动程序是一项挑战,因为需要处理USB协议的细节以及硬件交互。本文将深入探讨如何使用C语言在裸机环境下实现USB Device驱动程序。 首先,理解USB协议的基础至关...

    LWIP裸机实现TCPUDP通讯

    在裸机环境下,开发者需要自己处理任务调度和内存管理,因此需要对LWIP的内核进行适当的配置和裁剪。 ENC28J60是一款低功耗、高性能的以太网控制器,它支持10Base-T的以太网连接,具有SPI接口,可以方便地与STM32...

    Altera CycloneV HPS+FPGA裸跑程序

    Altera CycloneV HPS+FPGA裸跑程序是嵌入式系统设计中的一种高级应用,它结合了硬件处理系统(HPS)和现场可编程门阵列(FPGA)的优势,实现了软硬件协同处理。在这样的系统中,HPS通常执行高性能的控制任务,而FPGA...

    ZYNQ双核AMP官方例程(双核分别跑Linux+裸机实现核间通信)

    在本文中,我们将深入探讨基于Xilinx ZYNQ平台的双核异构处理系统(Heterogeneous Processing System, HPS)实现的AMP(Asymmetric Multi-Processing)模式下的Linux与裸机程序之间的核间通信。Xilinx ZYNQ是集成ARM...

    S3c6410裸机跑教程

    ### S3c6410裸机跑教程 #### 一、OK6410简介与特点 OK6410开发板是一款专为满足企业级客户的开发需求而设计的产品,具备高度灵活性与稳定性。该开发板的核心优势在于其实用性,支持对核心板、底板、内存、Flash...

    简单AMP:在ZYNQ SoC处理器上运行Linux和裸机系统

    在zynq上双系统搭建的教程,cpu0跑linux,cpu1跑裸程序。

    altera soc裸机串口程序

    在本文中,我们将深入探讨如何在Altera的DE0-Nano-SoC开发板上,利用ARM Compiler(armcc)工具链开发一个针对Cyclone V SoC的裸机串口程序。首先,我们需要理解“裸机”程序的概念,这意味着没有操作系统支持,程序...

    ARMv8-A裸机引导代码_裸机_引导代码_ARMv8_

    本文档将详细解析与ARMv8-A架构相关的裸机引导代码的实现和理解,帮助开发者深入理解这一关键领域。 1. **ARMv8-A架构概述** ARMv8-A引入了两种执行状态:Aarch64(64位)和Aarch32(32位),以支持不同应用场景。...

    S32K144裸机跑--CAN

    总结来说,实现S32K144裸机跑CAN通信涉及硬件配置、位定时设定、邮箱管理、中断处理、帧格式选择、错误检测等多个环节。通过深入了解CAN协议和S32K144的FlexCAN模块,我们可以构建可靠的CAN通信系统,满足各种嵌入式...

    简单AMP:在两个Cortex-A9处理器上运行裸机系统

    简而言之,Asymmetric Multiprocessing(非对称多处理,AMP)机制允许两个处理器在不紧密耦合的情况下运行自己的操作系统或裸机应用程序,通过共享资源实现松散耦合。 在文章的上下文中,介绍了如何在双Cortex-A9...

    ZYNQ裸机usb简单使用.zip

    在ZYNQ平台上,由于没有操作系统提供驱动支持,我们需要自己编写固件来处理USB通信。这包括识别和配置USB控制器,初始化USB设备,以及处理数据传输。 首先,了解ZYNQ中的USB控制器至关重要。在ZYNQ SoC中,USB控制...

    轻松使用STM32MP13x - 如MCU般在cortex A核上裸跑应用程序

    总之,STM32MP13x提供了丰富的硬件资源和软件支持,使得开发者可以在Cortex-A核上进行MCU式的裸机编程,实现高性能的应用程序开发,同时得益于STM32Cube系列工具,整个流程变得更加高效和便捷。

    f1c100s_usb裸机.zip_F1C100s

    通过分析这个示例代码,开发者可以学习如何构建自己的USB裸机应用。 总的来说,"f1c100s_usb裸机.zip_F1C100s"是一个针对F1C100S微控制器进行USB通信的实践案例,它涵盖了底层硬件控制、USB协议理解和编程技巧,...

    stm32mp1开发教程(A7裸机开发)节选-基于华清远见FS-MP1A平台.pdf

    在探讨STM32MP1开发教程(A7裸机开发)节选内容之前,需要了解的是STM32MP1是一款由STMicroelectronics推出的多核微处理器,它集成了Cortex-A7核心用于高性能应用和Cortex-M4核心用于实时应用。本节选内容是基于华清...

    S3C2440A裸机跑OV9650 环境ADS1.2 平台mini2440 240*320TFT屏幕

    总结来说,要实现"S3C2440A裸机跑OV9650环境ADS1.2平台mini2440 240*320TFT屏幕",需要理解处理器、摄像头、屏幕和开发环境的特性,编写相应的驱动程序,并进行细致的调试,以实现完整的图像捕获和显示流程。...

    STM32___RL-TCPnet网络协议栈-裸机调试程序

    工程移植模板、调试方法、TCP服务器、UDP通信、DNS应用、SNTP应用、Telnet应用、工程移植模板、调试方法、TCP服务器、UDP通信、DNS应用、SNTP应用、Telnet应用工程移植模板、调试方法、TCP服务器、UDP通信、DNS应用...

    zynq裸机lwip不插网线初始化lwip库添加配置项方法lwipopts

    在开发Zynq裸机程序时,经常需要用到网络通信功能,而LWIP(Lightweight TCP/IP)是一个轻量级的TCP/IP协议栈,适用于资源有限的嵌入式设备。在Zynq平台上,LWIP是实现网络功能的重要组件。然而,在没有物理连接网线...

Global site tag (gtag.js) - Google Analytics