x86相关内容

PERF_EVENT_PARANOID==1实际上对x86 PERF施加了什么限制?

较新的Linux内核有一个可调的sysfs/proc/sys/kernel/perf_event_paranoid,允许用户为非根用户调整perf_events的可用功能,数字越大越安全(提供的功能相应较少): 从kernel documenation我们可以看到各种值的以下行为: PERF_EVENT_PARANOID: 控制非特权用户对Performance Events系统的使 ..
发布时间:2022-03-23 18:46:30 其他开发

线性内存地址、物理内存地址、逻辑内存地址和虚拟内存地址有什么不同?

我正在尝试阅读英特尔软件开发人员手册,以了解操作系统是如何工作的,这四个称谓词让我感到困惑。以下是我的理解,如果我错了,请纠正我。 线性地址:对隔离程序而言,它是以地址0开始长字符串内存。该程序的所有段都将从其线性地址寻址。它可能在RAM或磁盘中。 物理地址:出现在RAM或主内存管脚中的地址。 逻辑地址:磁盘和RAM中交换内存的组合。所有程序的所有线性内存都将留在逻辑地址空间中, ..
发布时间:2022-02-23 19:52:32 其他开发

x86上存储到加载转发失败的成本是多少?

在最近的x86体系结构上失败的存储到加载转发的成本是多少? 具体而言,由于加载部分与较早的存储重叠,或者较早的加载或存储跨越导致转发失败的某些对齐边界而失败的存储到加载转发。 当然会有延迟成本:它有多大?是否还有吞吐量成本,例如,失败的存储到加载转发是否使用其他加载和存储甚至其他非内存操作无法使用的额外资源? 当存储的所有部分都来自存储缓冲区时,与存储缓冲区和L1混合的情况有什么不同 ..

程序栈的增长方向究竟是什么?

我正在阅读 Richard Blum 的Professional Assembly Language,我对书中的不一致感到困惑,我想知道程序堆栈的增长方向到底是什么?这是第312页的图片,这表明程序堆栈长大了. 但是当我到达第 322 页时,我看到另一个版本,这表明程序堆栈变小了. 还有这个 解决方案 书不矛盾;每张图都在顶部显示更高的地址. 第一张图展示了一个向下增长的 ..
发布时间:2022-01-22 13:00:53 服务器开发

栈里面有什么?

如果我运行一个程序,就像 #include int main(int argc, char *argv[], char *env[]) {printf("我的引用在 %p, %p, %p\n", &argc, &argv, &env);} 我们可以看到这些区域实际上在堆栈中.但还有什么?如果我们循环遍历 Linux 3.5.3 中的所有值(例如,直到 segfault),我们 ..
发布时间:2022-01-22 12:56:31 其他开发

离开 x86 NASM 汇编语言中的函数时,堆栈是否会自动弹出?

例如让我们进入一个函数... push ebp ;保存 ebpmov ebp, esp ;将esp存入ebpsub esp, 4 ;将四个字节保存到堆栈中 然后退出函数... mov esp, ebp ;恢复esp的保存值pop ebp ;从栈中恢复 ebp 的值 (是的,我知道我可以使用进入和离开,但我更喜欢这种方式.) 我的问题是,当 esp 恢复时,堆栈上的四字节变量是被弹出还 ..
发布时间:2022-01-22 12:55:05 其他开发

x86 调用约定:堆栈传递的参数是否应该是只读的?

似乎最先进的编译器将堆栈传递的参数视为只读.请注意,在 x86 调用约定中,调用者将参数压入堆栈,而被调用者使用堆栈中的参数.比如下面的C代码: extern int goo(int *x);int foo(int x,int y){咕(&x);返回 x;} 由OS X 10.10中的clang -O3 -c g.c -S -m32编译成: .section __TEXT,__text,r ..
发布时间:2022-01-22 12:51:11 其他开发

推送一个寄存器会清空那个寄存器吗?

我已经阅读了很多有关这方面的书籍和说明,但是从未指定的一件事是,在将寄存器压入堆栈后会发生什么.例如,如果您在汇编中编写“push ECX",ECX 寄存器的内容将被压入堆栈(显然).我不知道的是,一旦你这样做了,ECX 寄存器是保留它在推送之前包含的值,还是在推送之后它自己清空? 解决方案 CPU 几乎总是 copy,而不是 copy + zero-the-src.尽管像 mov 这样的 ..
发布时间:2022-01-22 12:43:50 其他开发

让调用堆栈向上增长会使缓冲区溢出更安全吗?

每个线程都有自己的堆栈来存储局部变量.但堆栈也用于在调用函数时存储返回地址. 在 x86 汇编中,esp 指向最近分配的堆栈末端.今天,大多数 CPU 的堆栈都是负增长的.此行为通过溢出缓冲区并覆盖保存的返回地址来启用任意代码执行.如果堆栈正向增长,这样的攻击将不可行. 让调用堆栈向上增长是否更安全?为什么 Intel 设计 8086 时堆栈向下增长?他们是否可以在任何后来的 CPU ..
发布时间:2022-01-22 12:40:29 其他开发

使用带参数的函数在堆栈中的 ebp 和 esp 行为

我想了解有关堆栈的更多信息.特别是当调用带有参数的函数时会发生什么.为此,我编写了以下代码: #include 整数总和(整数 d,整数 e,整数 f){整数结果 = d + e + f;返回结果;}诠释主要(无效){int a = 5;诠释 b = 4;诠释 c = 2;int erg = sum(a,b,c);printf("结果是:%d", erg);} 我得到以下汇 ..
发布时间:2022-01-22 12:38:31 其他开发

x86 push/pop 可以小于 4 字节吗?

您好,我正在阅读弗吉尼亚大学关于 x86 的指南,其中指出推送和弹出堆栈要么删除堆栈,要么添加一个 4 字节数据元素. 为什么设置为 4 个字节?这可以改变吗,你能通过推送更小的数据元素来节省堆栈上的内存吗? 如果有人想查看该指南,可以在这里找到:http://www.cs.virginia.edu/~evans/cs216/guides/x86.html 解决方案 简答:是的 ..
发布时间:2022-01-22 12:33:09 其他开发

x86 堆栈指针指向哪里?

例如如果我推了 ax 是 [SP] 指向我的 ax 值还是 ax 后面的单词?它也不同于实模式和保护模式吗?我问这个是因为汇编艺术书说明和解释了 sp 指向最后推送的数据,并且在此页面上 OSDev Wiki- 堆栈它在最后一次推送数据后指向空字. 解决方案 维基百科说这里: 堆栈是通过隐式递减(推送)实现的,并且递增(弹出)堆栈指针.在 16 位模式下,此隐式堆栈指针寻址为 SS: ..
发布时间:2022-01-22 12:21:48 其他开发

堆栈分配,为什么会有多余的空间?

为了更好地掌握调用约定和堆栈的处理方式,我进行了一些尝试,但我不明白为什么 main 在设置堆栈时分配了三个额外的双字(在 ).它既不与 8 个字节对齐,也不与 16 个字节对齐,所以据我所知,这不是原因.如我所见,main 需要 12 个字节用于 func 和返回值的两个参数. 我错过了什么? 该程序是在 x86 架构上使用“gcc -ggdb"编译的 C 代码. 编 ..
发布时间:2022-01-22 12:19:23 其他开发

推入堆栈时出现分段错误(NASM)

我正在尝试运行一个 nasm 程序.以下代码: 段.data康泰航空:dt 1.11330e-10常量油:DT 2.33656e-10段 .text全局计算计算:移动 edx, 0推送ebp;mov ebp, esp;mov eax, [ebp + 8]ret 将 ebp 推入堆栈时出现分段错误(核心转储).这是为什么?我在 Ubuntu 虚拟机上运行此代码.有趣的是,有时我会收到“非法指令" ..
发布时间:2022-01-22 12:16:14 其他开发

奇怪的 MSC 8.0 错误:“ESP 的值未在函数调用中正确保存..."

我们最近尝试将我们的一些 Visual Studio 项目拆分为库,并且在一个测试项目中似乎一切都可以正常编译和构建,其中一个库项目作为依赖项.但是,尝试运行该应用程序给我们带来了以下令人讨厌的运行时错误消息: 运行时检查失败 #0 - ESP 的值未在函数调用中正确保存.这通常是调用使用不同调用约定声明的函数指针的结果. 我们甚至从未为我们的函数指定调用约定(__cdecl 等),将 ..
发布时间:2022-01-22 12:11:11 C/C++开发

“进入"vs“推送ebp;移动 ebp,特别是;sub esp, imm"和“离开"vs "mov esp, ebp;弹出 ebp"

enter和 有什么区别 推送ebpmov ebp, esp子 esp, 嗯 说明?有性能差异吗?如果是这样,哪个更快,为什么编译器总是使用后者? 与 leave 和 类似 mov esp, ebp流行音乐 说明. 解决方案 存在性能差异,尤其是enter.在现代处理器上,这解码到大约 10 到 20 µops,而三个指令序列大约是 4 到 6,具体取决于架构.有关详细信 ..
发布时间:2022-01-22 12:04:30 其他开发

堆栈上的局部变量分配顺序

看看这两个函数: void function1() {诠释 x;整数y;诠释z;诠释 *ret;}无效函数2(){字符缓冲区1 [4];字符缓冲区2[4];字符缓冲区3[4];诠释 *ret;} 如果我在 gdb 中的 function1() 处中断,并打印变量的地址,我会得到: (gdb) p &x$1 = (int *) 0xbffff380(gdb) p & y$2 = (int *) ..
发布时间:2022-01-22 12:01:43 其他开发