문자 장치 파일에 대한 동시 쓰기 액세스

문자 장치 파일에 대한 동시 쓰기 액세스

두 프로세스가 동시에 문자 장치 파일에 쓸 때 어떤 일이 발생하는지 알고 싶습니다. 현재 가장 큰 관심사는 Raspberry pi의 /dev/spidev0.0입니다.

드라이버의 작업이 동시 쓰기를 처리하는 것이라고 올바르게 가정하면 드라이버는 어떤 프로세스가 어떤 데이터를 썼는지 알 수 있습니까? 아니면 드라이버가 모든 동시 쓰기가 함께 혼합된 연속적인 데이터 스트림을 보게 됩니까?

답변1

Linux 5.4.97 커널 소스 코드를 보면 다음과 같은 내용이 보입니다 drivers/spi/spidev.c. 해당 파일에는 쓰기 요청을 처리하는 함수가 있습니다.

ssize_t
spidev_write(struct file *filp, const char __user *buf,
                size_t count, loff_t *f_pos)
{
        struct spidev_data      *spidev;
        ssize_t                 status = 0;
        unsigned long           missing;

        /* chipselect only toggles at start or end of operation */
        if (count > bufsiz)
                return -EMSGSIZE;

        spidev = filp->private_data;

        mutex_lock(&spidev->buf_lock);
        missing = copy_from_user(spidev->tx_buffer, buf, count);
        if (missing == 0)
                status = spidev_sync_write(spidev, count);
        else
                status = -EFAULT;
        mutex_unlock(&spidev->buf_lock);

        return status;
}

mutex_lock()및 에 대한 호출을 참고하세요 mutex_unlock(). 문자 장치를 호출하는 프로세스는 write()뮤텍스를 획득하고 모든 데이터를 쓴 다음 뮤텍스를 잠금 해제합니다. 이 과정에서 다른 작성자가 등장하면 해당 작성자는 mutex_lock()기존 작성자가 호출할 때까지 해당 작성자에 대한 호출을 차단합니다 mutex_unlock().

모든 작성기 쓰기는 다른 작성기와 인터리빙하지 않고 전체 버퍼 쓰기를 보장합니다.

관련 정보