装配如何在操作系统上运行?

时间:2013-02-26 18:32:17

标签: assembly operating-system

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

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

如果在没有请求的情况下无法执行此操作,程序集如何控制CPU和内存 到操作系统?

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

我真的好奇......

谢谢!

3 个答案:

答案 0 :(得分:8)

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

当OS运行时,CPU正在“响铃0”或人们称之为“系统模式”的情况下执行以使用通用术语。这些程序在x86上运行“ring 3”,或者人们称之为“用户模式”。

当执行从环3更改为环0时(更多关于以后如何执行),CPU会删除用户模式的保护。这是允许操作系统更改调试寄存器的原因。

但是,受OS保护的主要内容是内存位置和设备输入/输出。因此,inout指令具有特权,可能不会在第3环执行。

通过TLB保护内存,TLB还用于定义用户模式进程可见的虚拟内存(VM)地址范围。正是这个表控制着每个进程可见的内存空间。 TLB本身存储在只有环0操作系统可以修改的存储器中。同样,中断向量和任何内存映射设备都分配给只有操作系统可以访问的内存范围。

执行时,例如mov [eax], 3,在TLB中查找eax引用的地址。 CPU根据TLB中的访问位(例如,NOEXEC位)确定该指令是否合法地访问存储器。

当OS调度程序交换进程时,通用寄存器如eax将保存在OS维护的每线程内存区域中。正在切换到的线程将从之前寄存器值的存储器映像中恢复。

如果操作系统干扰了每台机器指令,计算机将会非常慢。特别是,应尽快保持对通用寄存器的访问。内存访问的TLB查找缓存,并不比内存访问本身慢。

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

答案 1 :(得分:5)

您的程序可以运行它想要的任何指令,只要它不访问ring之外的资源/内存。如果是这样,它将产生错误(分段违规或一般保护)并被内核杀死。

答案 2 :(得分:1)

汇编语言只是一种编程语言,如C或Pascal或其他。为了使程序无论使用何种语言都可以执行,计算机上运行的程序必须是该计算机的机器代码。许多/大多数语言或者在汇编语言的情况下被组装,或者在更高级语言的情况下被编译成目标系统的机器代码。有些语言(Java,Python和Pascal)用中间语言编译成中间语言,这也是一个机器代码,但是在运行时由用某种语言编写的程序解释,编译成机器代码。所以机器代码再次在机器上运行。

无论你说的是什么语言,系统调用都是系统调用和内存限制,并且适用其他操作系统强加的限制。因此,无论是C语言还是汇编语言,您都可以进行系统调用以打开文件或将某些内容打印到终端或其他任何内容。