电竞比分网-中国电竞赛事及体育赛事平台

分享

tty驅(qū)動(dòng)程序框架

 檸檬冰啡咖 2019-05-30
tty驅(qū)動(dòng)程序框架

   

 一、TTY概念解析

   在Linux系統(tǒng)中,終端是一類字符型設(shè)備,它包括多種類型,通常使用tty來(lái)簡(jiǎn)稱各種類型的終端設(shè)備。

1.1串口終端(/dev/ttyS*)
  串口終端是使用計(jì)算機(jī)串口連接的終端設(shè)備。Linux把每個(gè)串行端口都看作是一個(gè)字符設(shè)備。這些串行端口所對(duì)應(yīng)的設(shè)備名稱是 /dev/ttySAC0;/dev/ttySAC1…

1.2虛擬終端(/dev/tty*)
  當(dāng)用戶登錄時(shí),使用的是虛擬終端。使用Ctcl+Alt+[F1—F6]組合鍵時(shí),我們就可以切換到tty1、tty2、tty3等上面去。tty1–tty6等稱為虛擬終端,而tty0則是當(dāng)前所使用虛擬終端的一個(gè)別名.

 1.3控制臺(tái)終端(/dev/console)

  在Linux系統(tǒng)中,計(jì)算機(jī)的輸出設(shè)備通常被稱為控制臺(tái)終端(Console),這里特指printk信息輸出到的設(shè)備。/dev /console是一個(gè)虛擬的設(shè)備,它需要映射到真正的tty上,比如通過(guò)內(nèi)核啟動(dòng)參數(shù)” console=ttySAC0”就把console映射到了串口0

 二、TTY架構(gòu)分析

   Linux tty子系統(tǒng)包含:tty核心,tty線路規(guī)程和tty驅(qū)動(dòng)。tty核心是對(duì)整個(gè)tty設(shè)備的抽象,對(duì)用戶提供統(tǒng)一的接口,tty線路規(guī)程是對(duì)傳輸數(shù)據(jù)的格式化,tty驅(qū)動(dòng)則是面向tty設(shè)備的硬件驅(qū)動(dòng)。

   

 下面這張圖從函數(shù)調(diào)用來(lái)分析:

  

 2.1內(nèi)核代碼分析

  找到內(nèi)核代碼的下面路徑:

  linux-ok6410\drivers\tty\serial里面有個(gè)samsung.c文件在里面搜索串口發(fā)送函數(shù)s3c24xx_serial_start_tx并在里面添加回朔打印函數(shù):dump_stack(); 

復(fù)制代碼

 1 static void s3c24xx_serial_start_tx(struct uart_port *port) 2 { 3     struct s3c24xx_uart_port *ourport = to_ourport(port); 4     dump_stack();  //回朔 5     static int a =1;//temp 6     if (port->line == 3) { 7 //        printk("485_start_tx\n"); 8 
 9         if(a){10             s3c_gpio_cfgpin(S3C64XX_GPK(5), S3C_GPIO_SFN(1));11             a=0;12         }13         gpio_set_value(S3C64XX_GPK(5), 1);14     }15     if (!tx_enabled(port)) {16         if (port->flags & UPF_CONS_FLOW)17             s3c24xx_serial_rx_disable(port);18 
19         enable_irq(ourport->tx_irq);20         tx_enabled(port) = 1;21     }22 }

復(fù)制代碼

  編譯內(nèi)核代碼并且將鏡像文件放到開(kāi)發(fā)板中下載:串口可以打印出回朔函數(shù)過(guò)程,但是由于我的優(yōu)先級(jí)別的問(wèn)題打印不出來(lái),因此運(yùn)行命令:dmesg

  則可以看到如下代碼:

復(fù)制代碼

 1 //dump_stack();  調(diào)用過(guò)程 2 [<c0035ca8>] (unwind_backtrace+0x0/0xfc) from [<c049c7c0>] (dump_stack+0x18/0x1c) 3 [<c049c7c0>] (dump_stack+0x18/0x1c) from [<c0237670>] (s3c24xx_serial_start_tx+0x14/0xb4) 4 
 5 [<c0237670>] (s3c24xx_serial_start_tx+0x14/0xb4) from [<c023374c>] (uart_start+0x64/0x68) 6 [<c023374c>] (uart_start+0x64/0x68) from [<c0234cb4>] (uart_write+0xc0/0xe4) 7 [<c0234cb4>] (uart_write+0xc0/0xe4) from [<c021dd84>] (do_output_char+0x16c/0x1d8) 8 [<c021dd84>] (do_output_char+0x16c/0x1d8) from [<c021de28>] (process_output+0x38/0x54) 9 [<c021de28>] (process_output+0x38/0x54) from [<c021e978>] (n_tty_write+0x204/0x444)10 [<c021e978>] (n_tty_write+0x204/0x444) from [<c021b808>] (tty_write+0x14c/0x244)11 [<c021b808>] (tty_write+0x14c/0x244) from [<c021b958>] (redirected_tty_write+0x58/0x68)12 [<c021b958>] (redirected_tty_write+0x58/0x68) from [<c00e5ca4>] (vfs_write+0xbc/0x150)13 
14 //系統(tǒng)調(diào)用接口過(guò)程15 [<c00e5ca4>] (vfs_write+0xbc/0x150) from [<c00e5e14>] (sys_write+0x44/0x74)16 [<c00e5e14>] (sys_write+0x44/0x74) from [<c002fb40>] (ret_fast_syscall+0x0/0x30)

復(fù)制代碼

  通過(guò)分析可以知道和上面的過(guò)程吻合

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多