如果内核控制系统,汇编语言如何工作?
汇编语言是一组计算机“理解”的助记符和各种宏,以使某些任务更容易完成。
如果没有向操作系统发出请求,汇编语言如何控制CPU和内存?
例如,如果我想执行指令mov ax,#4
,难道不需要我的程序向操作系统发送请求才能执行吗?
我真的很好奇...
谢谢!
如果内核控制系统,汇编语言如何工作?
汇编语言是一组计算机“理解”的助记符和各种宏,以使某些任务更容易完成。
如果没有向操作系统发出请求,汇编语言如何控制CPU和内存?
例如,如果我想执行指令mov ax,#4
,难道不需要我的程序向操作系统发送请求才能执行吗?
我真的很好奇...
谢谢!
eax
没有受到保护,但调试寄存器如DR0
是受保护的。in
和out
指令是特权指令,不能在ring 3中执行。其他特权指令包括对/来自控制寄存器的mov
。
内存通过TLB受到保护,它还用于定义用户模式进程可见的虚拟内存(VM)地址范围。这个表控制着每个进程可见的内存空间。TLB缓存页表,这些页表存储在只有ring 0操作系统可以修改的内存中。同样,中断向量和任何内存映射设备都被分配给只有操作系统才能访问的内存范围。(操作系统可以将这些页面映射到用户空间进程中,但这可能会让用户空间接管机器。)
当您执行例如mov [eax], edx
时,CPU将在TLB中查找eax所引用的地址。根据TLB中的访问位来确定指令是否合法地访问内存。(这些信息来自于page table entry,例如需要设置R/W位才能允许存储到内存。否则会引发#PF页故障异常,操作系统可以捕获并处理通过写时复制并返回到用户空间以重新运行指令:软页故障。或者决定是用户空间的错误(无效页故障)并发送SIGSEGV信号,用分段错误终止进程。如果不是Unix,则可以使用任何术语)。eax
这样的通用寄存器会保存在操作系统维护的每个线程的内存区域中。要切换的线程会从其先前寄存器值的内存映像中恢复。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如果我错了,请纠正我,但这些汇编指令是直接发给CPU的指令。它们不需要其他操作系统来执行。我相信这个this">YouTube视频可以真正向你展示如何使用汇编语言制作操作系统。