第一天 - hello world.md

hello world

一、基础知识

UEFI与BIOS的概念

1. BIOS

  • Basic Input Output System, 基本输入输出系统
  • 简介
    • 是一组固化到计算机内主板上一个daoROM芯片上的程序,它保存着计算机最重要的基本输入输出的程序、系统设置信息、开机后自检程序和系统自启动程序。担负着初始化硬件,检测硬件功能以及引导操作系统的任务
    • 简单来说,就是一段固化在在计算机主板上最基础的程序,负责最基础的硬件控制和设置,当计算机通电时运行,根据需求对主板进行初始化,为操作系统做准备。
  • 原理
    • BIOS是读取启动设备(在BIOS里配置的)第一个扇区的512字节,到是模式的0000:7C00这个地址上,同时寄存器BL里保存着当前启动的设备的设备号,这个设备号用于 INT 13 中断服务,如果这个扇区的最后两个字节是55AA,那么就跳转到7C00上,并转交控制权,有些BIOS还会把SP指向0x7BFE或者0x7FFE等位置

2. UEFI

  • Unified Extensible Firmware Interface, 统一的可扩展固件接口
  • 简介
    • UEFI可以看做是BIOS的升级版本,可提供更多的服务
  • 优化
    • BIOS是16位汇编语言程序,只能运行在16位实模式,可访问的内存只有1MB;UEFI是32位或64位高级语言程序(C语言程序),突破实模式限制,可以达到要求的最大寻址
    • UEFI启动bootloader的环境是保护模式,地址空间是4G(32位),同时CPU的基本的段页功能开启了
    • UEFI提供了多种设备的支持,包括文件系统、磁盘驱动、图形界面等
    • UEFI支持GPT分区表,GPT分区表支持2^64-1个扇区,也就是8589934592TB的磁盘(以512字节扇区计算),支持2TB以上的大硬盘;每个磁盘的分区个数几乎没有限制,分区大小也几乎没有限制

计算机的大概启动过程

  • 按下开机键,计算机通电
    • BIOS的一些设置信息和系统时钟信息存储在CMOS中,CMOS全称Complementary Metal Oxide Semiconductor(互补金属氧化物半导体
    • 按下开机键后,就会给CMOS通电,这里有维护一个系统时钟,在开机时告诉操作系统,当前时间,需要一直通电一直运行。
    • 台式机主板上的纽扣电池就是给CMOS供电的,如果没电了,BIOS设置信息就会丢失然后恢复到默认值,系统时钟也会停止
  • BIOS启动并自检(UEFI),检查硬件设备是否就绪
  • BIOS读取启动区的引导扇区IPL(操作系统硬盘/软盘/光驱的第一个扇区)到物理内存0x7c00~0x7dff除,然后跳转到 0x7c00处执行,把CPU交给IPL中的Boot程序
  • 执行IPL代码,加载并启动相应的操作系统

启动区 (boot sector)

  • 软盘的磁盘的一个扇区的大小是 512个字节,称为启动区
  • 计算机是从第一个扇区进行读取软盘的,然后再去检查扇区的最后两个字节(55 AA),没有这个结尾则计算机认为这不是一个启动程序,报错:不能启动

boot

  • 启动,操作系统自启动机制 - bootstrap

IPL

  • inital program loader : 启动程序加载器,也称为bootloader,操作系统引导程序
  • 因为操作系统太大,无法将整个系统放入启动区,而是将加载操作系统本身的程序放入启动区
  • 启动该程序后,将OS kernel加载到内存,然后启动真正的OS

CPU

  • 组成
    • 计算单元(ALU)、寄存器(Register)、缓存(Cache)、程序计数器(Program Counter)等部件组成
  • ALU
    • 用于逻辑运算
  • 寄存器与缓存
    • 寄存器更接近CPU,存取更快,但空间较小
    • CPU缓存,比寄存器慢,比物理内存块,但容量比寄存器大
  • 程序计数器(PC)
    • 存储指令执行的位置

物理内存

  • RAM,我们所说的计算机内存条
  • 形象比喻:
    • 寄存器类似于房间的床头柜(空间小),伸手就能拿到
    • CPU缓存类似于房间的衣柜(空间比寄存器大),需要起床去打开衣柜才能拿到
    • 内存相当于房子的杂物间(空间更大),需要离开房间,去杂物间拿东西,然后在返回房间
    • 硬盘相当于房子对面的仓库,需要走出房间,离开房子,然后把东西从仓库搬回杂物间

二、环境搭建

代码编辑器

  • 可以采用notepad++

  • 去官网下载并安装

    • 配置汇编语言,是的关键字高亮
      • language - A - Assembly

    image-20211230225542550

编译器

image-20211230230058771

  • 选择相应的平台

image-20211230230130539

  • 下载exe与zip随意选择一个进行下载,然后安装即可

给编辑器配置编译器

  • 配置环境变量,将nasm的安装目录添加到path环境变量中
  • 同时按下 win + R, 然后输入cmd,回车后进入命令行状态,进入汇编nasm源程序所在的目录,或者在文件管理器中,在nasm的目录上输入cmd进入
  • 编译:然后输入编译命令 nasm test1.asm -f bin -o test1.bin
    • -f 表示生成的文件格式
    • -o 表示生成的文件名

image-20211230232102881

  • 结果

    • image-20230226160027262
  • 打开Notepad++

    • 点击Run-run,获取弹窗
  • 输入以下内容

    • cod /k pushd "$(CURRENT_DIRECTORY)" & D:\ACERFILES\OLDE\PROGFILES\NASM\nasm.exe -f bin "$(FULL_CURRENT_PATH)" -o "$(NAME_PART).bin" & PAUSE & EXIT
    • 其中D:\ACERFILES\OLDE\PROGFILES\NASM\nasm.exe”应该改成你自己机器上实际的NASM安装路径
    • 如:cmd /k pushd "$(CURRENT_DIRECTORY)" & D:\APP\nasm\nasm.exe -f bin "$(FULL_CURRENT_PATH)" -o "$(NAME_PART).bin" & PAUSE & EXIT
  • 然后保存是给这个nasm添加一个名字和快捷键 ctrl F12

image-20211231005434357

  • 然后在菜单栏Run下会有你添加的名字和快捷键提示
  • 编译操作
    • 在需要编译的文件中,先保存源文件,然后点击Run-nasm,就会弹出编译完成的命令行窗口
    • 如果源程序不符合要求会报错
    • image-20211231005807731
  • 通过nodepad++ 按钮编译的正常结果如下
    • image-20230226170521826

hello world 运行

helloos0 - 二进制的方式制作一个 Hello world

  • 下载光盘下的tolset文件夹,将helloos0复制到tolset文件夹下
  • 光盘中的提供的程序文件
    • .img文件是一个 二进制性格式的运行文件,主要是输出内容在其中,可以采用[在线二进制编辑器](HexEd.it — 基于浏览器的十六进制编辑器)打开看看(自然不可能直接输入二进制代码,作者应该是想幽默的告诉我们所有程序都是二进制代码构成的)
    • image-20230226235020062
  • 按照书中的方式,在QUEM运行即可运行程序输出 Hello World
    • image-20230226234416746

helloos1 - 通过汇编代码 制作一个 Hello World

  • RESB 指令

    • reserve byte, 预约字节

    • 如果想要从当前位置向后空出10个字节来,并且填0,如果后面18万行全是0x00的话 使用本命令可以省去填写18万行0x00的时间

    • RESB 10
      
  • DB

    • data byte, 从当前位置往文件中直接写入 1 个字节
  • 在这里,RESB符填充了为00的二进制位

    • DB	0xeb, 0x4e, 0x90, 0x48, 0x45, 0x4c, 0x4c, 0x4f
      DB	0x49, 0x50, 0x4c, 0x00, 0x02, 0x01, 0x01, 0x00
      DB	0x02, 0xe0, 0x00, 0x40, 0x0b, 0xf0, 0x09, 0x00
      DB	0x12, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00
      DB	0x40, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x29, 0xff
      DB	0xff, 0xff, 0xff, 0x48, 0x45, 0x4c, 0x4c, 0x4f
      DB	0x2d, 0x4f, 0x53, 0x20, 0x20, 0x20, 0x46, 0x41
      DB	0x54, 0x31, 0x32, 0x20, 0x20, 0x20, 0x00, 0x00
      RESB	16
      DB	0xb8, 0x00, 0x00, 0x8e, 0xd0, 0xbc, 0x00, 0x7c
      DB	0x8e, 0xd8, 0x8e, 0xc0, 0xbe, 0x74, 0x7c, 0x8a
      DB	0x04, 0x83, 0xc6, 0x01, 0x3c, 0x00, 0x74, 0x09
      DB	0xb4, 0x0e, 0xbb, 0x0f, 0x00, 0xcd, 0x10, 0xeb
      DB	0xee, 0xf4, 0xeb, 0xfd, 0x0a, 0x0a, 0x68, 0x65
      DB	0x6c, 0x6c, 0x6f, 0x2c, 0x20, 0x77, 0x6f, 0x72
      DB	0x6c, 0x64, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00
      RESB	368
      DB	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0xaa
      DB	0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
      RESB	4600
      DB	0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
      RESB	1469432 
      
  • 在helloos1中

    • 方法1

      • 运行 !cons_nt.bat进入控制台

      • 运行以下代码即可得到一个镜像文件 helloos.img

        • ..\z_tools\nask.exe helloos.nas helloos.img
          
    • 方法2

      • 将上述代码写入asm.bat 文件中
      • 运行 !cons_nt.bat进入控制台,然后输入asm即可运行asm文件
    • 运行:控制台输入 run即可

heooos2 - 人性化的汇编方式 制作一个 Hello World

  • DW

    • data word 写入2个字节
  • DD

    • data double-word,写入两个字节
  • $

    • 一个变量,表示当前行的字节数,如前面输出了132行,$则表示132
  • 代码

    • ; hello-os
      ; TAB=4
      
      ; 以下这段是标准FAT12格式软盘专用代码
      DB		0xeb, 0x4e, 0x90
      DB		"HELLOIPL"		; 启动区的名称可以是任意的字符串(8字节)
      DW		512				; 每个扇区的大小(必须是512字节)
      DB		1				; 簇的大小(必须为1扇区)
      DW		1				; FAT的起始位置(一般从第一个扇区开始)
      DB		2				; FAT的个数(必须为而)
      DW		224				; 根目录的大小(一般设成224项)
      DW		2880			; 该磁盘的大小(必须是2880扇区)
      DB		0xf0			; 磁盘的种类(必须是0xf0)
      DW		9				; FAT的长度(必须是9扇区)
      DW		18				; 1个磁道有几个扇区(必须是18)
      DW		2				; 磁头数(必须是2)
      DD		0				; 不使用分区,必须是0
      DD		2880			; 重写一次磁盘的大小
      DB		0,0,0x29		; 意义不明,固定
      DD		0xffffffff		; (可能是)卷标号码
      DB		"HELLO-OS   "	; 磁盘的名称(11字节)
      DB		"FAT12   "		; 磁盘格式名称(8字节)
      RESB	18				; 先空出18字节
      
      ; 程序本体
      DB		0xb8, 0x00, 0x00, 0x8e, 0xd0, 0xbc, 0x00, 0x7c
      DB		0x8e, 0xd8, 0x8e, 0xc0, 0xbe, 0x74, 0x7c, 0x8a
      DB		0x04, 0x83, 0xc6, 0x01, 0x3c, 0x00, 0x74, 0x09
      DB		0xb4, 0x0e, 0xbb, 0x0f, 0x00, 0xcd, 0x10, 0xeb
      DB		0xee, 0xf4, 0xeb, 0xfd
      
      ; 信息显示部分
      DB		0x0a, 0x0a		; 两个换行
      DB		"hello, world"
      DB		0x0a			; 换行
      DB		0
      
      RESB	0x1fe-$			; 填写0xoo,直到0x001fe
      
      DB		0x55, 0xaa
      
      ; 以下是启动区以外部分的输出
      DB		0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
      RESB	4600
      DB		0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
      RESB	1469432
      

知识扫盲

  • TAB
    • tab宽度
  • FAT12
    • 用windows或MS-DOS格式化出来的软盘的格式
posted @   bingekong  阅读(33)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示