התחלנו את המסע אל ה-mmu בדרישת אבטחה ונוחות. אבל התעלמנו מבעיה פשוטה. אם המתכנת מסוגל לקרוא ולכתוב את אוגרי ה-mmu או לשנות כניסות בטבלת התירגום אזי בהקשר לאבטחה, די עבדנו לריק. עלנו למצוא דרך למנוע מהמתכנת הרגיל ("המשתמש") את היכול לשנות את אוגרי ה-mmu וביחד עם זאת לאפשר למערכת ההפעלה לשנות אוגרים אלו.
הפתרון שנמצא הוא שהמעבד "ידע" אם הוא מריץ את מערכת ההפעלה או את קוד המשתמש. לשם כך יש ביט (או שניים) שקובעים את מצב המעבד. בדרך כלל כשהביט הוא 0 המשמעות היא שהמעבד נמצא במצב קרנל (kernel mode). במצב זה המעבד רשאי לבצע את כל פקודות המכונה ולהשתמש בכל האוגרים הקיימים. המצב השני (ערך הביט הינו 1) נקרא מצב משתמש (user mode). במצב זה המעבד מסרב לבצע פקודות מכונה מסויימות ולגשת לאוגרים מסויימים. שימו לב שמתכנן המעבד הוא זה שקובע מה לא ניתן לעשות במצב משתמש.
אותן פקודות ואותם אוגרים שצריך להיות במצב קרנל כדי להשתמש בהן ובהם נקראים בעלי זכויות יתר (Privileged instructions and registers). בעברית נהוגה הזוועה הלשונית אוגרים פריבילגיים ופקודות פריבילגיות.
דוגמא לפקודה פריבילגית היא הפקודה halt המשמשת לעצירת המעבד. וכמובן, דוגמא לאוגרים פריבילגיים הם האוגרים המצויים בתוך ה-mmu.
כשהמעבד מתחיל בריצה הוא נמצא במצב קרנל. וכך מגיעים למערכת ההפעלה. כאשר מערכת ההפעלה מעבירה את המעבד להריץ תוכנית משתמש, היא מעבירה את המעבד למצב משתמש. קוד רגיל במצב משתמש לא מסוגל להעביר את המעבד למצב קרנל.
קלאסית, הדרך היחידה לעבור ממצב משתמש למצב קרנל היא על-ידי פסיקה. ואז כמובן יכנס קוד של מערכת ההפעלה לעבודה. היום יש פקודות מכונה שיכולות להעביר אותנו למצב קרנל, אבל תמיד נמצא את עצמנו בקוד של מערכת ההפעלה ולא בקוד משתמש.