tty serial 架構分析

2021-06-08 14:42:00 字數 1779 閱讀 8177

一、  tty裝置,在使用者空間看來也為字元型裝置,從tty_register_driver()中可以看出

int tty_register_driver(struct     tty_driver * driver)

二、 使用者空間訪問的api也及這裡的tty_fops,

drivers/char目錄下的n_tty.c,tty_io.c等檔案中

static const struct file_operations tty_fops = ;

三、下面來看一下tty_read的實現

static ssize_t tty_read(struct file *file, char __user *buf, size_t count,

loff_t *ppos)

這裡呼叫的線路規程裡的函式,

四、線路規程的實現

struct tty_ldisc_ops tty_ldisc_n_tty = ;

接下來看一下n_tty_write實現

static ssize_t n_tty_write(struct tty_struct *tty, struct file *file,

const unsigned char *buf, size_t nr)

//進入此處繼續執行的原因可能是被訊號打斷,而不是條件得到了滿足。

//只有條件得到了滿足,我們才會繼續,否則,直接返回!

if (tty_hung_up_p(file) || (tty->link && !tty->link->count))

if (o_opost(tty) && !(test_bit(tty_hw_cook_out, &tty->flags)))

b += num;

nr -= num;

if (nr == 0)

break;

c = *b;

if (process_output(c, tty) < 0)

break;

b++; nr--;

}if (tty->ops->flush_chars)

tty->ops->flush_chars(tty);

} else

if (!c)

break;

b += c;

nr -= c;}}

if (!nr)

break;

//全部寫入,返回

if (file->f_flags & o_nonblock)

/* 假如是以非阻塞的方式開啟的,那麼也直接返回。否則,讓出cpu,等條件滿足以後再繼續執行。

*/        

schedule();//執行到這裡,當前程序才會真正讓出cpu!!!

}break_out:

__set_current_state(task_running);

remove_wait_queue(&tty->write_wait, &wait);

...}

從這裡看以看出線路規程裡的函式最終呼叫tty_struct裡的ops函式

五、讓讓我們一起看看tty_struct裡的ops是何時被賦值的

tty_open -> tty_init_dev -> initialize_tty_struct

driver/char/tty_io.c

void initialize_tty_struct(struct tty_struct *tty,  struct tty_driver *driver, int idx)

大家至此是否恍然大悟,好了,tty驅動至此基本結束,細節問題還要大家自己去解決。

Pidgin架構分析

pidgin是乙個可以在windows linux bsd和unixes下執行的多協議即時通訊客戶端,可以讓你用你所有的即時通訊帳戶中一次登入。pidgin支援的通訊 aim bonjour gadu gadu google talk groupwise icq irc msn myspaceim ...

Spring Flex 架構分析

spring flex 架構分析 spring flex是spring和adobe共同研發的乙個開源專案,她整合了 spring的優秀特性和blaseds的工作機制,使用spring也可以很好的應用在ria應用程式開發中。spring flex整合後的服務端工作原理圖 1 2 暴露運程服務,支援如下...

nhibernate架構分析

以nhibernate prealpha build 2為準 從圖中可以看到,session和sessionfactory是nhibernate的核心部分。sessionfactory維護到持久機制 資料庫 的連線並對它們進行管理,同時還儲存著所有持久物件的對映資訊。sessionfactory由c...