我听说过"C Runtime","Visual C++ 2008 Runtime",".NET公共语言运行时"等等.
在Linux上编写汇编语言时,我可以使用INT指令进行系统调用.那么,运行时只是一堆预制函数将低级函数包装成更抽象的高级函数吗?但这不是更像是库的定义,而不是运行时的定义吗?
"运行时"和" 运行时库 "有两个不同的东西吗?
这些天,我想也许Runtime与所谓的虚拟机有一些共同点,比如JVM.这是导致这种想法的引文:
这个编译过程非常复杂,可以分解为几个抽象层,这些过程通常涉及三个转换器:编译器,虚拟机实现和汇编器.--- 计算系统的要素(介绍,道路到硬件土地)
该书C专家编程:深度C的秘密.第6章运行时数据结构是对此问题的有用参考.
如何在没有运行操作系统的情况下自行运行程序?你能创建计算机可以在启动时加载和运行的汇编程序,例如从闪存驱动器启动计算机并运行cpu上的程序吗?
我研究Linux内核并发现,对于int 0x80体系结构,中断syscall不能用于调用系统调用.
问题是:在int 0x80架构的情况下什么是更可取的int 0x80或syscall为什么?
编辑:我使用内核3.4
我一直在学习Windows中驱动程序开发的基础知识我一直在寻找Ring 0和Ring 3这两个术语.这些是指什么?它们与内核模式和用户模式相同吗?
有人可以向我解释在中断服务程序中发生了什么(虽然它取决于具体的例程,一般的解释就足够了)?这总是对我来说是一个黑盒子.
我们如何在x86 Linux中直接使用sysenter/syscall实现系统调用?有人可以提供帮助吗?如果您还可以显示amd64平台的代码,那就更好了.
我知道在x86中,我们可以使用
__asm__(
" movl $1, %eax \n"
" movl $0, %ebx \n"
" call *%gs:0x10 \n"
);
Run Code Online (Sandbox Code Playgroud)
间接路由到sysenter.
但是我们如何使用sysenter/syscall直接编码来发出系统调用呢?
我找到了一些材料http://damocles.blogbus.com/tag/sysenter/.但仍然难以弄明白.
在操作系统中,系统调用和中断之间有什么区别?所有系统调用都是中断吗?所有中断都是系统调用吗?
我想了解我们为什么使用int 80h以及在汇编代码中调用它后会发生什么。像这儿:
int 80h
mov eax,1
int 80h
Run Code Online (Sandbox Code Playgroud)
它怎么知道我要调用系统退出,而不只是在eax中保存十进制数?
首先,如果有人知道标准 C 库的一个函数,该函数无需查找二进制零即可打印字符串,但需要绘制字符数,请告诉我!
否则,我有这个问题:
void printStringWithLength(char *str_ptr, int n_chars){
asm("mov 4, %rax");//Function number (write)
asm("mov 1, %rbx");//File descriptor (stdout)
asm("mov $str_ptr, %rcx");
asm("mov $n_chars, %rdx");
asm("int 0x80");
return;
}
Run Code Online (Sandbox Code Playgroud)
GCC 将以下错误告知“int”指令:
"Error: operand size mismatch for 'int'"
Run Code Online (Sandbox Code Playgroud)
有人可以告诉我这个问题吗?
我想知道 strcpy 或 strcat 之类的函数是否会导致任何系统调用,还是由操作系统内部处理?
我知道这int 0x80会在 linux 中造成中断。但是,我不明白这段代码是如何工作的。它会返回一些东西吗?
代表什么$ - msg?
global _start
section .data
msg db "Hello, world!", 0x0a
len equ $ - msg
section .text
_start:
mov eax, 4
mov ebx, 1
mov ecx, msg
mov edx, len
int 0x80 ;What is this?
mov eax, 1
mov ebx, 0
int 0x80 ;and what is this?
Run Code Online (Sandbox Code Playgroud) 请注意,这个问题在这里已经有类似的答案,我想指出:
然而,这个问题更多地询问它们的返回格式以及它们如何相互关联(我认为上面的问题没有完全涵盖)。
_start和之间有什么区别main?在我看来,像ld用途_start,但gcc用途main为切入点。我注意到的另一个区别是main似乎返回值 in %rax,而_start返回值 in%rbx
以下是我看到的两种方式的示例:
.globl _start
_start:
mov $1, %rax
mov $2, %rbx
int $0x80
Run Code Online (Sandbox Code Playgroud)
并运行它:
$ as script.s -o script.o; ld script.o -o script; ./script; echo $?
# 2
Run Code Online (Sandbox Code Playgroud)
另一种方式:
.globl main
main:
mov $3, %rax
ret
Run Code Online (Sandbox Code Playgroud)
并运行它:
$ gcc script.s -o script; ./script; echo $?
3
Run Code Online (Sandbox Code Playgroud)
这两种方法有什么区别?是否main自动调用_start某处,或者它们如何相互关联?为什么一个返回它们的值,rbx而另一个返回它的值rax …
assembly ×6
system-calls ×6
linux ×5
x86 ×5
c ×3
x86-64 ×3
gcc ×2
bootloader ×1
driver ×1
interrupt ×1
linux-kernel ×1
nasm ×1
osdev ×1
terminology ×1
unix ×1