CSとDSとSSのリミットやベースを変えると高級言語の多くの処理系で問題が出てきます
(コード領域の定数やスタック上のデータをデータ領域のデータと同様に扱うため)

ページング機構で各プロセスのメモリ空間自体を分離するのが一般的だと思います
このモデルの利点は(一部の安価なCPUを除きますが)移植性が比較的高いことです
セグメント機構はx86に強依存するので積極的には使われていません
(例外はTOWNS-OSやOSASK、286を意識したWindows3.1のようなOS)

コード領域は読み込み専用ページにして保護
スタックの前後に読み書き不可ページを用意してオーバーフロー、アンダーフローを検知
オーバーフローを検知したら実ページを割り当てスタック伸長
タスクスイッチのスタック切り替えはページテーブル(のアドレスCR3)とESPを切り替える