jjzjj

ucontext

全部标签

Linux协程艺术:探秘ucontext函数族的神奇世界

Linux操作系统提供了许多强大的系统调用和库函数,其中之一是ucontext函数族。这个函数族允许开发者控制程序的执行上下文,包括寄存器状态,以便实现一些高级的操作,比如协程调度。本文将深入解析ucontext函数族,从寄存器状态开始介绍,然后分析每个函数的具体实现代码,最后通过示例展示如何使用ucontext实现协程调度。寄存器在理解ucontext函数族之前,让我们先来了解一下寄存器状态。在Linux中,寄存器是CPU中的一组特殊的存储单元,它们用于存储程序执行过程中的数据和指令。ucontext函数族中的函数可以用来保存和恢复这些寄存器状态,实现上下文切换。常见的寄存器包括:EIP/R

linux - 获取关于段错误或崩溃的指令指针(针对 x86 JIT 编译器项目)?

我正在为生成x86代码的JavaScriptJIT编译器实现后端。有时,由于错误,我会遇到段错误。很难追溯是什么原因造成的。因此,我一直想知道是否有一些“简单”的方法来捕获段错误和其他此类崩溃,并获取导致错误的指令的地址。这样,我就可以将地址映射回已编译的x86程序集,甚至可以映射回源代码。这需要在Linux上运行,但最好在任何POSIX兼容系统上运行。在最坏的情况下,如果我无法捕获段错误并在运行的JIT中获取IP,我希望能够将其捕获到外部(内核日志?),也许只是让编译器转储一个大文件将地址映射到指令,我可以将其与Python脚本或其他东西相匹配。任何想法/建议都将受到赞赏。如果您曾经

linux - 获取关于段错误或崩溃的指令指针(针对 x86 JIT 编译器项目)?

我正在为生成x86代码的JavaScriptJIT编译器实现后端。有时,由于错误,我会遇到段错误。很难追溯是什么原因造成的。因此,我一直想知道是否有一些“简单”的方法来捕获段错误和其他此类崩溃,并获取导致错误的指令的地址。这样,我就可以将地址映射回已编译的x86程序集,甚至可以映射回源代码。这需要在Linux上运行,但最好在任何POSIX兼容系统上运行。在最坏的情况下,如果我无法捕获段错误并在运行的JIT中获取IP,我希望能够将其捕获到外部(内核日志?),也许只是让编译器转储一个大文件将地址映射到指令,我可以将其与Python脚本或其他东西相匹配。任何想法/建议都将受到赞赏。如果您曾经

c - linux 上不再定义类型 `stack_t` 了吗?

Linux平台为Ubuntu12.04我的源代码中包含以下header:#include#include#include...然而,当我编译它时,它会提示/usr/include/x86_64-linux-gnu/sys/ucontext.h:139:5:error:unknowntypename'stack_t'我google了一下,发现stack_t应该定义在signal.h里,可是这里好像没有定义? 最佳答案 这是一个评论,但我不能让它在那里可读。对不起。你是否#define以下之一:_BSD_SOURCE||_XOPEN_S

c - linux 上不再定义类型 `stack_t` 了吗?

Linux平台为Ubuntu12.04我的源代码中包含以下header:#include#include#include...然而,当我编译它时,它会提示/usr/include/x86_64-linux-gnu/sys/ucontext.h:139:5:error:unknowntypename'stack_t'我google了一下,发现stack_t应该定义在signal.h里,可是这里好像没有定义? 最佳答案 这是一个评论,但我不能让它在那里可读。对不起。你是否#define以下之一:_BSD_SOURCE||_XOPEN_S

linux - 在 SIGSEGV 上使用 sigaction 处理程序时如何识别页面错误的读取或写入操作?(LINUX)

我使用sigaction来处理pagefault异常,handler函数是这样定义的:voidsigaction_handler(intsignum,siginfo_t*info,void*_context)因此通过读取info->si_addr很容易得到缺页地址。问题是,如何知道这个操作是内存READ还是WRITE?我发现_context参数的类型是ucontext_t定义在/usr/include/sys/ucontext.h在mcontext_t中定义了一个cr2字段,可惜只有在x86_64没有定义的情况下才有效,所以无法用cr2来识别读写操作。另一方面,在/usr/includ

linux - 在 SIGSEGV 上使用 sigaction 处理程序时如何识别页面错误的读取或写入操作?(LINUX)

我使用sigaction来处理pagefault异常,handler函数是这样定义的:voidsigaction_handler(intsignum,siginfo_t*info,void*_context)因此通过读取info->si_addr很容易得到缺页地址。问题是,如何知道这个操作是内存READ还是WRITE?我发现_context参数的类型是ucontext_t定义在/usr/include/sys/ucontext.h在mcontext_t中定义了一个cr2字段,可惜只有在x86_64没有定义的情况下才有效,所以无法用cr2来识别读写操作。另一方面,在/usr/includ

c++ - ucontext 和线程本地存储

我问的平台是linux。我说的线程本地存储是gcc中的pthread_xxx或__thread。我想在我的程序中使用ucontext东西,即makecontext、swapcontext等。所以我的问题是,它如何与线程本地存储一起使用?更具体地说,如果我使用swapcontext或setcontext切换到另一个纤程,线程本地存储是否也会发生变化,或者线程本地存储不是上下文的一部分?另一个问题:如果TLS将被setcontext/swapcontext更改,那么无论我如何更改上下文,是否有任何东西会坚持线程?另一方面,如果TLS将坚持上下文,那么是否有任何东西会坚持线程并且不会被set

c - 在 OS X 上通过 ucontext 访问 EIP 和 EBP

我正在尝试将一个工具移植到osx,该工具设计用于在linux和freebsd上运行。程序中有一个案例需要访问EIP和EBP。这是通过ucontext完成的。所以我为__APPLE__添加了一个案例,以放置对ucontext结构的适当访问。9887#ifdefined(__FreeBSD__)9888*paddr=uc->uc_mcontext.mc_eip;9889#elifdefined(__dietlibc__)9890*paddr=uc->uc_mcontext.eip;9891#elifdefined(__APPLE__)9892*paddr=uc->uc_mcontext.s

c - valgrind 错误和 ucontext。为什么是 "Use of uninitialised value of size 8"?

我一直在努力理解为什么valgrind会为这个使用ucontexts的小测试程序提示“使用大小为8的未初始化值”。它基本上是一个创建“n_ucs”ucontext并切换它们“max_switch”次的程序。我理解“警告:客户端切换堆栈?”(这基本上就是程序的全部内容),但我无法真正理解所有“使用大小为8的未初始化值”如果Valgrind错误是误报,或者这个程序是否存在根本性错误,我想获得一些帮助。(我在使用相同机制的更大的程序中看到了很多,但我已将其提炼到最低限度以在此处发布)。感谢任何帮助。谢谢,jack#include#include#include#include#defineS
12