摘要
搭建开发测试环境程序分析地址、vstartCPU工作原理
中央处理器的工作原理
1.构建开发测试环境(MacOS)
1.1安装一些必要的工具
#安装汇编编译器brewinstallnasm#安装虚拟机brewinstallqemu
1.2测试代码
这段代码的作用是在屏幕上打印“hello os”。这个代码这里就不做过多解释了。这段代码主要是为了后面介绍几个基本概念。
;主引导程序SECTION MBR vstart=0x7c00 mov ax,cs mov ds,ax mov es,ax mov ss,ax mov fs,ax mov sp,0x7c00 mov ax,0x600 mov bx,0x700 mov cx,0 mov dx,0x184f int 0x10 mov ah,3 mov bh,0 int 0x10 mov ax,message mov bp,ax mov cx,8 mov ax,0x1301 mov bx,0x2 int 0x10 jmp $ message db \"hello os\" times 510-($-$$) db 0 db 0x55,0xaa
1.3运行程序
#编译汇编程序nasm-oprint.binprint.S#创建虚拟机镜像qemu-imgcreate-frawvm1.raw1G#将编译后的汇编程序写入第一个扇区ddif=print.binof=vm1.rawbs=512count=1conv=notrunc#启动虚拟机qemu-system-x86_64vm1.raw
启动后,效果如下:
2.程序分析
如何加载操作系统已经讲过如何加载我们的操作系统了。在加载操作系统的时候,我们提到了主引导程序。上面的代码其实相当于MBR程序(不过这里不是引导加载操作系统,只是在屏幕上打印一句话)。
完成自检等初始化操作后,BIOS会跳转到固定的0x7c00来执行主引导程序,所以我们的代码用vstart=0x7c00来表示我的代码会在内存的0x7c00初始化。
所以我们启动虚拟机后,BIOS在完成操作后会跳转到我们的程序,然后CPU根据我们程序的指令执行,最后屏幕上会打印出hello os。
3.vstart地址
是源代码文件中的符号与文件开头之间的距离。通常,文件的默认起始地址是0。
在我们的应用程序使用vstart后,应用程序将获得一个虚拟起始地址,无论它是虚拟地址还是真实地址。只要这个地址给了地址总线,地址总线就会在这个地址查找内容。因此,如果在开发中使用vstart,必须确保程序将出现在物理内存中的这个地址。
4.中央处理器的工作原理
CPU的工作模式分为实模式和保护模式,实模式最大寻址空为1M。我们会在后续解释真实模式和保护模式。在介绍这两种模式之前,先说一下CPU的工作原理。
CPU唯一的任务就是执行指令。在执行指令的过程中,CPU需要的是三个部件的配合:
控制单元运算单元存储单元
控制单元是中央处理器的核心。只有通过控制单元,CPU才能知道下一步需要做什么。控制单元大致由三部分组成:
指令寄存器IR指令译码器ID操作控制器OC
当我们的应用程序(即指令)加载到存储器中时,指令指针寄存器IP指向存储器中要执行的下一条指令。在指令被发送到地址总线之后,控制单元将获取指令并将其加载到指令寄存器IR中。这时,指令只是一串数字和字母。如果CPU想知道它真正的执行含义,就必须借助指令解码器ID,按照指令格式对这串数字和字母进行解码和分析。IA32(x86)指令格式如下:
在前缀指令格式中,是可选模块,操作码面向mov、jmp等。在我们的应用程序中。寻址方法分为基址寻址、索引寻址等。(稍后详述),操作数类型记录使用的寄存器。立即数和偏移量分别对应于我们在寻址过程中使用立即数还是偏移量。
内存单元是指CPU中的L1、L2缓存和寄存器,用于存储指令中使用的数据。
指令和数据完善后,控制单元中的操作控制器会向相关组件发送信号,开始执行。
感谢您的阅读。码字不容易。如果你觉得还可以,请“点赞”,这是对我最大的鼓励!!
以上就是由优质生活领域创作者 嘉文社百科网小编 整理编辑的,如果觉得有帮助欢迎收藏转发~
本文地址:https://www.jwshe.com/612680.html,转载请说明来源于:嘉文社百科网
声明:本站部分文章来自网络,如无特殊说明或标注,均为本站原创发布。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。分享目的仅供大家学习与参考,不代表本站立场。