淘宝客怎么做自己的网站,做的网站怎么打开是白板,谷歌企业邮箱注册,部署个人网站直接看代码#xff0c;即使已经理解了代码#xff0c;但是还是会有种没有学到手的感觉.真正的掌握来自实践#xff0c;来自己动手做出来.“简单AB任务切换程序”系列文章的目的是#xff0c;在bochs下#xff0c;实践出简单AB两个任务的切换. 1. bochs安装或者编译参考 Ub…直接看代码即使已经理解了代码但是还是会有种没有学到手的感觉.真正的掌握来自实践来自己动手做出来.“简单AB任务切换程序”系列文章的目的是在bochs下实践出简单AB两个任务的切换. 1. bochs安装或者编译参考 Ubuntu10.04搭建linux-0.11编译环境(1.bochs安装和使用) Ubuntu10.04搭建linux-0.11编译环境(2.bochs编译) 2. 实现一个最简单的bootloader (1)bootloader顾名思义boot loader我们现在只实现bootloader其实就是简单bios中断调用后面接触. (2)此处使用汇编语言汇编和连接器分别为as86和ld86ubuntu下sudo apt-get install bin86即可 (3)代码boot.s .globl begtext,begdata,begbss,endtext,enddata,endbss .textbegtext:.databegdata:.bssbegbss:.textBOOTSEG 0x07c0entry startstart: jmpi go,BOOTSEGgo: mov ax,cs mov ds,ax mov es,ax mov ax,#0x0600 mov cx,#0x0000 mov dx,#0xFFFF int 0x10 mov cx,#20 mov dx,#0x0000 mov bx,#0x000c mov bp,#msg1 mov ax,#0x1301 int 0x10loop0: jmp loop0msg1: .ascii Loading system ... .byte 13,10.org 510 .word 0xAA55 (4)分析 .globl begtext,begdata,begbss,endtext,enddata,endbss .text begtext: .data begdata: .bss begbss: .text 以上几句告诉汇编器和连接器要声明的全局符号同时说明程序的所有段都从一个基地址开始. BOOTSEG 0x07c0 entry start start: jmpi go,BOOTSEG go: entry start告诉汇编器程序的入口是start符号 因为我们这段是引导代码引导代码在引导盘的指定位置处bios会默认读出来放到内存0x7c00:0x0处所以所有的段基地址其实都是0x7c00. jmpi do,BOOTSEG是跳转到0x7c00:go处执行go其实是个相对当前jmpi do,BOOTSEG这条指令的一个偏移假设是5这句话其实是跳到了0x7c00:0x5处执行同时一个作用是隐含地设置了cs为0x7c00这句话可以不用直接替换后边的mov ax,cs: mov ax,#BOOTSEG或者mov ax,0x7c00 mov ax,cs mov ds,ax mov es,ax 以上几句设置了ds和es段与cs保持相同因为程序中声明了代码数据附加段都是一个基地址的 mov ax,#0x0600 mov cx,#0x0000 mov dx,#0xFFFF int 0x10 以上几句调用bios的0x10中断清屏.关于bios中断不用了解许多知道用法能查手册即可手册网络上有很多. mov cx,#20 mov dx,#0x0000 mov bx,#0x000c mov bp,#msg1 mov ax,#0x1301 int 0x10 以上几句调用了bios的0x10中断显示一个字符串msg1 loop0: jmp loop0 看以看出来是无限循环msg1: .ascii Loading system ... .byte 13,10 定义字符串.org 510 .word 0xAA55 在510位置后定义0xAA55启动扇区标志. 3.编译调试bootloader 前边说过使用的as86汇编器和ld86连接器使用bochs模拟器. bochs支持虚拟的软盘和硬盘因为软盘简单一些所以我们把程序编译后少些到软盘上即可启动了. (1)编译boot.s as86 -0 -a -o boot.o boot.s boot.s是源码boot.o是编译输出 (2)链接boot.o ld86 -0 -s -o boot boot.o boot.o是1的输出boot是链接输出 (3)制作虚拟软盘 dd bs32 ifboot ofboot.img skip1 因为boot前32字节是文件头所以要跳过不写把后边的所有内容写进boot.img 至此boot.img就是做好的可启动的虚拟软盘了 4. 运行与bochs调试 (1)bochs配置 bochs配置文件bochsrc.txt如下 config_interface: textconfig romimage: file/usr/local/share/bochs/BIOS-bochs-latest megs: 16 vgaromimage: file/usr/local/share/bochs/VGABIOS-lgpl-latest floppya: 1_44boot.img, statusinserted boot: a vga_update_interval: 300000 keyboard_paste_delay: 100000 keyboard_serial_delay: 200 cpu: count1, ips1000000 mouse: enabled0 private_colormap: enabled0 fullscreen: enabled0 screenmode: namesample i440fxsupport: enabled0 (2)运行 当前目录下执行bochs (3)bochs调试命令 c - 继续 pb 0x7c00 - 在0x7c00处设置断点 n - 执行下一步 u 0x10000 - 反汇编0x10000区域 本文完.转载于:https://www.cnblogs.com/linucos/archive/2012/04/01/2428262.html