Linux では、カーネルとユーザー空間のセグメントにそれぞれ次の値が割り当てられていることを確認しました。
__KERNEL_CS = 0x60
__KERNEL_DS = 0x68
__USER_CS = 0x73
__USER_DS = 0x7b
Linux ソースを調べたところ、Linux が上記の値をこれらのセグメントに設定する場所を特定できませんでした。実際、次の割り当てを見つけました (/arch/x86/include/asm/segment.h):
#define __KERNEL_CS (GDT_ENTRY_KERNEL_CS * 8) /* 2*8 = 0x10 */
#define __KERNEL_DS (GDT_ENTRY_KERNEL_DS * 8) /* 3*8 = 0x18 */
#define __USER_DS (GDT_ENTRY_DEFAULT_USER_DS* 8 + 3) /* (5*8)+3 = 0x2B */
#define __USER_CS (GDT_ENTRY_DEFAULT_USER_CS* 8 + 3) /* (6*8)+3 = 0x33 */
これを理解するための助けをいただければ幸いです。