好久沒寫網誌了....,實在是太懶了我,不過現在開始工作以後,開始更廣泛的接觸 Linux,希望能透過網誌紀錄一些資訊,並能分享出去。
什麼是 TTY? 這並不是我要說的重點,因此可以直接參考 wikipedia 的解釋。Linux 的 TTY driver,包括了一般的 console 介面,也包括了 serial driver,也就是連接到 modem 或是其他 RS232 的裝置等。現在我們來一個快速瀏覽,圖直接從 Linux Device Drivers 中偷來:
在這裡我們可以發現,對於 user program,他們只會接觸到 TTY core。而所有不同的各式裝置,則由 TTY line discipline 處理。以 serial driver 為例,我們可以看到整個程式的流程是這樣:
1. user program 透過 system call 呼叫 Linux kernel,對應的 functions 定義在 tty_io.c。在這裡面有定義 file_operations,也就是讀取裝置所對應到的各式功能如 read、write 等。tty_io.c,其實就扮演了 tty core 的腳色。相關各式 data structure 可以參考 tty.h tty_driver.h 等。
2. TTY core,接著呼叫 line discipline。什麼是 line discipline?我用 Google 找到最簡單的一句話:「Line disciplines are an elegant way to use the same serial device driver to run different technologies.」簡單來說,TTY core 才不管你底層是 console 還是 serial port,反正就負責跟 user program 溝通就對了,而針對各種不同裝置的程式,則從 line disipline 開始,再此之前並不分。像 serial driver 的 line discipline 就是 n_tty.c。( 不過我不清楚是否也有其他的裝置用這個 line discipline。 XD )
3. 接下來,才輪到的 TTY driver 啦!從 n_tty.c 的 write_chan() 中可以看到,他會呼叫 tty->ops->write(),也就是 TTY driver 註冊後的 function pointer。這裡有個地方我覺得 kernel 寫的有點鳥,就是他註冊 TTY driver 所需的 tty_operations 的名字叫做 uart_ops,然而這也是 serial driver 中的一個 structure,代表 uart 的各種 operations,因此實在很容易把這兩個搞混啊...。
4. OK,以上都是 kernel 幫大家準備好好的,那我們的 code 要放在哪?答案就是在這一層了,我們可以看到 uart_write() 內,會先到 uart_start(),最後會呼叫 port->ops->start_tx()。這個 port 代表 uart_port,也就是實際的硬體,因此我們實作的 driver functions,其實最後會連結到 port->ops,讓 serial core 可以直接呼叫。
這篇先寫這樣,剩下詳細的東西下次再說吧...XD,因為我也有點忘記了... Orz
留言列表