1. 程式人生 > >linux0.11核心空間與使用者空間資料交換

linux0.11核心空間與使用者空間資料交換

學習linux到現在對於這個問題一直都沒有在意,細看程式碼時發現這確實是一個大問題,並且感覺很巧妙,具體在segment.h檔案中函式實現。

當用戶程序執行系統呼叫進入核心空間時,所有段都指向核心段,但是fs卻除外,它需要扮演負責核心空間與使用者空間資料的交換的重要角色。其中一個典型的例子就是printk函式,在核心空間中如果要列印一串資料,由於ds段指向核心空間,所以無法向用戶空間的tty0控制終端輸送資料,linux為了實現printk函式,將tty_write函式中的資料段強制指定為fs段(編譯器預設為ds,c=get_fs_byte(b)),由於fs被指定用於核心與使用者交換的段,所以在printk函式中可以直接呼叫tty_write函式向用戶空間列印核心中的資料。除了這個例子之外,還有一個sys_waitpid系統呼叫也使用到了這種操作方式,這個函式將核心得到的狀態資訊以指標變數形式傳輸到使用者空間。