나는 (S [O | F | U] 네트워크와 다른 곳에서) 열심히 수색했으며, 드문 질문이라고 생각합니다. Debian Linux 2.6.28-4를 실행하는 Atmel AT91SAM9263-EK 개발 보드 (ARM926EJ-S 코어, ARMv5 명령어 세트)로 작업하고 있습니다. 나는와 이야기하기 위해 tty 드라이버를 사용하여 (나는) 내가 쓰고있다. 쓰기와 읽기가 원자적임을 확실히해야합니다. 커널 소스 설치 디렉토리와 관련하여이 게시물의 끝 아래에 나열된 몇 줄의 소스 코드는이를 암시하거나 암묵적으로 설명합니다.원자 기록을 확인하는 방법?
이 장치에서 쓰거나 읽는 것이 실제로 원자 적 작업인지 확인할 수있는 방법이 있습니까? 또는/dev/ttyXX 장치가 FIFO로 간주되고 인수가 거기에서 종료됩니까? 코드가이 주장을 시행하고 있다는 것을 단순히 믿는 것만으로는 충분하지 않습니다 - 최근 2 월의 freebsd는 demonstrated to lack atomic writes for small lines이었습니다. 그렇습니다. FreeBSD는 Linux와 완전히 똑같지는 않지만, 요점은 신중해야한다는 것입니다. 제가 생각할 수있는 것은 데이터를 계속 보내고 순열을 찾는 것입니다. 저는 좀 더 과학적이고 이상적으로 결정론적인 것을 기대하고있었습니다. 불행히도, 나는 요즘 대학 시절의 동시 프로그래밍 수업에서 정확히 아무것도 기억하지 못합니다. 나는 철저히 올바른 방향으로 때 리거나 쑤셔 주셔서 감사합니다. 답장을 보내 주시면 미리 감사드립니다.
종류와 관련,
Jayce
드라이버/문자/tty_io.c : 1087
void tty_write_message(struct tty_struct *tty, char *msg)
{
lock_kernel();
if (tty) {
mutex_lock(&tty->atomic_write_lock);
if (tty->ops->write && !test_bit(TTY_CLOSING, &tty->flags))
tty->ops->write(tty, msg, strlen(msg));
tty_write_unlock(tty);
}
unlock_kernel();
return;
}
아치/팔/포함/ASM/bitops.h : 37
012 3,516,static inline void ____atomic_set_bit(unsigned int bit, volatile unsigned long *p)
{
unsigned long flags;
unsigned long mask = 1UL << (bit & 31);
p += bit >> 5;
raw_local_irq_save(flags);
*p |= mask;
raw_local_irq_restore(flags);
}
드라이버/시리얼/serial_core.c : 2376
static int
uart_write(struct tty_struct *tty, const unsigned char *buf, int count)
{
struct uart_state *state = tty->driver_data;
struct uart_port *port;
struct circ_buf *circ;
unsigned long flags;
int c, ret = 0;
/*
* This means you called this function _after_ the port was
* closed. No cookie for you.
*/
if (!state || !state->info) {
WARN_ON(1);
return -EL3HLT;
}
port = state->port;
circ = &state->info->xmit;
if (!circ->buf)
return 0;
spin_lock_irqsave(&port->lock, flags);
while (1) {
c = CIRC_SPACE_TO_END(circ->head, circ->tail, UART_XMIT_SIZE);
if (count < c)
c = count;
if (c <= 0)
break;
memcpy(circ->buf + circ->head, buf, c);
circ->head = (circ->head + c) & (UART_XMIT_SIZE - 1);
buf += c;
count -= c;
ret += c;
}
spin_unlock_irqrestore(&port->lock, flags);
uart_start(tty);
return ret;
}
또한, (3) 문서 사람이 쓰기에서 :
시도가 파이프 나 FIFO에 쓰기 몇 가지 주요 특성이 있습니다 :
- 원자/비 원자 : A 쓰기 한 작업에서 작성된 전체 금액이 다른 프로세스의 데이터로 인터리브되어 있지 않으면 원자 적입니다. 이 기능은 여러 작성자가 단일 독자에게 데이터를 보내는 경우에 유용합니다. 응용 프로그램은 얼마나 많은 쓰기 요청이 원자 적으로 수행 될 것으로 예상 될 수 있는지를 알아야합니다. 이 최대 값은 {PIPE_BUF}라고합니다. IEEE Std 1003.1-2001의이 볼륨은 {PIPE_BUF} 바이트 이상에 대한 쓰기 요청이 원자 적 (atomic)인지 여부를 나타내지 않지만 {PIPE_BUF} 바이트 이하의 쓰기는 원자 적이어야합니다.
"질문"을 맨 위에 올리면 응답 속도가 더 빨라질 수 있습니다 (일종의 요약). –
팁을 주셔서 감사합니다. -Jayce – user239719
운전자가 정확성을 검증 할 수있는 고문 스트레스 테스트가 정말로 필요한 것 같습니다. 그것은 마치 주변에서 정말 일반적으로 유용 할 것 같습니다. – Omnifarious