一、 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...