这是一个关于启动得程序。其目标是将一个程序不依赖任何操作系统而运行起来。下面是关于它的一点内容。
首先了解下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
分享到:
相关推荐
手把手教你在开发板上裸机跑程序,包括RVDS2.2安装,Jlink下载等
2410裸机程序,有IC、LCD、LED、UART、等相关的裸跑程序
stm32f407裸机程序在windows的qemu上跑,而且控制台可以输出打印信息。里面还包含了qemu-system-arm.exe,直接开箱即用,这个是我的对应博客教程 ...
在zynq上双系统搭建的教程,cpu0和cpu1都是跑裸机程序。 循序渐进,先跑裸机程序,再进行cpu0跑linux,cpu1跑裸机程序
这是我的第一个裸机S3C6410程序,流水灯。上面有我对GPIO口的配置的理解。呵呵
在zynq上双系统搭建的教程,cpu0跑linux,cpu1跑裸程序。
在DE0-Nano-SoC开发板上,使用DS-5的armcc编译器开发的Cyclone V SoC裸机程序,实现一个串口发送功能。
官方程序修改
工程移植模板、调试方法、TCP服务器、UDP通信、DNS应用、SNTP应用、Telnet应用、工程移植模板、调试方法、TCP服务器、UDP通信、DNS应用、SNTP应用、Telnet应用工程移植模板、调试方法、TCP服务器、UDP通信、DNS应用...
Altera CycloneV HPS+FPGA裸跑程序,HPS端的UART裸跑代码,可以快速进入开发阶段。
作者将推出《ARM9裸机开发系列》,各种ARM9功能部件开发应用的接口及完整程序讲解。包括:(ARM9的全部功能部件)外部中断、定时器、看门狗、DMA、PWM控制、UART通信、红外模块控制、实时时钟控制、IIC总线应用、Nor...
1、zynq裸机程序+lwip,不插网线不能初始化或者初始化错误的解决办法。实现插不插网线都能正常初始化,后续热插拔也正常。 2、zynq vitis的lwip库给lwipopts文件增加配置项目的方法。通用方法,给其他库增加配置...
作者将推出《ARM9裸机开发系列》,各种ARM9功能部件开发应用的接口及完整程序讲解。包括:(ARM9的全部功能部件)外部中断、定时器、看门狗、DMA、PWM控制、UART通信、红外模块控制、实时时钟控制、IIC总线应用、Nor...
作者将推出《ARM9裸机开发系列》,各种ARM9功能部件开发应用的接口及完整程序讲解。包括:(ARM9的全部功能部件)外部中断、定时器、看门狗、DMA、PWM控制、UART通信、红外模块控制、实时时钟控制、IIC总线应用、Nor...
原来的描述:MAX30102心率血氧显示例程,keil-MDK,C语言,裸机代码,包含计算心率血氧的算法。移植自美信官方例程。 最近需要用stm32做心率血氧测试,找了下要么是只有芯片驱动没有算法,要么是美信的官方例程,而...
参考使用xilinx官方文档1078、1079,代码与之对应
2440 ADS下裸机调试程序 包括ADC EBOOK INTERRUPT LCD MMU MMU—NAND POER—STOP PWM RTC RTC—LCD TOUCH-PANEL UART
作者将推出《ARM9裸机开发系列》,各种ARM9功能部件开发应用的接口及完整程序讲解。包括:(ARM9的全部功能部件)外部中断、定时器、看门狗、DMA、PWM控制、UART通信、红外模块控制、实时时钟控制、IIC总线应用、Nor...
tq2440开发板上裸机跑led的程序,通过ads1.2开发
适用于GQ2440 NANFLASH : K9F1G2808U0M