linux0.11学习笔记-技术铺垫-简单AB任务切换程序(1)-实现一个简单的bootloader

直接看代码,即使已经理解了代码,但是还是会有种没有学到手的感觉.真正的掌握来自实践,来自己动手做出来.“简单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,我们现在只实现boot,loader其实就是简单bios中断调用,后面接触.

(2)此处使用汇编语言,汇编和连接器分别为as86和ld86,ubuntu下sudo apt-get install bin86即可

(3)代码boot.s

.globl begtext,begdata,begbss,endtext,enddata,endbss                                                                                    
.text
begtext:
.data
begdata:
.bss
begbss:
.text
BOOTSEG = 0x07c0

entry start
start:
    jmpi go,BOOTSEG

go:
    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 0x10

loop0: jmp loop0

msg1: .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 bs=32 if=boot of=boot.img skip=1

因为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_44="boot.img", status=inserted

  boot: a

  vga_update_interval: 300000

  keyboard_paste_delay: 100000

  keyboard_serial_delay: 200

  cpu: count=1, ips=1000000

  mouse: enabled=0

  private_colormap: enabled=0

  fullscreen: enabled=0

  screenmode: name="sample"

  i440fxsupport: enabled=0

(2)运行

当前目录下执行bochs

(3)bochs调试命令

c - 继续

pb 0x7c00 - 在0x7c00处设置断点

n - 执行下一步

u 0x10000 - 反汇编0x10000区域


本文完.

转载于:https://www.cnblogs.com/linucos/archive/2012/04/01/2428262.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/262819.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用file做swap分区

有时候在给系统盘分区时,忘记swap分区,这种情况下,可以用一个文件做swap,效果差不多的。这里就以2Gswap分区为例。步骤:1、创建2G大小的文件dd if/dev/zero of/swap bs1M count20482、格式化swap filemkswap /swap3、把…

MoinMoin Wiki 1.7优化与维护经验

CWoW Developer Group(CWDG)从2006年开始在一直使用 MoinMoinWiki 来构建一个魔兽世界游戏插件开发技术知识库, 这2年中wiki的版本也从1.5变更到了1.7. moin1.6是一个变化最大的版本, 连不少wiki语法都改变了, 最显著的莫过于内连接的语法原先是["xxx"]现在与mediaw…

react和vue配置本地代理

React 在react中配置开发环境下的本地代理相对比较简单,直接在package.json文件中修改即可。 但是这样做有其局限性,如果开发中代理多个接口的时候将无法满足需求,我们需要的是下面这种的能够代理多个接口的请求方式 proxy(/back, {target: h…

php异步处理,执行系统命令

为什么80%的码农都做不了架构师?>>> 难点1:php执行系统命令,要等到命令执行完成之后才会结束,不然会造成整个php进程挂起,其他php服务僵死? 难点2:php执行的命令完成后,…

javax.servlet.ServletException: java.lang.NoClassDefFoundError: javax/el/ELResolver错误解决办法...

错误如下,不知道是不是遇到鬼了,之前好好的,装了myeclipse以后出错了(说实话,myeclipse用的很不爽,感觉netbeans更好用些) HTTP Status 500 -type Exception reportmessagedescription The serv…

axios取消功能的设计与实现

取消功能的设计与实现 #需求分析 有些场景下,我们希望能主动取消请求,比如常见的搜索框案例,在用户输入过程中,搜索框的内容也在不断变化,正常情况每次变化我们都应该向服务端发送一次请求。但是当用户输入过快的时候&…

为搜索引擎做准备

1、 允许搜索机器人搜索站内所有链接。如果你想某些页面不被搜索&#xff0c;推荐采用robots.txt方法<meta content"all" name"robots" />2、 设置站点作者信息<meta name"author" content"ajienetease.com,阿捷" />3…

hibernate中的Annotation补充

下面使用Annotation来定义一个实体类&#xff1a; Entity Table(name"person_table") //不是引入org.hibernate.persistence&#xff0c;因为这个只可以在hibernate环境下使用 public class Person …

axios拦截器的实现

拦截器设计与实现 #需求分析 我们希望能对请求的发送和响应做拦截&#xff0c;也就是在发送请求之前和接收到响应之后做一些额外逻辑。 我们希望设计的拦截器的使用方式如下&#xff1a; // 添加一个请求拦截器 axios.interceptors.request.use(function (config) { // 在发送请…

What can Lines3D Class do?

好几天没来Bolg了&#xff0c;这几天在尝试用3D线条做一个比较优雅的线条效果。文字由3DMAX导出到AS类&#xff0c;其他曲线路径由TweenMax的bezier数组定义。 Preview:niuniuzhu.cn 转载于:https://www.cnblogs.com/niuniuzhu/archive/2008/07/25/1251556.html

10 个最佳的网站分析方法

一个网页设计师在设计网站的各个关键方面时&#xff0c;他们需要了解网站的各种必要细节&#xff0c;可通过市场调研或者是网站本身的统计来获取这些细节信息。 本文介绍的这些工具确实可以帮助网站进行适当和有效的分析。这里面有些是免费的工具&#xff0c;还有的提供非常强大…

C#表达式树浅析

一、前言 在我们日常开发中Lamba 表达式经常会使用&#xff0c;如List.Where(n>Name"abc") 使用起来非常的方便&#xff0c;代码也很简洁&#xff0c;总之一个字就是“爽”。在之前我们总是用硬编码的方式去实现一些底层方法&#xff0c;比如我要查询用户“abc”是…

程序员每天该做的事情

1、总结自己一天任务的完成情况 最好的方式是写工作日志&#xff0c;把自己今天完成了什么事情&#xff0c;遇见了什么问题都记录下来&#xff0c;日后翻看好处多多 >> 好记性不如烂笔头。呵呵 2、考虑自己明天应该做的主要工作 把明天要做的事情列出来&#xff0c;并…

20150901-Linux磁盘管理及文件系统管理

占位&#xff0c;待完善。。。Linux系统管理磁盘和文件系统管理&#xff1b;RAID, LVM; btrfs; 程序包管理&#xff1a;rpm, yum(dnf)Linux的网络管理; 进程和作业管理&#xff1a;htop, glances, tsar&#xff1b;sed和awk&#xff1b;Linux系统的开机启动流程&#xff1b;内核…

oAuth2.0 登录新浪微博 发送新浪微博 代码

1 public class SinaoAuth2 {3 string APIHost "";4 public SinaoAuth() 5 {6 APIHost SinaConfig.Sina_Host;7 }8 9 #region 绑定微博帐号10 /// <summary>11 /// 绑定微博帐号12…

下载 sdk struts java

<action name"sdkDownload" class"com.curiousby.sdkDownload"><!-- result的Type必须为stream --><result name"success" type"stream"><param name"contentType">application/octet-stream;char…

微信小程序省市区联动,自定义地区字典

最近在做一个项目的时候遇到了这么一个问题&#xff0c;就是省市区的联动呢&#xff0c;我们需要自定义字典来设置&#xff0c;那么微信小程序自带的省市区选择就不能用了&#xff0c;经过三根烟的催化&#xff0c;终于写出来了。下面献上代码示例。 首先是在utils文件夹存入ar…

论文翻译《Object-Level Ranking: Bringing Order to Web Objects》

Object-Level Ranking: Bringing Order to Web Objects Zaiqing Nie Yuanzhi Zhang Jirong Wen Weiying Ma 摘要&#xff1a; 现在的网络搜索方法实际上是做文档级排名和检索&#xff0c;与之相对比&#xff0c;我们在探索一种新的聚合体以实现在对象级的网络检索。我们搜集与某…

C# 定时器定时更新

class Program{static void Main(string[] args){//for (int i 0; i < 100; i)//{// SendMessage("131", "131");//}System.Timers.Timer aTimer new System.Timers.Timer();aTimer.Elapsed new ElapsedEventHandler(aTimer_Elapsed);// 设置引发…

前端vscode常用插件

Auto Rename Tag 这是一个html标签的插件&#xff0c;可以让你修改一边标签&#xff0c;另外一边自动改变。 Beautify 格式化代码插件 Braket Pair Colorizer 给js文件中的每一个小括号()花括号{}都配上不同的颜色&#xff0c;方便找到哪一个位置多了少了括号。 Debugger for C…