曾几何时,为了编写x86汇编程序,你会得到一条说明"加载EDX寄存器的值为5","递增EDX"寄存器等的指令.
对于具有4个核心(甚至更多)的现代CPU,在机器代码级别上它看起来就像有4个独立的CPU(即只有4个不同的"EDX"寄存器)?如果是这样,当你说"递增EDX寄存器"时,是什么决定了哪个CPU的EDX寄存器递增?现在x86汇编程序中是否存在"CPU上下文"或"线程"概念?
核心之间的通信/同步如何工作?
如果您正在编写操作系统,那么通过硬件公开哪种机制可以让您在不同的内核上安排执行?这是一些特殊的特权指示吗?
如果您正在为多核CPU编写优化编译器/字节码VM,那么您需要具体了解x86,以使其生成能够在所有内核中高效运行的代码?
对x86机器代码进行了哪些更改以支持多核功能?
如何在没有运行操作系统的情况下自行运行程序?你能创建计算机可以在启动时加载和运行的汇编程序,例如从闪存驱动器启动计算机并运行cpu上的程序吗?
根据Linux程序员手册:
brk()和sbrk()改变程序中断的位置,它定义了进程数据段的结束.
这里的数据段意味着什么?是仅仅将数据段或数据,BSS和堆组合在一起?
根据维基:
有时,数据,BSS和堆区域统称为"数据段".
我认为没有理由改变数据段的大小.如果它是数据,BSS和堆集合那么它是有意义的,因为堆将获得更多的空间.
这让我想到了第二个问题.在我到目前为止阅读的所有文章中,作者都说堆积增长,堆栈向下增长.但是他们没有解释的是当堆占用堆和堆栈之间的所有空间时会发生什么?

内核空间和用户空间有什么区别?内核空间,内核线程,内核进程和内核堆栈是否意味着相同的事情?另外,为什么我们需要这种区别?
通过考虑将内存分为四个部分:数据,堆,堆栈和代码,全局变量,静态变量,常量数据类型,局部变量(在函数中定义和声明),变量(在main函数中),指针,并动态分配空间(使用malloc和calloc)存储在内存中?
我认为他们将分配如下:
char *arr,int *arr)------->堆我只是从C的角度来指这些变量.
如果我错了,请纠正我,因为我是C的新手.
用户模式和内核模式之间有什么区别,为什么以及如何激活它们中的任何一个,以及它们的用例是什么?
来自wiki 可执行文件和可链接格式:
这些段包含运行时执行文件所必需的信息,而段包含用于链接和重定位的重要数据.整个文件中的任何字节最多只能由一个部分拥有,并且可能存在不属于任何部分的孤立字节.
但是段和段之间有什么区别?在可执行的ELF文件中,段是否包含一个或多个部分?
假设有一个指针,我们用NULL初始化它.
int* ptr = NULL;
*ptr = 10;
Run Code Online (Sandbox Code Playgroud)
现在,程序将崩溃,因为ptr没有指向任何地址,我们正在为其分配一个值,这是一个无效的访问.那么,问题是,操作系统内部会发生什么?是否发生页面错误/分段错误?内核甚至会在页面表中搜索吗?或者崩溃发生在那之前?
我知道我不会在任何程序中做这样的事情,但这只是为了知道在这种情况下OS或编译器内部发生了什么.这不是一个重复的问题.
我一直在学习Windows中驱动程序开发的基础知识我一直在寻找Ring 0和Ring 3这两个术语.这些是指什么?它们与内核模式和用户模式相同吗?