首頁體育 > 正文

Linux tty子系統分析之三 tty驅動、裝置的註冊以及登出介面說明

2021-12-14由 資訊聯絡員 發表于 體育

在上一章中我們介紹了tty子系統相關的資料結構,本章我們主要介紹tty driver的註冊與登出、線路規程的註冊與登出,tty埠的註冊與登出等內容。

tty driver的註冊與登出

主要實現tty controller 驅動的註冊與登出操作,相應的函式包括tty_register_driver、tty_unregister_driver,下面我們分析下這兩個函式實現的功能

tty_register_driver介面

該介面實現如下幾個功能:

根據tty_driver設定的主裝置號、次裝置號、tty埠個數,呼叫alloc_chrdev_region/register_chrdev_region進行字元裝置號區間的申請;

若該tty_driver動態建立字元裝置,則在tty_register_driver中,僅建立次裝置號範圍為tty埠個數的字元裝置;

若該tty_driver靜態建立字元裝置,則在tty_register_driver中,針對每一個tty埠均建立一個對應的字元裝置(次裝置個數為1);

將該tty_driver新增至tty_drivers連結串列中;

呼叫proc_tty_register_driver,在proc檔案系統中,為該tty_driver建立對應的檔案

Linux tty子系統分析之三 tty驅動、裝置的註冊以及登出介面說明

tty_unregister_driver介面

該介面實現的功能比較簡單,主要如下:

呼叫unregister_chrdev_region,登出已申請的字元裝置號區間;

將該tty_driver從tty_drivers連結串列中刪除。

tty device的註冊與登出

針對tty device的註冊與登出,主要涉及tty_unregister_device、tty_register_device這兩個介面,而tty_register_device則是對tty_register_device_attr的封裝。下面我們分析下這兩個函式。

tty_register_device介面

該介面主要實現兩個功能:

若該tty_driver沒有設定TTY_DRIVER_DYNAMIC_ALLOC,則呼叫tty_cdev_add針對每一個tty埠均建立一個對應的字元裝置(次裝置個數為1);

申請struct device型別的記憶體空間,並將該device與tty_class關聯,並呼叫device_register將該device註冊至裝置驅動子系統中,且該device中包含了字元裝置的裝置號,因此當將該設備註冊至裝置驅動子系統時,會透過netlink將設備註冊的uevent資訊傳送給應用程式,而mdev或者udevd程式接收到該uevent資訊後,則會根據註冊資訊,完成tty字元裝置inode的建立,即可在/dev目錄下建立相應的字元裝置檔案。

Linux tty子系統分析之三 tty驅動、裝置的註冊以及登出介面說明

tty_unregister_device介面

該介面實現的功能如下:

呼叫device_destroy,將該tty埠對應的device從裝置驅動子系統中移除(也即解除與tty_class的關聯);

若該tty_driver沒有設定TTY_DRIVER_DYNAMIC_ALLOC,則將呼叫cdev_del將對應的字元裝置從字元裝置模組中移除。

線路規程的註冊與登出

針對線路規程的註冊與登出,主要涉及函式tty_register_ldisc、tty_unregister_ldisc,主要是註冊線路規程的操作介面,

針對線路規程操作介面,定義全域性陣列static struct tty_ldisc_ops *tty_ldiscs[NR_LDISCS];,其中NR_LDISCS的定義如下

#define NR_LDISCS 30

這兩個函式的定義如下,主要就是將新的線路規程的ops新增至全域性變數tty_ldiscs中,它們的處理邏輯比較簡單,就不再說明。

Linux tty子系統分析之三 tty驅動、裝置的註冊以及登出介面說明

Linux tty子系統分析之三 tty驅動、裝置的註冊以及登出介面說明

以上即是tty_driver、tty device、tty 線路規程的註冊與登出,其中線路規程的註冊與登出我們在平時的驅動開發中基本上不會觸及到。而針對tty_driver、tty device的註冊與登出,若我們進行串列埠控制器的開發,則基本上需要了解,且只要使用tty_driver、tty device的註冊與登出即可完成串列埠控制器相關驅動的註冊與登出,下一章我們介紹tty 控制器驅動的開發流程,並完成一個虛擬的串列埠控制器驅動的開發。

頂部