assembly - 汇编如何在操作系统上工作?

标签 assembly operating-system

如果内核控制了系统,汇编语言如何工作?

汇编语言是作为计算机“理解”的助记符集合而引入的 以及各种宏,使某些任务变得更容易。

如果程序集在不发出请求的情况下无法控制 CPU 和内存,那么它如何控制 CPU 和内存呢? 到操作系统?

例如,如果我想要执行指令 mov ax, #4,我是否不需要我的程序向操作系统发送请求才能执行此操作?

我真的很好奇...

谢谢!

最佳答案

CPU 具有协助操作系统保护资源的机制。让我们使用 x86 芯片的示例。 “通用”寄存器,例如eax,不 protected 。但调试寄存器,例如 DR0,是。

当操作系统运行时,CPU 在“ring 0”或人们所说的通用术语“系统模式”下执行。这些程序在 x86 上运行“ring 3”,或者人们所说的“用户模式”。

当执行从环 3 更改为环 0 时(稍后详细介绍如何完成),CPU 会放弃用户模式的保护。这就是允许操作系统更改调试寄存器的原因。

但是,操作系统保护的主要内容是内存位置和设备输入/输出。因此,inout 指令具有特权,并且可能无法在环 3 执行。其他特权指令包括 mov to/from控制寄存器。

内存通过 TLB 进行保护,TLB 还用于定义用户模式进程可见的虚拟内存 (VM) 地址范围。正是这个表控制了每个进程可见的内存空间。 TLB 缓存page tables ,它们存储在内存中,只有ring 0操作系统可以修改。类似地,中断向量和任何内存映射设备都被分配到只有操作系统可以访问的内存范围。 (操作系统可以将这些页面映射到用户空间进程中,但这可能会让用户空间接管机器。)

当您执行例如 mov [eax], edx 时,会在 TLB 中查找 eax 引用的地址。 CPU根据TLB中的访问位来确定该指令是否合法地访问存储器。 (这些来自 page table entry ,例如,需要设置 R/W 位以允许该存储到内存运行。否则,它将引发操作系统可以捕获的 #PF 页面错误异常。并通过执行复制来处理写时并返回到用户空间重新运行指令:软页面错误。或者确定这是用户空间的错误(无效页面错误)并发送 SIGSEGV 信号,以段错误终止进程。或者操作系统的任何术语想要使用,如果不是 Unix。)

当操作系统调度程序交换进程时,通用寄存器(例如 eax)将保存在操作系统维护的每线程内存区域中。被切换到的线程从先前寄存器值的内存镜像中恢复。

如果操作系统干扰每条机器指令,计算机将会变得非常慢。特别是,应尽可能快地维持对通用寄存器的访问。内存访问的 TLB 查找会被缓存,并且不会比内存访问本身慢。

要从环 3 切换到环 0,会生成软件中断。这就是“系统调用”中断。中断在环 0 运行,并在第一个进程开始之前由操作系统配置。系统调用中断将控制权转移给操作系统代码。当执行从中断服务程序返回时,CPU 返回到环 3。

关于assembly - 汇编如何在操作系统上工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15096635/

相关文章:

linux - 无法运行与 libc 链接的可执行文件

c - 这个程序中的 child 将如何运行?

debugging - 如何查看日志消息的写入情况?

c - 从/proc/pid/stat中的tty_nr属性获取次设备号

assembly - 使用 GoLink 链接 MinGW .a 静态 C 库

assembly - 便宜的PowerPC评估板?

assembly - 将 32 位值加载到 arm 组件中的寄存器

c++ - 是否可以在Windows XP下用普通的C++程序覆盖代码段?

c - 虚拟地址如何转换为其后备存储上的物理地址?

c++ - 创建 3 个子进程并在指定秒数后退出它们