C linux中哪个驱动程序控制x86串行端口ttyS0

C linux中哪个驱动程序控制x86串行端口ttyS0,c,x86,kernel,driver,uart,C,X86,Kernel,Driver,Uart,通过检查串行文件夹@: \驱动程序\tty\serial 那里有许多不同的串行端口驱动程序,哪一个用于x86?x86没有单一的UART芯片。 IBM PC最初使用,后来开始习惯性地用替换,后来用16750替换。 随着UART的出现,每个制造商都实现了UART,但都或多或少与16550/750和8250兼容。 如今,芯片组通常在PCH中集成一个或多个16750 UART,但它们没有外部插座,因此市场上存在大量USB/PCI第三方串行接口。 最后,驱动程序依赖于UART芯片 如果您对集成的UART

通过检查串行文件夹@: \驱动程序\tty\serial


那里有许多不同的串行端口驱动程序,哪一个用于x86?

x86没有单一的UART芯片。
IBM PC最初使用,后来开始习惯性地用替换,后来用16750替换。
随着UART的出现,每个制造商都实现了UART,但都或多或少与16550/750和8250兼容。
如今,芯片组通常在PCH中集成一个或多个16750 UART,但它们没有外部插座,因此市场上存在大量USB/PCI第三方串行接口。
最后,驱动程序依赖于UART芯片



如果您对集成的UART(电脑背面有插座)感兴趣,则驱动程序可能在中,除非您的芯片组使用不同的UART芯片。

@Margaret Bloom有一个很好的答案。8250/16550兼容UART是普通x86 PC的基础,并集成到northbridge/southbridge ICH/PCH芯片组中。正如所指出的,这并不意味着使用集成UART;可以添加第三方串行卡(有关Maxim MAX310x串行驱动程序,请参见下文)

那么,你怎么知道正在使用什么呢?下面是运行debian 10的QEMU会话中的一些命令:

q35ek:511> ls -l /dev/ttyS0
crw------- 1 dave tty 4, 64 Feb  2 12:09 /dev/ttyS0

q35ek:512> sudo cat /proc/tty/driver/serial | egrep '^0:'
0: uart:16550A port:000003F8 irq:4 tx:11291 rx:18 RTS|CTS|DTR|DSR|CD

q35ek:513> sudo cat /proc/tty/drivers
/dev/tty             /dev/tty        5       0 system:/dev/tty
/dev/console         /dev/console    5       1 system:console
/dev/ptmx            /dev/ptmx       5       2 system
/dev/vc/0            /dev/vc/0       4       0 system:vtmaster
ttyprintk            /dev/ttyprintk   5       3 console
max310x              /dev/ttyMAX   204 209-224 serial
serial               /dev/ttyS       4 64-111 serial
pty_slave            /dev/pts      136 0-1048575 pty:slave
pty_master           /dev/ptm      128 0-1048575 pty:master
unknown              /dev/tty        4 1-63 console
q35ek:514> 
第一个命令查找您感兴趣的tty的主要/次要编号

第二个查找有关驱动程序的信息: 它是一个uart:16550A(“a”型具有字符fifo),位于IO端口0x3F8上,使用IRQ 4、tx和rx字符计数,最后是可用的控制选项

第三个显示每个设备的匹配驱动程序。4:64使用
serial
driver\u名称。一些开发人员对唯一定义驱动程序名称并不在行,因此这可能是8250/16550兼容设备(在
$K/drivers/tty/serial/8250
下)、DECstation DZ芯片或GRLIB uart。我要说的是,这是一个8250/16550接口,如下代码片段所示:

static struct uart_driver serial8250_reg = {
    .owner          = THIS_MODULE,
    .driver_name        = "serial",
    .dev_name       = "ttyS",
    .major          = TTY_MAJOR,
    .minor          = 64,
    .cons           = SERIAL8250_CONSOLE,
};

UART函数没有集成到x86CPU中?@马克:没有,我不知道。一些Skylake CPU集成了PCH(芯片组),但这只是IC的物理布局,功能上没有改变。UART是一个相当慢的设备,通常情况下,东西会集成到CPU中以提高它们的速度。@MargaretBloom:是的,我认为这没有意义。您不想将2个额外的CPU引脚专用于RS-232线路,而且您仍然需要一个外部芯片,因为您可能不希望外壳外部的电线直接与CPU引脚电连接。因此,您也可以将该外部芯片制作成一个实际的UART,或者将其烘焙到southbridge中,并通过PCIe或DMI以及硬盘驱动器LED和其他杂项设备与之通信。需要额外别针的东西,我不明白。当x86使用superIO时,不意味着UART已经被集成了吗?那么,这个UART应该有一个驱动程序。@Mark SuperIO本身就是一个芯片,它处理很多遗留设备,包括UART。这些UART具有与16550相同的接口,16550是8250的超集。在Linux下,它都位于8250文件夹下,如文件本身的注释所述。Linux使用
/
作为路径分隔符,而不是反斜杠。16550对于普通PC来说当然是一个很好的默认设置,但您可以将其他串行卡放入PCI插槽。e、 g.旧的调制解调器服务器可能有一个cyclades多端口串行卡(或另一个供应商提供的),Linux有相应的驱动程序。如果您指出与IBM-PC兼容的标准机器通常内置16550个,而没有像所有x86机器那样说什么,那么这将是一个更好的答案。