본문 바로가기

Programming/Linux_Kernel

Serial(uart) port 를 통한 consol 출력에 대해서..

linux 를 다루다 보면 의외로 간단한 부분이지만 linux 가 자체 지원해 주어서 잘 모르는 부분이 있습니다.
그중에 하나가 serial port 에 관련된 부분인데요.

내용을 간단하게 다뤄 봅시다.

우선 사용되는 node 는 다음 위치에 있습니다.

/dev/ttySAC0 .. 1 .. 2 .. 3

어느 port 를 사용할 것인지는 kernel 에 boot param 으로 넘기게 되어 있지요.

console=console=ttySAC2,115200n8

요렇게 셋팅해주면 kernel 에서 ttySAC2 node 를 mknod 해 주어서 자동으로 consol 에 물려줍니다.

실제로 다음과 같이 입력해 보면 동일한 메세지가 consol 에 출력되는것을 보실 수 있습니다.

# echo "test message" > /dec/ttySAC2
# test message

헌데 재미있는점은 user space 와 kernel 이 하나의 Uart port 를 쓰고 있지만 경로가 다르다는 겁니다.
위처럼 셋팅했을 경우 user space 에서 printf 로 출력되는 메세지들은

/dev/ttySAC2

로 출력되게 됩니다.
하지만 kernel 에서 printk 로 출력되는 메세지는 uart driver 를 통해서 직접 출력되게 됩니다.

call tree 는 linux 2.6 버전에서 다음과 같습니다.

< printf 의 경우 ttySACx node 로 write >
ret_fast_syscall -> sys_write -> vfs_write -> tty_write -> n_tty_write -> tty_write_room -> ...

< kernel 에서 printk 의 경우 >
printk -> vprintk -> release_console_sem -> __call_console_drivers -> uart_console_write -> s3c24xx_serial_console_putchar -> ...

따라서 서로 다른 buffer 를 사용하게 됩니다.
하나의 buffer 에서 kernel 과 user space 의 message 를 모두 봐야하는 이슈가 있었는데요.

최근에 나온 ttyprintk 라는 patch 를 적용하고
user 쪽에서 ttySACx 가 아닌 ttyprintk 에다가 write 를 하면 모두 uart driver 를 통해서 consol 출력이 가능합니다.

하지만 buffer 의 크기가 줄어든 만큼 유실이 많이질 각오(?)는 해 두어야 합니다.