Segmentação registra uso

Estou tentando entender como o gerenciamento de memória está em baixo nível e tenho algumas perguntas.

1) Um livro sobre linguagem assembly de Kip R. Irvine diz que no modo real os primeiros três registradores de segmento são carregados com endereços básicos de código, dados e segmento de pilha quando o programa é iniciado. Isso é um pouco ambíguo para mim. Esses valores são especificados manualmente ou o montador gera instruções para gravar os valores em registradores? Se isso acontece automaticamente, como ele descobre qual é o tamanho desses segmentos?

2) Eu sei que o Linux usa modelo linear plano, ou seja, usa segmentação de maneira muito limitada. Além disso, de acordo com "Understanding the Linux Kernel", de Daniel P. Bovet e Marco Cesati, há quatro segmentos principais: dados do usuário, código do usuário, dados do kernel e código do kernel no GDT. Todos os quatro segmentos têm o mesmo tamanho e endereço base. Eu não entendo por que há necessidade em quatro deles se eles diferem apenas no tipo e direitos de acesso (todos eles produzem o mesmo endereço linear, certo?). Por que não usar apenas um deles e escrever seu descritor em todos os registradores de segmento?

3) Como os sistemas operacionais que não usam segmentação dividem os programas em segmentos lógicos? Por exemplo, como eles diferenciam pilha do código sem descritores de segmento. Eu li que a paginação pode ser usada para lidar com essas coisas, mas não entendo como.

questionAnswers(3)

yourAnswerToTheQuestion