0% found this document useful (0 votes)
102 views

Linux Device Driver: Nctu Os Lab Chi-Wei Yang

This document provides an overview of Linux device drivers. It describes the overall architecture including the virtual file system (VFS) and different driver types like character, block, and network drivers. It then discusses specific details for each driver type, covering their properties, exported interfaces, and data flow for read and write operations. Finally, it outlines some common support functions for tasks like I/O port reservation, memory allocation, interrupt handling, and data transfer between the kernel and user space.

Uploaded by

NguyenVan Thanh
Copyright
© Attribution Non-Commercial (BY-NC)
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PPTX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
102 views

Linux Device Driver: Nctu Os Lab Chi-Wei Yang

This document provides an overview of Linux device drivers. It describes the overall architecture including the virtual file system (VFS) and different driver types like character, block, and network drivers. It then discusses specific details for each driver type, covering their properties, exported interfaces, and data flow for read and write operations. Finally, it outlines some common support functions for tasks like I/O port reservation, memory allocation, interrupt handling, and data transfer between the kernel and user space.

Uploaded by

NguyenVan Thanh
Copyright
© Attribution Non-Commercial (BY-NC)
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PPTX, PDF, TXT or read online on Scribd
You are on page 1/ 14

Linux Device Driver

NCTU OS Lab
Chi-Wei Yang
Outline
 Overall Architecture
 Character Driver
 Block Driver
 Network Driver
 Support Functions
Overall Architecture
 VFS
 Driver Types
• character
• block
• network
Overall Architecture (cont.)

System Call Interface

VFS
Socket

File Systems

Buffer Network Protocol


Cache

Block Character Network


Device Driver Device Driver Device Driver

Hardware
Overall Architecture (cont.)
 Operation Modes
• polling
• interrupt
• DMA
Character Driver
 Device Properties
• can’t be randomly accessed
• can’t be buffered
• usually are slow devices
 Export Interface
• file_operations
 Data Flow in read/write
Character Driver (cont.)
int lseek (struct inode *, struct file *, off_t, int)
int read (struct inode *, struct file *, char *, int)
int write (struct inode *, struct file *, const char *, int)
int readdir (struct inode *, struct file *, void *, filldir_t)
int select (struct inode *, struct file *, int, select_table *)
int ioctl (struct inode *, struct file *, unsigned int, unsigned long)
int mmap (struct inode *, struct file *, struct vm_area_struct *)
int open (struct inode *, struct file *)
void release (struct inode *, struct file *)
int fsync (struct inode *, struct file *)
int fasync (struct inode *, struct file *, int)
int check_media_change (kdev_t dev)
int revalidate (kdev_t dev)
Block Driver
 Device Properties
• can be randomly accessed
• accessed in units of blocks
• to speed up access, buffer cache is used
 Export Interface
• file_operations
• request_fn()
 Data Flow in read/write
Block Driver (cont.)

process

read/write system call

buffer
cache

invoke request function

check buffer up to date call


scheduler

done
Network Driver
 Export Interface
 Data Flow in read/write
Network Driver (cont.)

int open(struct device *dev)


int stop(struct device *dev)
int hard_start_xmit(struct sk_buff *skb, struct device *dev)
int hard_header (struct sk_buff *skb, struct device *dev,
unsigned short type, void *daddr, void *saddr, unsigned len)
int rebuild_header(void *eth, struct device *dev, unsigned long raddr,
struct sk_buff *skb)
void set_multicast_list(struct device *dev)
int set_mac_address(struct device *dev, void *addr)
int do_ioctl(struct device *dev, struct ifreq *ifr, int cmd);
int set_config(struct device *dev, struct ifmap *map)
void header_cache_bind(struct hh_cache **hhp, struct device *dev,
unsigned short htype, __u32 daddr)
void header_cache_update(struct hh_cache *hh, struct device *dev,
unsigned char * haddr)
int change_mtu(struct device *dev, int new_mtu)
Struct iw_statistics* get_wireless_stats(struct device *dev)
Network Driver (cont.)

User Application

Berkley Socket API

INET Socket

TCP UDP

IP ARP ICMP

Network Device Driver

Transmit packets Receive packets


through hard_start_xmit from interrupt handler

Network Device
Support Functions
 I/O ports reservations
• request_region()
 Memory Allocations
• kmalloc(), vmalloc(), get_free_page()
 Interrupt Handler Registration
• request_irq()
 Data Transfer between User/Kernel
• memcpy_fromfs()
Support Functions (cont.)
 Bottom Halves
• mark_bh()
• its main purpose is to provide fewer blocking
time due to interrupts
• top half/bottom half
• priority-based
• limitions in writing bottom halves
– can't call schedule(), can't block

You might also like