我读到Linux是一个单片内核.单片内核是否意味着将完整的内核代码编译并链接到可执行文件中?
如果Linux能够支持模块,为什么不将所有子系统分解为模块并在必要时加载它们?在这种情况下,内核最初不必加载所有模块,并且可以维护模块中函数的索引并在必要时加载它们.
我现在要学习ARM Assembly,为我的Windows Mobile 5 iPAQ开发,但我有一些问题:
让我们用一个简单的C代码来设置寄存器:
int main()
{
int *a = (int*)111111;
*a = 0x1000;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我使用1级优化编译ARM(arm-none-eabi-gcc)代码时,汇编代码如下:
mov r2, #4096
mov r3, #110592
str r2, [r3, #519]
mov r0, #0
bx lr
Run Code Online (Sandbox Code Playgroud)
看起来地址111111被解析为最接近的4K边界(110592)并移动到r3,然后通过将519添加到110592(= 111111)来存储值4096(0x1000).为什么会这样?
在x86中,程序集很简单:
movl $4096, 111111
movl $0, %eax
ret
Run Code Online (Sandbox Code Playgroud) 这是一个简单的 NASM 64 位 linux 汇编程序:
_exit:
mov rax, 60
mov rdi, 0
syscall
Run Code Online (Sandbox Code Playgroud)
我的电脑是 AMD(x86_64 64 位),我知道这个汇编程序也可以在 INTEL 64 位处理器上运行。
但我有以下这些问题!