用戶級代碼和系統級代碼的界限是被由硬件提供的硬件保護工具強制劃分的。內核操作是在單獨的地址空間進行,這個空間是用戶進程不能訪問的。有些有特權的操作(如開始I/O、中斷CPU)只能被內核使用。應用程序使用系統調用想操作系統請求服務。系統調用是用來讓內核執行一些復雜操作(如將數據寫入二級緩存)和一些簡單操作(如返回當前時間)。所有系統調用都是同步的:當內核執行一個與系統調用相關的動作時應用程序不能發生動作。在系統調用返回後,內核仍可以執行一些與系統調用相關的動作。例如write這個系統調用,它將從用戶進程的內存中拷貝數據到內核的緩沖,此時用戶進程必須等待;但是它通常在數據真正寫到磁盤之前就返回。
一個系統調用通常作為一個硬件閘來執行,它改變CPU的運行模式和當前的內存地址空間映像。在系統調用執行之前,內核會驗證用戶在為系統調用提供的參數。這種驗證確保系統的完整性。傳遞到內核的參數會被拷貝到內核的地址空間,這樣確保驗證的參數不會被改變。系統調用的執行結果被返回到硬件寄存器中或拷貝到用戶指定的內存地址。與傳遞到內核的參數一樣,存放返回結構的地址也要被驗證,以確保它是應用程序地址空間的一部分。如果內核在執行系統調用時遇到錯誤,它將返回一個錯誤碼給用戶。對於C語言來說,這個錯誤碼存儲在全局變量errno中,被用來執行系統調用的函數會返回-1。
用戶程序與內核操作彼此獨立。FreeBSD不會在用戶應用程序的地址空間中存儲I/O控制塊和其他與操作系統相關的數據結構。每個用戶級應用程序在執行時都會有一個獨立的地址空間。內核會產生很多無形中與進程有關的狀態,比如當一個進程運行時就會把另外一個進程掛起。