مقدمه

درایور ها نقش های مختلفی را در یک سیستم عامل بازی می کنند. از ارتباط با سخت افزارهای رایانه گرفته تا کاربردهای نرم افزاری. درایور ها به سیستم عامل این امکان را می دهند که بدون دانستن ساختار سخت افزاری دستگاه متصل شده بتواند با آن کار کند و از منابعش استفاده کند. در حقیقت درایور ها را می تواند به مترجمی تشبیه کرد که واسط میان سخت افزار دستگاه متصل شده و نرم افزار و یا سیستم عاملی است که از آن استفاده می کند. دستگاه هایی نظیر انواع پرینترها، کارت های ویدیویی، کارت های شبکه، انواع دستگاه های ذخیره‌سازی داده، دوربین ها و همچنین انواع دستگاه های سریال اشاره کرد.

در این دوره هدف بر آن است تا دانشجو را با تهیه و راه اندازی درایور ها در محیط لینوکس آشنا کرد. درایور ها در دو مد کرنل و کاربر طبقه بندی می‌شوند که درباره آن توضیح داده خواهد شد. همچنین دانشجویان با انواع مختلف دیوایس درایور ها آشنا خواهند شد و خواهند توانست دیوایس درایور مخصوص خود را بنویسند و از آن استفاده کنند.

 

محتوا: مقدمات کرنل لینوکس، آشنایی با نحوه‌ی کار با حافظه و منابع سیستم، آشنایی با انواع درایور ها، آشنایی با تعامل با درایورها.

مخاطبین: توسعه دهندگان سخت افزارها و توسعه دهندگان Device Driver لینوکس

مدت دوره: 32 ساعت

پیش نیاز: دوره Developing Applications For Linux

مدرس: مهندس افشین

تاریخ برگزاری: لطفا به تقویم آموزشی مراجعه کنید.

مرور اجمالی:

  • بررسی هسته لینوکس
  • توسعه Device Driver در لینوکس
  • اشکال زدایی Linux Kernel
  • کار با انجمن توسعه Linux Kernel
  • سناریوهای عملی بر روی سیستم ها با معماری X86

:Make yourself into a Linux kernel specialist, who can

Configure, compile, and install a Linux kernel.

Do the same for a kernel module .

Navigate and read the Linux kernel sources .

Use the API for internal kernel services .

Design and implement a kernel module .

Modify, or design and implement a device driver .

Measure the performance of your implementation .

 

Introduction to the Linux kernel

Kernel features .

Understanding the development process .

Legal constraints with device drivers .

Kernel user interface (/proc and /sys) .

User space device drivers .

 

Kernel sources

Specifics of Linux kernel development .

Coding standards .

Retrieving Linux kernel sources .

Tour of the Linux kernel sources .

Kernel source code browsers: cscope, Kscope, Elixir .

Making searches in the Linux kernel sources: looking for C definitions, for definitions of kernel configuration parameters, and for other kinds of information .

Using the Unix command line and then kernel source code browsers .

 

Kernel configuration, compiling and booting on NFS

Kernel configuration and compilation .

Generated files .

Booting the kernel. Kernel booting parameters .

Mounting a root filesystem on NFS .

Using the qemu software

Configuring, compiling and booting a Linux .

kernel with NFS boot support

 

Linux kernel modules Writing modules in action

Linux device drivers .

A simple module .

Programming constraints .

Loading, unloading modules .

Module dependencies .

Kernel symbol table .

Cleanup function .

Adding sources to the kernel tree .

Write a kernel module with several capabilities .

Access kernel internals from your module .

Set up the environment to compile it .

 

Data Types in the Kernel

Standard C type .

Interface Specific Types .

Linked Lists .

 

Linux device model

Understand how the kernel is designed to support device drivers .

The device model .

Binding devices and drivers .

Platform devices, Device Tree .

Interface in user space: /sys .

Kobjects, Ksets, and Subsystems .

Low-Level Sysfs Operations .

Hotplug Event Generation .

Buses, Devices, and Drivers .

Classes .

Dealing with Firmware .

 

Kernel frameworks

Block vs. Character devices .

Useful data structures .

File and inode Structure .

Char Device registration .

Interaction of user space applications with the kernel .

Details on character devices, file_operations, ioctl(), etc .

Read and write .

Exchanging data to/from user space .

The principle of kernel frameworks .

 

Advanced Char Driver Operations

Device Control .

Blocking I/O .

Sleeping .

Asynchronous Notification .

Access Control on a device file .

 

Memory management I/O memory and ports

Linux: memory management - Physical and .

virtual (kernel and user) address spaces

Linux memory management implementation .

Allocating with kmalloc() .

Allocating by pages .

Allocating with vmalloc() .

Caches .

Memory Pools .

Buffers .

I/O register and memory range registration .

I/O register and memory access .

Read / write memory barriers .

 

The misc kernel subsystem

What the misc kernel subsystem is useful for .

API of the misc kernel subsystem, both the kernel side and user space side .

 

Time, Delays, Processes, scheduling, sleeping and interrupts sleeping and handling interrupts in a device driver in a real example

Time measurement .

Process management in the Linux kernel .

Process Specific registers .

The Linux kernel scheduler and how processes sleep .

Interrupt handling in device drivers .

interrupt handler registration and programming, scheduling deferred work .

IRQ Number .

Interrupt Sharing .

Interrupt Driven I/O .

Kernel Timers .

Delaying Execution .

Tasklets .

Workqueues .

Adding read capability to the character driver developed earlier .

Register an interrupt handler .

Waiting for data to be available in the read() file operation .

Waking up the code when data is available from the device .

 

Concurrency and Race Conditions Locking in action

Issues with concurrent access to shared resources .

Locking primitives: mutexes, semaphores, spinlocks .

Atomic operations .

Typical locking issues .

Using the lock validator to identify the sources of locking problems .

Observe problems due to concurrent accesses to the device .

Add locking to the driver to fix these issues .

 

USB Drivers

USB Device Basics .

Writing a USB Driver .

probe and disconnect .

USB Transfers Without Urbs .

 

Driver debugging techniques investigating kernel faults in action

Debugging with printk .

Using Debugfs .

Analyzing a kernel oops .

Using kgdb, a kernel debugger .

Using the Magic SysRq commands .

Studying a broken driver .

Analyzing a kernel fault message and locating the problem in the source code .

 

The Linux kernel development process

Organization of the kernel community .

The release schedule and process: release candidates, stable releases, long-term support, etc .

Legal aspects, licensing .

How to submit patches to contribute code to the community .