メモリ管理がどのように低レベルになるかを理解しようとしており、いくつか質問があります。
1) Kip R. Irvine によるアセンブリ言語に関する本では、リアル モードでは、プログラムの開始時に、最初の 3 つのセグメント レジスタにコード、データ、およびスタック セグメントのベース アドレスがロードされると述べています。これは私には少しあいまいです。これらの値は手動で指定されていますか、それとも値をレジスタに書き込む命令をアセンブラが生成していますか? 自動的に行われる場合、これらのセグメントのサイズをどのように見つけますか?
2) 私は、Linux がフラット線形モデルを使用していることを知っています。つまり、非常に限られた方法でセグメンテーションを使用しています。また、Daniel P. Bovet と Marco Cesati による「Understanding the Linux Kernel」によると、GDT にはユーザー データ、ユーザー コード、カーネル データ、およびカーネル コードの 4 つの主要なセグメントがあります。4 つのセグメントはすべて、サイズとベース アドレスが同じです。タイプとアクセス権だけが異なる場合、なぜ 4 つが必要なのか理解できません (それらはすべて同じ線形アドレスを生成しますよね?)。それらの 1 つだけを使用して、その記述子をすべてのセグメント レジスタに書き込んでみませんか?
3) セグメンテーションを使用しないオペレーティング システムは、どのようにプログラムを論理セグメントに分割しますか? たとえば、セグメント記述子のないコードとスタックを区別する方法などです。ページングを使用してそのようなことを処理できると読みましたが、その方法がわかりません。