QEMU 1.4.0 에뮬레이터의 Ubuntu 13.04 배포판에서 beagleboard-xm의 Linux 이미지(커널 3.2.8)를 실행하고 있습니다. 내 이미지는 Buildroot beagle_defconfig를 사용하여 생성되었습니다. 디버깅을 수행할 수 있도록 일부 패키지를 추가했습니다.
QEMU는 cmd를 호출합니다.
`$ sudo qemu-system-arm -M beaglexm -m 1024 -sd ./test.img -clock unix -serial stdio -device usb-mouse -device usb-kbd -serial pty -serial pty`
[sudo] password for emperador:
char device redirected to /dev/pts/3 (label serial1)
char device redirected to /dev/pts/4 (label serial2)
내가 원하는 것은 게스트에 있는 4개의 서로 다른 ttyO 시리얼을 통해 게스트와 호스트 간에 통신하는 것입니다. QEMU는 호스트 측의 특정 장치로 트래픽을 리디렉션하는 기능을 제공합니다. 내 질문은 이것입니다:
게스트 커널이 부팅되면 UART가 활성화된 것을 볼 수 있습니다.
[ 2.682040] Serial: 8250/16550 driver, 4 ports, IRQ sharing enabled
[ 2.777947] omap_uart.0: ttyO0 at MMIO 0x4806a000 (irq = 72) is a OMAP UART0
[ 2.794967] omap_uart.1: ttyO1 at MMIO 0x4806c000 (irq = 73) is a OMAP UART1
[ 2.814942] omap_uart.2: ttyO2 at MMIO 0x49020000 (irq = 74) is a OMAP UART2
[ 2.966825] console [ttyO2] enabled
[ 2.984777] omap_uart.3: ttyO3 at MMIO 0x49042000 (irq = 80) is a OMAP UART3
실제로 OMAP-SERIAL에서 고양이를 보면 /proc/tty/driver
다음과 같은 serinfo:1.0 드라이버 개정판을 볼 수 있습니다.
0: uart:OMAP UART0 mmio:0x4806A000 irq:72 tx:0 rx:0 CTS|DSR|CD
1: uart:OMAP UART1 mmio:0x4806C000 irq:73 tx:0 rx:0 CTS|DSR|CD
2: uart:OMAP UART2 mmio:0x49020000 irq:74 tx:268 rx:37 RTS|CTS|DTR|DSR|CD
3: uart:OMAP UART3 mmio:0x49042000 irq:80 tx:0 rx:0 CTS|DSR|CD
내 콘솔이 ttyO2로 리디렉션되었기 때문에 ttyO2가 작동하고 있다는 것을 알고 있습니다. 문제는 ttyO에서 일련의 작업을 수행할 때 다음 메시지가 표시된다는 것입니다.
[root@enu driver]# setserial -a /dev/ttyO0
/dev/ttyO0, Line 0, UART: undefined, Port: 0x0000, IRQ: 72
Baud_base: 3000000, close_delay: 50, divisor: 0
closing_wait: 3000
Flags: spd_normal
ttyO2도 마찬가지입니다. ttyO에 대해 일부 설정을 시도했지만 setserial
항상 동일한 메시지가 나타납니다.
[root@enu ~]# setserial /dev/ttyO0 uart 8250
setserial: can't set serial info: Invalid argument
[root@enu ~]# setserial /dev/ttyO0 port 0x4806a000
setserial: can't set serial info: Invalid argument
손님을 관찰하면 /proc/tty/drives
이런 모습이 나옵니다.
/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
sdio_uart /dev/ttySDIO 249 0-7 serial
acm /dev/ttyACM 166 0-31 serial
ttyprintk /dev/ttyprintk 5 3 console
OMAP-SERIAL /dev/ttyO 253 0-3 serial
serial /dev/ttyS 4 64-95 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
기본적으로 게스트와 호스트 사이에 시리얼 통신을 하고 싶은데, 게스트 측 시리얼 포트가 잘 구성되어 있지 않습니다.
/sys/class/tty
tty 드라이버가 직렬 장치에 연결되어 있음을 표시합니다.
전에도 등장했습니까? omap uart만 초기화되어 ttyO*에 연결됩니다. 콘솔은 커널 구성에 의해 ttyO2로 리디렉션되었습니다. 하지만 을 추가했기 때문에 -serial stdio
콘솔은 QEMU를 호출하는 터미널로 리디렉션됩니다.
-serial pty
콘솔을 먼저 리디렉션하는 대신 를 사용하면 -serial stdio
호스트 측에서 생성된 pty를 열어 minicom에서 콘솔을 표시할 수 있습니다. 다른 포트를 통해 통신하기 위해 호스트 측에서 생성된 다른 pty에서는 여전히 아무 일도 일어나지 않습니다.
호스트 측에서는 minicom을 열고 사용하거나 실행하여 사용 /dev/pts/3
합니다 ./dev/pts/4
cat
손님의 경우:
echo "test" > /dev/ttyO0
아무것도 하지 않을 때나 한두 가지 일을 할 때 . 하지만 ttyO2에서 이 작업을 수행하면 콘솔 터미널에 "test" 프롬프트가 나타납니다(정상입니다).
이제 ttyS를 사용할 때:
echo "test" > /dev/ttyS0
알겠어요
-bash: echo: write error: Input/output error
이 오류에 대해 조사한 결과 여러 가지 원인이 있을 수 있다는 사실을 발견했습니다. 그런데 한 가지 눈에 띄는 점은 직렬 포트 외에는 ttyS에 할당된 장치가 없다는 것입니다. /proc/tty/driver/serial을 보면 다음과 같습니다.
serinfo:1.0 driver revision:
0: uart:unknown port:00000000 irq:0
1: uart:unknown port:00000000 irq:0
2: uart:unknown port:00000000 irq:0
3: uart:unknown port:00000000 irq:0
또한 setserial -a /dev/ttyS0
이것을 확인합니다.
/dev/ttyS0, Line 0, UART: unknown, Port: 0x0000, IRQ: 0
Baud_base: 0, close_delay: 50, divisor: 0
closing_wait: 3000
Flags: spd_normal
여러 포트와의 직렬 통신을 위해 x86 아키텍처에서 grml 이미지를 사용했습니다. 그래서 호스트 측에서는 문제가 없는 것 같습니다.
이전에 QEMU -M beaglexm 또는 다른 ARM 아키텍처를 사용하여 유사한 작업을 수행한 적이 있는 경우 사용된 VM, QEMU의 버전 및 릴리스, 사용된 커널 세부 정보 및 이미지 구성에 대한 세부 정보를 얻을 수 있어 기쁩니다.
답변1
문제는 호스트 측에 있습니다.
당신은 사용해야합니다의사 터미널( -serial pty
) "실제" 문자 장치( )에 연결하는 대신 -chardev tty,...
.
/dev/pts/xx
qemu는 실제로 사용하는 pty를 보여줍니다. 이제 이 pty를 호스트의 일반 직렬 포트로 사용할 수 있습니다.
/dev/ttyS[0-*]
이 옵션을 반복하여 게스트에 더 많은 pty를 연결할 수 있습니다( 를 사용하는 경우 게스트에 있고 첫 번째 pty에 -serial stdio
있습니다 )./dev/ttyS0
/dev/ttyS1
답변2
내 문제가 무엇인지 알아냈습니다. QEMU가 추가 직렬 pty를 직렬 chardev에 매핑하지 않았습니다.
이 호출 명령을 실행한 후:
sudo qemu-system-arm -M beaglexm -m 1024 -sd ./test.img -clonix -serial stdio -device usb-mouse -device usb-kbd -serial pty -serial pty -monitor pty
char device redirected to /dev/pts/5 (label compat_monitor0)
char device redirected to /dev/pts/7 (label serial1)
char device redirected to /dev/pts/10 (label serial2)
태그 시퀀스 1과 2를 사용하여 2개의 추가 시퀀스가 생성된 것을 볼 수 있습니다. 하지만 나무 정보를 보면
(qemu) info qtree
dev: omap_uart, id "uart4"
revision = 82
mmio_size = 4096
baudrate = 812500
chardev = uart4
irq 3
mmio 0000000049042000/0000000000001000
dev: omap_uart, id "uart3"
revision = 82
mmio_size = 4096
baudrate = 812500
chardev = serial0
irq 3
mmio 0000000049020000/0000000000001000
dev: omap_uart, id "uart2"
revision = 82
mmio_size = 4096
baudrate = 812500
chardev = uart2
irq 3
mmio 000000004806c000/0000000000001000
dev: omap_uart, id "uart1"
revision = 82
mmio_size = 4096
baudrate = 812500
chardev = uart1
irq 3
mmio 000000004806a000/0000000000001000
serial0
우리는 하나의 uart(콘솔에 설정된 하나)에만 레이블만 부착되어 있음을 분명히 알 수 있습니다 . 다른 태그(serial1 및 serial2)를 찾을 수 없습니다.
jofel은 grml의 작업 이미지를 보여주게 되어 매우 기뻤으며 다음과 같은 내용을 볼 수 있습니다.
dev: i440FX-pcihost, id ""
irq 0
bus: pci.0
type PCI
dev: PIIX3, id ""
addr = 01.0
romfile = <null>
rombar = 1
multifunction = on
command_serr_enable = on
class ISA bridge, addr 00:01.0, pci id 8086:7000 (sub 1af4:1100)
bus: isa.0
type ISA
dev: isa-serial, id ""
index = 2
iobase = 0x3e8
irq = 4
chardev = serial2
wakeup = 0
isa irq 4
dev: isa-serial, id ""
index = 1
iobase = 0x2f8
irq = 3
chardev = serial1
wakeup = 0
isa irq 3
dev: isa-serial, id ""
index = 0
iobase = 0x3f8
irq = 4
chardev = serial0
wakeup = 0
isa irq 4
3개의 일련 번호가 모두 chardev에 추가됩니다.
이제 QEMU가 이러한 태그를 내 비글보드 uart에 연결하도록 만드는 방법에 대해 새로운 질문을 하면 됩니다.
또한 seterial은 omap uart를 지원하지 않기 때문에 ttyO에 대한 정보를 출력하지 않는다고 생각한다고 덧붙이고 싶습니다. setserial ?
지원되는 장치를 표시합니다. ttyS에 관한 한 tty 드라이버가 설치되어 있기 때문인 것 같지만 QEMU의 bealgeboard용으로 에뮬레이트된 다른 유형의 uarts bisede omap uarts가 없습니다.
이 문제를 지켜봐 주신 모든 분들, 특히 jofel에게 감사드립니다.