一:前言
我們在之前分析過input子系統和tty裝置驅動架構.今天需要將兩者結合起來.看看linux中的控制台是怎麼樣實現的.
二:控制台驅動的初始化
之前在分析tty驅動架構的時候曾分析到.主裝置為4,次裝置為0的裝置節點,即/dev/tty0為當前的控制終端.
有tty_init()中,有以下**段:
static int __init tty_init(void)
#ifdef config_vt
cdev_init(&vc0_cdev, &console_fops);
if (cdev_add(&vc0_cdev, mkdev(tty_major, 0), 1) ||
register_chrdev_region(mkdev(tty_major, 0), 1, "/dev/vc/0") < 0)
panic("couldn't register /dev/tty0 driver\n");
device_create(tty_class, null, mkdev(tty_major, 0), "tty0");
vty_init();
#endif
return 0;
config_vt:是指配置虛擬終端.即我們所說的控制台.在此可以看到tty_major(4),0對應的裝置節點操作集為console_fops.
繼續跟進vty_init()
int __init vty_init(void)
vcs_init();
console_driver = alloc_tty_driver(max_nr_consoles);
if (!console_driver)
panic("couldn't allocate console driver\n");
console_driver->owner = this_module;
console_driver->name = "tty";
console_driver->name_base = 1;
console_driver->major = tty_major;
console_driver->minor_start = 1;
console_driver->type = tty_driver_type_console;
console_driver->init_termios = tty_std_termios;
console_driver->flags = tty_driver_real_raw | tty_driver_reset_termios;
tty_set_operations(console_driver, &con_ops);
if (tty_register_driver(console_driver))
panic("couldn't register console driver\n");
kbd_init();
console_map_init();
#ifdef config_prom_console
prom_con_init();
#endif
#ifdef config_mda_console
mda_console_init();
#endif
return 0;
經過我們之前的tty驅動架構分析,這段**看起來就比較簡單了,它就是註冊了乙個tty驅動.這個驅動對應的操作集是位於con_ops裡面的.
仔細看.在之後還會呼叫kbd_init().顧名思義,這個是乙個有關鍵盤的初始化.控制終端跟鍵盤有什麼關係呢?在之前分析tty的時候,曾提到過,. 對於控制台而言,它的輸入裝置是鍵盤滑鼠,它的輸出裝置是當前顯示器.這兩者是怎麼關聯起來的呢?不著急.請看下面的分析.
三:控制台的open操作
在前面分析了,對應console的操作集為con_ops.定義如下:
static const struct file_operations console_fops = else else else {
//非加工模式,直接copy
int uncopied;
//環形快取,copy兩次
uncopied = copy_from_read_buf(tty, &b, &nr);
uncopied += copy_from_read_buf(tty, &b, &nr);
if (uncopied) {
retval = -efault;
break;
linux 驅動 7 平台裝置驅動
目錄7.2 平台裝置 7.3 平台驅動 參考區分裝置驅動模型和平台裝置驅動模型。裝置驅動模型可以理解為匯流排 裝置 驅動。平台裝置驅動模型就是那些 linux 核心管理沒有物理匯流排 即是不需要特殊時序控制的裝置 也是linux核心沒有自動建立相應驅動匯流排的裝置型別 的裝置的一套 linux平台匯...
Linux裝置驅動之《字元裝置驅動》
linux裝置中最大的特點就是裝置操作猶如檔案操作一般,在應用層看來,硬體裝置只是乙個裝置檔案。應用程式可以像操作檔案一樣對硬體裝置進行操作,如open close read write 等。下面是乙個字元裝置驅動程式的簡單實現test.c 模組分析 1.初始化裝置驅動的結構體 struct fil...
Linux裝置驅動之字元裝置驅動
一 linux裝置的分類 linux系統將裝置分成三種基本型別,每個模組通常實現為其中某一類 字元模組 塊模組或網路模組。這三種型別有 字元裝置 字元裝置是個能夠像位元組流 類似檔案 一樣被訪問的裝置,由字元裝置驅動程式來實現這種特性。字元裝置可以通過檔案系統節點來訪問,比如 dev tty1等。這...