我想在没有编写内联汇编的情况下读取堆栈指针寄存器值.我想这样做的原因是因为我想将堆栈指针寄存器值分配给数组元素,我发现使用内联汇编访问数组很麻烦.所以我想做那样的事情.
register "rsp" long rsp_alias; <--- How do I achieve something like that in gcc?
long current_rsp_value[NUM_OF_THREADS];
current_rsp_value[tid] = rsp_alias;
Run Code Online (Sandbox Code Playgroud)
gcc有什么可能吗?
我处于一种情况,我需要在信号处理程序(SIGSEGV信号处理程序,根据我的知识,每个线程基础)内读取二进制搜索树(BST ).BST可以由应用程序中的其他线程修改.
现在由于信号处理程序不能使用信号量,互斥量等因而无法访问共享数据,我该如何解决这个问题呢?请注意,我的应用程序是多线程的,并在多核系统上运行.
该MMAP文件说,下面讲的标志MAP_NORESERVE.
不要为此映射保留交换空间.保留交换空间时,可以保证可以修改映射.如果没有保留交换空间,如果没有可用的物理内存,则可能在写入时获得SIGSEGV.
实际上我想要的只是保留虚拟内存地址而不是分配实际的物理内存.可以使用带有MAP_NORESERVE的mmap完成吗?如果我想使用任何物理内存,我会使用MAP_FORED再次在地址范围内使用MAP_NORESERVE通过mmap分配的地址范围内.
总而言之,我希望内核不为使用带有MAP_NORSERVE标志的mmap分配的内存保留任何物理页面.它是否真的像这样工作,或者如果内核有足够的物理内存,内核是否会分配物理页面?
在我的应用程序中,线程需要暂停一段时间(100个时钟周期).暂停的一种方法是调用nanosleep,但我想它需要对内核进行系统调用.现在我想暂停而不去内核.
请注意,我有足够的内核来运行我的线程,并且我将每个线程绑定到一个单独的内核,因此即使是可以暂停内核一段时间的指令也会很好.我正在使用x86.我只是希望线程在暂停时暂停.我不希望繁忙的循环或系统调用内核.是否有可能做到这一点?我可以暂停一个帖子的最短时间是多少?
我想在我的Ubuntu 64位系统上安装gcc 4.1.2,currentcly有gcc 4.4.我想继续使用当前的gcc,但也希望添加gcc 4.1.2.任何简单的方法,就是在我的系统上安装gcc 4.1.2?
我有两个宏,一个是用汇编编写的,另一个是用C编写的.第二个宏使用第一个宏.但是,我还想在volatile中使用程序集编写第二个宏,因此我可以在代码中控制它的位置.请注意,tid是运行时值,而不是像n那样的常量.
在汇编中写这个的好方法是什么?另外,是否可以通过volatile来控制C代码的放置?
#define SAVE_SP(n) __asm__ __volatile__ ("movq %rsp, msp"#n";" \
"movq ts"#n", %rsp;" \
)
#define SAVE_STACK_POINTER( tid ) \
switch( tid ) \
{ \
case 0: \
SAVE_SP( 0 ); \
break; \
case 1: \
SAVE_SP( 1 ); \
break; \
case 2: \
SAVE_SP( 2 ); \
break; \
case 3: \
SAVE_SP( 3 ); \
break; \
}
Run Code Online (Sandbox Code Playgroud) 我已经通过自己的malloc实现并免费使用mmap.现在,由于与free不同,munmap也将length作为参数,因此我将length作为附加信息放在映射的内存中.
我的malloc和free的代码如下所示.我想问一下,如果这段代码是好的还是我仍然遗漏任何东西或以错误的方式做某事.
void * malloc ( size_t size )
{
int *plen;
int len = size + sizeof( size ); // Add sizeof( size ) for holding length.
plen = mmap( 0, len, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, 0, 0 );
*plen = len; // First 4 bytes contain length.
return (void*)(&plen[1]); // Memory that is after length variable.
}
void free ( void * …Run Code Online (Sandbox Code Playgroud) 我试图使用这样的内联汇编,作为全局变量,但编译器通过对saved_sp的未定义引用给出错误.
__asm__ __volatile__ (
"movq saved_sp, %rsp\n\t" );
Run Code Online (Sandbox Code Playgroud)
saved_sp被声明为static long saved_sp全局(对于一个文件).我在这做什么错?
我正在写一个LLVM通行证.对于指令(llvm :: Instruction Class),如何检查指令是否为PHI指令?
有没有办法可以用OpenMP编译代码到C代码(将OpenMP部分翻译成普通的C),这样我就可以知道OpenMP生成了什么样的代码.我正在使用gcc 4.4编译器.