我正在编写一个应用程序,它报告 CPU 温度传感器和风扇速度监视器的读数。不过,根据Intel关于PECI的文档,所需的指令必须运行在ring 0模式,即内核模式,否则会抛出异常。
我在网上遇到了从保护模式转换到内核模式的代码,但是没有从用户模式转换到内核模式的代码,而且我读到它被内核禁止了。是否有解决方法,希望不需要修补内核,以允许最初处于用户模式的程序作为内核模式运行?
我知道有一个syscall约定,但是您在调用之前看到的调用约定是什么,int 80而不是syscall像这样调用。
mov rax,4 ; system call number (sys_write)
mov rbx,1 ; file descriptor (stdout)
mov rcx,hello ; message to write
mov rdx,12 ; message length
int 0x80 ; call kernel
Run Code Online (Sandbox Code Playgroud)
我在这里读到后面的参数rdx是esi, edi, ebp(或对于 x64 rsi, rdi, rbp),我没有看到它记录在Wikipedia 的调用约定页面中,但是int80h似乎表明 Windows 也使用这个约定?
这是什么约定俗成的名字。我可以在 Linux 内核源代码中的哪个位置看到它的定义?并且,rax当您调用时解析为过程的表在哪里int 0x80?对于syscall,sys_write是rax=1
我正在尝试将 kexec 构建为一个模块,但遇到了一个奇怪的问题。我的 obj-m 是:
obj-m += kexec.o machine_kexec.o relocate_kernel.o
当我运行 makefile 时,它抱怨说“没有规则可以制作 relocate_kernel.o 需要的目标 relocate_kernel.c”
我应该如何告诉它包含程序集文件?我查看了内核 Makefile,虽然我对它们不是很好,但似乎确实存在 .S > .o 的规则。我错了吗?
我想开始学习汇编语言,但所有的谷歌搜索都没有任何意义。我得到了一些Exec format error甚至使用过wine,这不利于理解。所以我想知道是否有人可以告诉命令行汇编程序将在x86-64架构上做什么,可能还有一些 Linux 的 hello world 示例?
在今天更新软件的过程中,我收到错误“文本文件繁忙”,这让我想知道:为什么 Unix(或 Linux)可执行文件被称为“文本”文件,而这看起来如此违反直觉和令人困惑?这背后的历史是什么?我猜可能与汇编程序的“文本”部分有关,但为什么将其称为“文本”?
这几乎不是一个理论问题,因为许多人已经这样做了,尽管关于底层过程的信息很少。
我正在开发一个基于 MIPS 的自定义处理器,我想在其上运行 Ubuntu。在您设计了指令集和计算机体系结构本身之后,我对接下来要做什么感到非常困惑。我需要能够运行内核和操作系统,但它们是如何联系在一起的?
目前我正在研究为 Linux 内核设计一个编译器来生成合适的汇编语言。这是一个好方法吗?之后我需要做什么?
链接器(用于在编译后执行链接)和加载器(用于执行可执行文件)的存在是否不依赖于诸如 Linux 之类的操作系统?(我曾想到 Linux 中的链接器和加载器,它们要么由操作系统提供,要么像其他应用程序一样由软件提供。现在我认为它们非常特殊且不同。无论安装哪个操作系统,它们都可能相同。)
链接器和加载器是否存在于机器语言即 ISA 级别?(在那个级别,没有操作系统。)还是汇编语言级别?
从编程软件的角度来看,将操作系统视为编程库(库)是否正确?
谢谢。
我想知道在哪里将链接器和加载器安装到计算机系统的级别/层中。
有关计算机系统的层/级别,请参阅 Nisan 的 The Elements of Computer Systems:
有关链接和加载,请参阅计算机系统:程序员的观点
assembly ×7
kernel ×3
linux ×3
development ×2
conventions ×1
executable ×1
history ×1
linker ×1
linux-kernel ×1
load ×1
make ×1
mips ×1
x86 ×1