操作系统实现-简单热身

博客网址:www.shicoder.top
微信:18223081347
欢迎加群聊天 :452380935

这次对上次的boot.asm进行代码讲解,也可以对汇编的相关理论进行补充

主引导扇区位于硬盘的0柱面0磁头1扇区处,首先BIOS加电后,就会将主引导程序加载进来,然后执行

我们先看下boot.asm中有啥把

[org 0x7c00]

; 设置屏幕模式为文本模式,清除屏幕
mov ax, 3
int 0x10

; 初始化段寄存器
mov ax, 0
mov ds, ax
mov es, ax
mov ss, ax
mov sp, 0x7c00

; 0xb8000 文本显示器的内存区域
mov ax, 0xb800
mov ds, ax
mov byte [0], 'H'

; 阻塞
jmp $

; 填充 0
times 510 - ($ - $$) db 0

; 主引导扇区的最后两个字节必须是 0x55 0xaa
; dw 0xaa55
db 0x55, 0xaa
  • 0x7c00

因为bios在上电之后,会去将boot主引导程序加载到0x7c00,然后利用一个跳转,跳到0x7c00处执行,因此我们需要将boot.asm代码放在0x7c00处,org便是这个功能

  • 设置屏幕为文本模式
mov ax, 3
int 0x10

int 0x10为bios中断服务,给定不同的ax,会进行不同的调用程序,下表给出ax=3时候的程序

AL 文字/图形 分表率 颜色 00 文字 4025 2 01 文字 4025 16 02 文字 8025 2 03 文字 8025 16 04 图形 320320 2 05 图形 320320 4 06 图形 640*200 2

  • 初始化段寄存器

因为不能使用 mov ds,0这种,因此借助 ax进行初始化

  • 显示文本

由于BIOS加载之后,还是实模式,为了在这个模式下显示文本,我们需要知道要在哪个内存区域进行显示,下面给出实模式下的内存区域

起始地址 结束地址 大小 用途

1KB 中断向量表

256B BIOS 数据区

29.75 KB 可用区域

512B MBR 加载区域

607.6KB 可用区域

1KB 扩展 BIOS 数据区

64KB 用于彩色显示适配器

32KB 用于黑白显示适配器

32KB 用于文本显示适配器

32KB 显示适配器 BIOS

160KB 映射内存

64KB-16B 系统 BIOS

16B 系统 BIOS 入口地址

可以看出在0xb8000处可以显示文本,因此

mov ax, 0xb800
mov ds, ax
mov byte [0], 'H'
相当于是 move byte ds:[0], 'H'
实模式下寻址方式为
( 16 位段基址 << 4 ) + 16 位偏移地址
ds << 4 + 0 = 0xb8000
  • 0x55aa

若一段程序结束的魔数为0x55aa,BIOS才会认为是合格的主引导程序

注意,在汇编代码中,若定义一个数字 ,左边是高位
比如 dw 0xaa55,则编译之后,aa在高位

Original: https://www.cnblogs.com/shilinkun/p/16230050.html
Author: 小坤学习园
Title: 操作系统实现-简单热身

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/607191/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Git的使用

    Git的概念 Git是一个免费的、开源的分布式版本控制系统,可以快速高效地处理从小型到大型的项目 Git的安装 Git官网https://git-scm.com/下载安装直接下一步…

    Linux 2023年6月13日
    085
  • VS2015中GLAUX库的链接问题

    最近学习OpenGL,照着例子写了个程序,用到了GLAUX库。 #include #pragma comment(lib, "glaux") 在程序中加了这两句…

    Linux 2023年6月14日
    085
  • k8s之部署metrics-server 转载

    Metrics Server是Kubernetes内置自动缩放管道的可扩展,高效的容器资源指标来源。 Metrics Server从Kubelet收集资源指标,并通过Metrics…

    Linux 2023年6月14日
    078
  • 014 Linux 线上高频使用以及面试高频问题——如何查找大文件并安全的清除?

    1 案例描述? 2 命令一(目录统计排序最佳命令) 3 命令二(最实用,目录和文件一起统计排序) (1)命令详情和说明 (2)du、head、sort、awk 详细说明参考已有文章…

    Linux 2023年5月27日
    0115
  • python正则表达式

    1.定义 正则表达式使用某种预定义的模式去匹配一类具有共同特征的字符串,主要用于处理字符串,可以快速、准确地完成复杂的查找、替换等处理要求。 re模块提供了正则表达式操作所需要的的…

    Linux 2023年6月7日
    0117
  • Redis 生产架构选型对比,一文整治选择困难症

    前言 在写开源项目的时候,想到了要支持多种redis部署方式,于是对于这块的生产环境的架构选型展开调研。 一、引擎版本 推荐使用更新的引擎版本以支持更多的特性, Redis 6.0…

    Linux 2023年6月8日
    085
  • Python 中 map() zip() list() 函数的介绍

    map() map(function , iterable, ….) : 依次将函数function作用在可迭代的list上,并返回对应的函数返回值,组成新的list(…

    Linux 2023年6月7日
    0106
  • 【Example】C++ 标准库 std::atomic 及 std::memory_order

    C++ 标准库提供了原子操作。(我已经懒得写序言了) ==================================== 先来说原子操作的概念: 原子操作是多线程当中对资源进…

    Linux 2023年6月13日
    076
  • Mac 睡眠唤醒 不睡眠 问题

    问题 之前一直有夜晚睡觉前电脑💻关机的习惯,主要是想着电脑也跟人一样♨️要休息😂。然后最近想着自己 Mac 干脆每天睡眠💤算了,省得每天开关机麻烦,所以就最近这段时间每次夜晚睡觉前…

    Linux 2023年6月7日
    088
  • 微服务的性能监控、压测和调优(转载自知乎:阿里自动化测试群)

    一、何为压力测试 性能压测是什么:就是考察当前 &#x8F6F;&#x4EF6;和 &#x786C;&#x4EF6;环境下,系统所能承受的 &amp…

    Linux 2023年6月8日
    0106
  • Docker从入门到精通

    1 容器简介1.1 什么是 Linux 容器1.2 容器不就是虚拟化吗1.3 容器发展简史2 什么是 Docker?2.1 Docker 如何工作?2.2 Docker 技术是否与…

    Linux 2023年6月7日
    080
  • 国产化之Arm64 CPU+银河麒麟系统安装.NetCore

    背景 某个项目需要实现基础软件全部国产化,其中操作系统指定银河麒麟,银河麒麟就是一个Linux发行版,数据库使用达梦V8,这个数据库很多概念和Oracle相似,CPU平台的范围:龙…

    Linux 2023年5月27日
    081
  • docker安装zabbix

    Zabbix 为每个组件都提供了 Docker 镜像 ,作为弹性和自给自足的容器,促使加快部署和更新过程。Zabbix 组件支持 MySQL 和 PostgreSQL 数据库、Ap…

    Linux 2023年6月6日
    086
  • Java动态脚本Groovy读取配置文件

    前言:请各大网友尊重本人原创知识分享,谨记本人博客: 南国以南i 核心涉及: @Value:作用是通过注解将常量、配置文件中的值、其他bean的属性值注入到变量中,作为变量的初始值…

    Linux 2023年6月14日
    075
  • Servlet版本冲突导致页面404

    先准备好了Tomcat环境以及用Idea打了一个Servlet war包想看看效果,结果发现页面跳转一直报404错误,检查了跳转url,项目结构等情况后,问题依旧没有解决。最后偶然…

    Linux 2023年6月7日
    088
  • MSSQL中UPDATE与 INNER JOIN联用的语法结构

    | 0.16分钟 | 267.2字符 | 1、引言&背景 2、解决方案 3、声明与参考资料 | SCscHero | 2022/4/30 PM9:36 | 系列 | 已完成…

    Linux 2023年6月14日
    077
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球