Tópicos compartilham tudo [1]. Há um espaço de endereço para todo o processo.
Cada encadeamento possui sua própria pilha e registradores, mas as pilhas de todos os encadeamentos são visíveis no espaço de endereço compartilhado.
Se um segmento alocar algum objeto em sua pilha e enviar o endereço para outro segmento, os dois terão acesso igual a esse objeto.
Na verdade, acabei de perceber um problema mais amplo: acho que você está confundindo dois usos da palavra segmento .
O formato do arquivo de um executável (por exemplo, ELF) possui seções distintas, que podem ser chamadas de segmentos, contendo código compilado (texto), dados inicializados, símbolos de vinculador, informações de depuração etc. Não há segmentos de pilha ou pilha aqui, já que essas são construções apenas em tempo de execução.
Esses segmentos de arquivos binários podem ser mapeados no espaço de endereço do processo separadamente, com permissões diferentes (por exemplo, executável somente leitura para código / texto e não-executável de copiar na gravação para dados inicializados).
Áreas desse espaço de endereço são usadas para diferentes propósitos, como alocação de heap e pilhas de encadeamentos, por convenção (imposta pelas bibliotecas de tempo de execução do idioma). É tudo apenas memória e provavelmente não é segmentado, a menos que você esteja executando no modo 8086 virtual. A pilha de cada encadeamento é um pedaço de memória alocado no momento da criação do encadeamento, com o endereço superior da pilha atual armazenado em um registro de ponteiro de pilha e cada encadeamento mantém seu próprio ponteiro de pilha junto com seus outros registradores.
[1] OK, eu sei: máscaras de sinal, TSS / TSD etc. O espaço de endereço, incluindo todos os seus segmentos de programa mapeados, ainda é compartilhado.