__GCC上的seg_fs。是否可以在程序中模拟它?

__GCC上的seg_fs。是否可以在程序中模拟它?,gcc,segments,Gcc,Segments,我刚刚阅读了有关在GCC中英特尔平台上支持%fs和%gs段前缀的内容。 有人提到,“获取基于%gs的指针或控制 %gs本身的值超出了gcc的范围;” 我正在寻找一种方法,可以手动设置%fs的值(我使用的是IA32,RH-Linux)并使用它。当我刚刚设置%fs=%ds时,下面的测试工作正常,这是意料之中的。但我无法更改测试以获得另一个%fs值,并且不会出现分段错误。我开始认为更改%fs的值不是唯一要做的事情。因此,我正在寻找一个建议,如何使%fs寻址的内存部分不等于DS #include <

我刚刚阅读了有关在GCC中英特尔平台上支持%fs和%gs段前缀的内容。 有人提到,“获取基于%gs的指针或控制 %gs本身的值超出了gcc的范围;”

我正在寻找一种方法,可以手动设置%fs的值(我使用的是IA32,RH-Linux)并使用它。当我刚刚设置%fs=%ds时,下面的测试工作正常,这是意料之中的。但我无法更改测试以获得另一个%fs值,并且不会出现分段错误。我开始认为更改%fs的值不是唯一要做的事情。因此,我正在寻找一个建议,如何使%fs寻址的内存部分不等于DS

#include <stddef.h>

typedef char __seg_fs fs_ptr;
fs_ptr p[] = {'h','e','l','l','o','\0'};

void fs_puts(fs_ptr *s)
{
    char buf[100];

    buf[0] = s[0];
    buf[1] = s[1];
    buf[2] = s[2];
    buf[3] = '\0';

    puts(buf);
}

void __attribute__((constructor)) set_fs()
{
    __asm__("mov %ds, %bx\n\t"
            "add $0, %bx\n\t"      //<---- if fs=ds  then the program executes as expected. If not $0 here, then segmentation fault happens.        
            "mov %bx, %fs\n\t");
}

int main()
{
    fs_puts(p);

    return 0;
}         
#包括
typedef char_uuseg_fs_ptr;
fs_ptr p[]={'h','e','l','l','o','0'};
无效fs\U看跌期权(fs\U ptr*s)
{
char-buf[100];
buf[0]=s[0];
buf[1]=s[1];
buf[2]=s[2];
buf[3]='\0';
put(buf);
}
void uuu属性uuu((构造函数))集合fs()
{
__asm_uu u u u u;(“mov%ds,%bx\n\t”

“添加$0,%bx\n\t”//我已经和Armin谈过了,他在GCC中实现了uuu seg\u gs/uuu seg\u fs(谢谢Armin!)。 所以基本上我不能用这些关键字来表示全局变量。引入u seg_gs/fs的目的是为了能够动态分配线程本地的内存区域。 我们不能使用_线程作为指针,也不能使用malloc为其分配内存。但是_seg_gs/fs引入了这种可能性。 下面的测试某种程度上说明了这一点。 请注意,使用了arch_prctl()。它仅作为64位版本存在。 还要注意的是%fs用于64位上的_线程,而%gs是空闲的

#include <stddef.h>
#include <string.h>
#include <stdio.h>
#include <asm/ldt.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <sys/prctl.h>
#include <asm/prctl.h>
#include <sys/syscall.h> 
#include <unistd.h> 

typedef __seg_gs char gs_str;

void gs_puts(gs_str *ptr)
{
    int i;
    char buf[100];
    for(i = 0; i < 100; i++)
        buf[i] = ptr[i];

    puts(buf);
}

int main()
{
    int i;
    void *buffer = malloc(100 * sizeof(char));

    arch_prctl(ARCH_SET_GS, buffer);

    gs_str *gsobj = (gs_str *)0;
    for (i = 0; i < 100; i++)
        gsobj[i] = 'a';       /* in the %gs space */

    gs_puts(gsobj);

    return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
类型def_uuuseg_gs char gs_str;
无效gs_看跌期权(gs_str*ptr)
{
int i;
char-buf[100];
对于(i=0;i<100;i++)
buf[i]=ptr[i];
put(buf);
}
int main()
{
int i;
void*buffer=malloc(100*sizeof(char));
arch_prctl(arch_SET_GS,缓冲器);
gs_str*gsobj=(gs_str*)0;
对于(i=0;i<100;i++)
%gs空间中的gsobj[i]='a';/**/
gs_看跌期权(gsobj);
返回0;
}