汇编语言如何在操作系统上工作?

9

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

汇编语言是一组计算机“理解”的助记符和各种宏,以使某些任务更容易完成。

如果没有向操作系统发出请求,汇编语言如何控制CPU和内存?

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

我真的很好奇...

谢谢!


3
CPU不理解汇编语言,它只能理解机器指令,而汇编语言只是一种中间形式。此外,为什么您认为系统调用对汇编语言不可用? - Ed S.
我理解这一点。但是,我从来没有看到任何汇编请求许可使用寄存器,也没有请求许可访问/写入内存,也没有请求许可执行任何 CPU 操作。然而根据下面的回答,似乎内核会确保你执行的操作在内核分配的资源范围内。那么新的问题是,这是否意味着所有指令都必须经过内核? - Dmytro
1
编写一个 C 程序来执行任何操作,将其编译为汇编代码,你可以非常容易地“看到一个访问你想要访问的任何内容的汇编程序”。如果以错误的权限运行(尝试在应用程序空间中运行内核代码),如果你没有在编译器和汇编器之间“查看”汇编步骤,那么当然不会再起作用了。(大多数编译器,特别是 GCC,都会先编译成汇编代码,然后再进行汇编,因此你可以使用 save-temps 选项来查看任何程序的汇编代码)。 - old_timer
4个回答

13
CPU有机制协助操作系统保护资源。以x86芯片为例,“通用”寄存器如eax没有受到保护,但调试寄存器如DR0是受保护的。
当操作系统运行时,CPU在执行“ring 0”,或者人们通常称之为“系统模式”。程序在x86上运行在“ring 3”,或者人们通常称之为“用户模式”。
当执行从ring 3变为ring 0(稍后会更详细地介绍如何完成),CPU放弃了用户模式的保护。这就是允许操作系统更改调试寄存器的原因。
然而,操作系统保护的主要内容是内存位置和设备输入/输出。因此,inout指令是特权指令,不能在ring 3中执行。其他特权指令包括对/来自控制寄存器的mov

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

当您执行例如mov [eax], edx时,CPU将在TLB中查找eax所引用的地址。根据TLB中的访问位来确定指令是否合法地访问内存。(这些信息来自于page table entry,例如需要设置R/W位才能允许存储到内存。否则会引发#PF页故障异常,操作系统可以捕获并处理通过写时复制并返回到用户空间以重新运行指令:软页故障。或者决定是用户空间的错误(无效页故障)并发送SIGSEGV信号,用分段错误终止进程。如果不是Unix,则可以使用任何术语)。
当进程被操作系统调度器交换时,例如像eax这样的通用寄存器会保存在操作系统维护的每个线程的内存区域中。要切换的线程会从其先前寄存器值的内存映像中恢复。
"The computer would be incredibly slow if the OS interfered with every machine instruction. In particular, access to general registers should be maintained as fast as possible. The TLB look-ups for memory accesses are cached and not slower than the memory access itself."
"To switch from ring 3 to ring 0, a software interrupt is generated. This is the 'system call' interrupt. Interrupts run at ring 0, and are configured before the first process begins, by the OS. The system call interrupt transfers control to the OS code. When execution returns from the interrupt service routine, the CPU is returned to ring 3."

mov [eax], 3 的操作数大小不明确。 mov [eax],edx 可以避免这个问题,而无需使用 mov dword [eax],3(NASM)或 mov dword ptr [eax],3(MASM)覆盖。此外,NOEXEC位仅影响代码获取,对于CS:EIP获取编码该指令的机器代码字节。由于该指令写入内存,一个很好的例子是R / W位,需要设置该位以允许将数据存储到该页面中。https://wiki.osdev.org/Paging#Page_Table - Peter Cordes

5

只要您的程序没有访问其所在层级之外的资源/内存,它就可以运行任何指令。如果有这样的访问,它将会引发错误(分段违规或一般保护)并被内核杀死。


1
汇编语言只是一种像C或Pascal等编程语言一样的编程语言。为了使程序能够在计算机上执行,无论使用哪种语言,运行在计算机上的程序都必须是该计算机的机器码。许多/大多数语言都被组装成为汇编语言或编译成为高级语言的机器码以适应目标系统。有些语言(如Java、Python和某些Pascal)被编译成中间语言,这也是一种机器码,但随后由用某种编译为机器码的语言编写的程序在运行时进行解释。因此,机器码再次在计算机上运行。
无论你谈论什么语言,系统调用都是系统调用,并且内存限制和其他操作系统强制限制都适用。因此,无论是C还是汇编语言,您都可以进行系统调用来打开文件或将某些内容打印到终端等操作。

0

如果我错了,请纠正我,但这些汇编指令是直接发给CPU的指令。它们不需要其他操作系统来执行。我相信这个this">YouTube视频可以真正向你展示如何使用汇编语言制作操作系统。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接