Skip to content

Character Device Driver Notes


🧠 Core Concept

A Linux character device driver provides a file interface to user space.


📦 file_operations

struct file_operations {
    .open
    .read
    .write
    .release
};

🔄 Lifecycle

open() → create file instance
read/write → operate with offset
close() → release() when ref count = 0

📌 open vs release

  • open: acquire resource
  • release: free resource (last reference)

release is not called on every close()


📏 Offset Handling

Each file instance has its own offset:

if (*offset >= data_size)
    return 0;

EOF is per-open


🔐 Concurrency

Global variables must be protected:

mutex_lock()

critical section

mutex_unlock()

🔁 goto Pattern

Used for cleanup:

mutex_lock()

if (error)
    goto out;

...

out:
mutex_unlock()

⚠️ Common Mistakes

1. Assuming EOF is global

Wrong:

  • expecting data to disappear after read

Correct:

  • data remains unless explicitly cleared

2. release == close

Wrong:

  • release happens every close

Correct:

  • release happens when last reference is dropped

3. No locking

Wrong:

  • race condition in open()

🧠 Driver Types (Concept)

File-like device

  • data persists
  • can be read multiple times

Stream / FIFO device

  • data consumed after read
  • requires queue mechanism

🔧 copy_to_user / copy_from_user

Used for safe memory access:

copy_to_user()
copy_from_user()

Never directly access user pointer


🚀 Next Topics

  • ioctl
  • wait queue
  • poll/select
  • private_data
  • platform driver