دسترسی نامحدود
برای کاربرانی که ثبت نام کرده اند
برای ارتباط با ما می توانید از طریق شماره موبایل زیر از طریق تماس و پیامک با ما در ارتباط باشید
در صورت عدم پاسخ گویی از طریق پیامک با پشتیبان در ارتباط باشید
برای کاربرانی که ثبت نام کرده اند
درصورت عدم همخوانی توضیحات با کتاب
از ساعت 7 صبح تا 10 شب
ویرایش:
نویسندگان: Kaiwan N Billimoria
سری:
ISBN (شابک) : 9781801070829
ناشر: Packt Publishing
سال نشر: 2021
تعداد صفحات:
زبان: English
فرمت فایل : EPUB (درصورت درخواست کاربر به PDF، EPUB یا AZW3 تبدیل می شود)
حجم فایل: 11 Mb
در صورت تبدیل فایل کتاب Linux Kernel Programming Part 2 - Char Device Drivers and Kernel Synchronization به فرمت های PDF، EPUB، AZW3، MOBI و یا DJVU می توانید به پشتیبان اطلاع دهید تا فایل مورد نظر را تبدیل نمایند.
توجه داشته باشید کتاب برنامه نویسی کرنل لینوکس قسمت 2 - درایورهای دستگاه Char و همگام سازی هسته نسخه زبان اصلی می باشد و کتاب ترجمه شده به فارسی نمی باشد. وبسایت اینترنشنال لایبرری ارائه دهنده کتاب های زبان اصلی می باشد و هیچ گونه کتاب ترجمه شده یا نوشته شده به فارسی را ارائه نمی دهد.
نحوه نوشتن کد درایور کاراکتر با کیفیت بالا، رابط کاربری با فضای کاربر، کار با حافظه تراشه، و درک عمیق کار با وقفههای سختافزاری و همگامسازی هسته را کشف کنید. درک کنید که در هنگام کاوش تکنیکهای قدرتمند برای انجام رابط هسته کاربر، ورودی/خروجی محیطی و استفاده از مکانیزمهای هسته کار با اصول اولیه همگامسازی هسته برای حل مسائل همزمانی هسته. به کتاب برنامه نویسی هسته لینوکس. این کتاب مقدمهای جامع برای کسانی که در زمینه توسعه درایور دستگاه لینوکس تازه کار هستند فراهم میکند و شما را با نوشتن کد درایور دستگاه کاراکتر کلاس متفرقه (در هسته لینوکس 5.4 LTS) در کوتاهمدت راهاندازی میکند. شما با یادگیری نحوه نوشتن یک درایور ساده و کامل کاراکتر کلاس متفرقه قبل از اینکه درایور خود را با فرآیندهای حالت کاربر از طریق procfs، sysfs، debugfs، سوکتهای netlink و ioctl وصل کنید، شروع خواهید کرد. سپس خواهید فهمید که چگونه با حافظه ورودی/خروجی سخت افزاری کار کنید. این کتاب کار با وقفههای سختافزاری را به طور عمیق پوشش میدهد و به شما کمک میکند تخصیص درخواست وقفه (IRQ)، کنترلکنندههای IRQ رشتهای، تسکلتها و نرمافزارها را درک کنید. همچنین استفاده عملی از مکانیسمهای مفید هسته، تنظیم تأخیرها، تایمرها، رشتههای هسته و صفهای کاری را نیز بررسی خواهید کرد. در نهایت، خواهید فهمید که چگونه با پیچیدگی همگام سازی هسته با فناوری های قفل (mutexes، spinlocks، و اپراتورهای اتمی/refcount)، از جمله موضوعات پیشرفته تر مانند جلوه های کش، آغازگر تکنیک های بدون قفل، اجتناب از بن بست مقابله کنید. (با lockdep)، و تکنیک های اشکال زدایی قفل هسته. در پایان این کتاب هسته لینوکس، شما اصول نوشتن کد درایور دستگاه کاراکتر لینوکس برای پروژه ها و محصولات دنیای واقعی را یاد خواهید گرفت. آنچه یاد خواهید گرفت با اصول مدل دستگاه لینوکس مدرن (LDM) آشنا شوید. نوشتن یک درایور کاراکترهای کلاس متفرقه ساده و در عین حال کامل انجام رابط هسته کاربر با استفاده از روش های رایج درک و مدیریت وقفه های سخت افزاری با اطمینان انجام I/O در حافظه تراشه سخت افزاری محیطی کاوش APIهای هسته برای کار با تأخیرها، تایمرها، kthread ها و صف های کاری درک مسائل همزمانی هسته کار با اصول اولیه همگام سازی هسته و کشف نحوه شناسایی و جلوگیری از بن بست این کتاب برای چه کسی است. از این کتاب این کتاب برای برنامه نویسان لینوکس است که راه خود را با توسعه درایور دستگاه پیدا می کنند. توسعه دهندگان درایور دستگاه لینوکس که به دنبال غلبه بر مشکلات متداول و متداول توسعه هسته/درایور هستند، و همچنین انجام وظایف رایج درایور مانند رابط کاربر-کرنل، انجام ورودی/خروجی محیطی، مدیریت وقفه های سخت افزاری و مقابله با همزمانی، از این کتاب بهره خواهند برد. درک اولیه از هسته های داخلی لینوکس (و API های رایج)، توسعه ماژول هسته و برنامه نویسی C مورد نیاز است.
Discover how to write high-quality character driver code, interface with userspace, work with chip memory, and gain an in-depth understanding of working with hardware interrupts and kernel synchronization Key FeaturesDelve into hardware interrupt handling, threaded IRQs, tasklets, softirqs, and understand which to use whenExplore powerful techniques to perform user-kernel interfacing, peripheral I/O and use kernel mechanismsWork with key kernel synchronization primitives to solve kernel concurrency issuesBook Description Linux Kernel Programming Part 2 - Char Device Drivers and Kernel Synchronization is an ideal companion guide to the Linux Kernel Programming book. This book provides a comprehensive introduction for those new to Linux device driver development and will have you up and running with writing misc class character device driver code (on the 5.4 LTS Linux kernel) in next to no time. You\'ll begin by learning how to write a simple and complete misc class character driver before interfacing your driver with user-mode processes via procfs, sysfs, debugfs, netlink sockets, and ioctl. You\'ll then find out how to work with hardware I/O memory. The book covers working with hardware interrupts in depth and helps you understand interrupt request (IRQ) allocation, threaded IRQ handlers, tasklets, and softirqs. You\'ll also explore the practical usage of useful kernel mechanisms, setting up delays, timers, kernel threads, and workqueues. Finally, you\'ll discover how to deal with the complexity of kernel synchronization with locking technologies (mutexes, spinlocks, and atomic/refcount operators), including more advanced topics such as cache effects, a primer on lock-free techniques, deadlock avoidance (with lockdep), and kernel lock debugging techniques. By the end of this Linux kernel book, you\'ll have learned the fundamentals of writing Linux character device driver code for real-world projects and products. What you will learnGet to grips with the basics of the modern Linux Device Model (LDM)Write a simple yet complete misc class character device driverPerform user-kernel interfacing using popular methodsUnderstand and handle hardware interrupts confidentlyPerform I/O on peripheral hardware chip memoryExplore kernel APIs to work with delays, timers, kthreads, and workqueuesUnderstand kernel concurrency issuesWork with key kernel synchronization primitives and discover how to detect and avoid deadlockWho this book is for An understanding of the topics covered in the Linux Kernel Programming book is highly recommended to make the most of this book. This book is for Linux programmers beginning to find their way with device driver development. Linux device driver developers looking to overcome frequent and common kernel/driver development issues, as well as perform common driver tasks such as user-kernel interfaces, performing peripheral I/O, handling hardware interrupts, and dealing with concurrency will benefit from this book. A basic understanding of Linux kernel internals (and common APIs), kernel module development, and C programming is required.
Cover Title Page Copyright and Credits Dedication About Packt Contributors Table of Contents Preface Section 1: Character Device Driver Basics Chapter 1: Writing a Simple misc Character Device Driver Technical requirements Getting started with writing a simple misc character device driver Understanding the device basics A quick note on the Linux Device Model Writing the misc driver code – part 1 Understanding the connection between the process, the driver, and the kernel Handling unsupported methods Writing the misc driver code – part 2 Writing the misc driver code – part 3 Testing our simple misc driver Copying data from kernel to user space and vice versa Leveraging kernel APIs to perform the data transfer A misc driver with a secret Writing the 'secret' misc device driver's code Our secret driver – the init code Our secret driver – the read method Our secret driver – the write method Our secret driver – cleanup Our secret driver – the user space test app Issues and security concerns Hacking the secret driver Bad driver – buggy read() Bad driver – buggy write() – a privesc! User space test app modifications Device driver modifications Let's get root now Summary Questions Further reading Chapter 2: User-Kernel Communication Pathways Technical requirements Approaches to communicating/interfacing a kernel driver with a user space C app Interfacing via the proc filesystem (procfs) Understanding the proc filesystem Directories under /proc The purpose behind the proc filesystem procfs is off-bounds to driver authors Using procfs to interface with the user space Basic procfs APIs The four procfs files we will create Trying out the dynamic debug_level procfs control Dynamically controlling debug_level via procfs A few misc procfs APIs Interfacing via the sys filesystem (sysfs) Creating a sysfs (pseudo) file in code Creating a simple platform device Platform devices Tying it all together – setting up the device attributes and creating the sysfs file The code for implementing our sysfs file and its callbacks The "one value per sysfs file" rule Interfacing via the debug filesystem (debugfs) Checking for the presence of debugfs Looking up the debugfs API documentation An interfacing example with debugfs Creating and using the first debugfs file Creating and using the second debugfs file Helper debugfs APIs for working on numeric globals Removing the debugfs pseudo file(s) Seeing a kernel bug – an Oops! Debugfs – actual users Interfacing via netlink sockets Advantages using sockets Understanding what a netlink socket is Writing the user space netlink socket application Writing the kernel-space netlink socket code as a kernel module Trying out our netlink interfacing project Interfacing via the ioctl system call Using ioctl in the user and kernel space User space – using the ioctl system call Kernel space – using the ioctl system call ioctl as a debug interface Comparing the interfacing methods – a table Summary Questions Further reading Chapter 3: Working with Hardware I/O Memory Technical requirements Accessing hardware I/O memory from the kernel Understanding the issue with direct access The solution – mapping via I/O memory or I/O port Asking the kernel's permission Understanding and using memory-mapped I/O Using the ioremap*() APIs The newer breed – the devm_* managed APIs Obtaining the device resources All in one with the devm_ioremap_resource() API Looking up the new mapping via /proc/iomem MMIO – performing the actual I/O Performing 1- to 8-byte reads and writes on MMIO memory regions Performing repeating I/O on MMIO memory regions Setting and copying on MMIO memory regions Understanding and using port-mapped I/O PMIO – performing the actual I/O A PIO example – the i8042 Looking up the port(s) via /proc/ioports Port I/O – a few remaining points to note Summary Questions Further reading Chapter 4: Handling Hardware Interrupts Technical requirements Hardware interrupts and how the kernel handles them Allocating the hardware IRQ Allocating your interrupt handler with request_irq() Freeing the IRQ line Setting interrupt flags Understanding level- and edge-triggered interrupts – a brief note Code view 1 – the IXGB network driver Implementing the interrupt handler routine Interrupt context guidelines – what to do and what not to do Don't block – spotting possibly blocking code paths Interrupt masking – the defaults and controlling it Keep it fast Writing the interrupt handler routine itself Code view 2 – the i8042 driver's interrupt handler Code view 3 – the IXGB network driver's interrupt handler IRQ allocation – the modern way – the managed interrupt facility Working with the threaded interrupts model Employing the threaded interrupt model – the API Employing the managed threaded interrupt model – the recommended way Code view 4 – the STM32 F7 microcontroller's threaded interrupt handler Internally implementing the threaded interrupt Why use threaded interrupts? Threaded interrupts – to really make it real time Constraints when using a threaded handler Working with either hardirq or threaded handlers Enabling and disabling IRQs The NMI Viewing all allocated interrupt (IRQ) lines Understanding and using top and bottom halves Specifying and using a tasklet Initializing the tasklet Running the tasklet Understanding the kernel softirq mechanism Available softirqs and what they are for Understanding how the kernel runs softirqs Running tasklets Employing the ksoftirqd kernel threads Softirqs and concurrency Hardirqs, tasklets, and threaded handlers – what to use when Fully figuring out the context Viewing the context – examples How Linux prioritizes activities A few remaining FAQs answered Load balancing interrupts and IRQ affinity Does the kernel maintain separate IRQ stacks? Measuring metrics and latency Measuring interrupts with [e]BPF Measuring time servicing individual hardirqs Measuring time servicing individual softirqs Using Ftrace to get a handle on system latencies Finding the interrupts disabled worst-case time latency with Ftrace Other tools Summary Questions Further reading Chapter 5: Working with Kernel Timers, Threads, and Workqueues Technical requirements Delaying for a given time in the kernel Understanding how to use the *delay() atomic APIs Understanding how to use the *sleep() blocking APIs Taking timestamps within kernel code Let's try it – how long do delays and sleeps really take? The "sed" drivers – to demo kernel timers, kthreads, and workqueues Setting up and using kernel timers Using kernel timers Our simple kernel timer module – code view 1 Our simple kernel timer module – code view 2 Our simple kernel timer module – running it sed1 – implementing timeouts with our demo sed1 driver Deliberately missing the bus Creating and working with kernel threads A simple demo – creating a kernel thread Running the kthread_simple kernel thread demo The sed2 driver – design and implementation sed2 – the design sed2 driver – code implementation sed2 – trying it out Querying and setting the scheduling policy/priority of a kernel thread Using kernel workqueues The bare minimum workqueue internals Using the kernel-global workqueue Initializing the kernel-global workqueue for your task – INIT_WORK() Having your work task execute – schedule_work() Variations of scheduling your work task Cleaning up – canceling or flushing your work task A quick summary of the workflow Our simple work queue kernel module – code view Our simple work queue kernel module – running it The sed3 mini project – a very brief look Summary Questions Further reading Section 2: Delving Deeper Chapter 6: Kernel Synchronization - Part 1 Critical sections, exclusive execution, and atomicity What is a critical section? A classic case – the global i ++ Concepts – the lock A summary of key points Concurrency concerns within the Linux kernel Multicore SMP systems and data races Preemptible kernels, blocking I/O, and data races Hardware interrupts and data races Locking guidelines and deadlocks Mutex or spinlock? Which to use when Determining which lock to use – in theory Determining which lock to use – in practice Using the mutex lock Initializing the mutex lock Correctly using the mutex lock Mutex lock and unlock APIs and their usage Mutex lock – via [un]interruptible sleep? Mutex locking – an example driver The mutex lock – a few remaining points Mutex lock API variants The mutex trylock variant The mutex interruptible and killable variants The mutex io variant The semaphore and the mutex Priority inversion and the RT-mutex Internal design Using the spinlock Spinlock – simple usage Spinlock – an example driver Test – sleep in an atomic context Testing on a 5.4 debug kernel Testing on a 5.4 non-debug distro kernel Locking and interrupts Using spinlocks – a quick summary Summary Questions Further reading Chapter 7: Kernel Synchronization - Part 2 Using the atomic_t and refcount_t interfaces The newer refcount_t versus older atomic_t interfaces The simpler atomic_t and refcount_t interfaces Examples of using refcount_t within the kernel code base 64-bit atomic integer operators Using the RMW atomic operators RMW atomic operations – operating on device registers Using the RMW bitwise operators Using bitwise atomic operators – an example Efficiently searching a bitmask Using the reader-writer spinlock Reader-writer spinlock interfaces A word of caution The reader-writer semaphore Cache effects and false sharing Lock-free programming with per-CPU variables Per-CPU variables Working with per-CPU Allocating, initialization, and freeing per-CPU variables Performing I/O (reads and writes) on per-CPU variables Per-CPU – an example kernel module Per-CPU usage within the kernel Lock debugging within the kernel Configuring a debug kernel for lock debugging The lock validator lockdep – catching locking issues early Examples – catching deadlock bugs with lockdep Example 1 – catching a self deadlock bug with lockdep Fixing it Example 2 – catching an AB-BA deadlock with lockdep lockdep – annotations and issues lockdep annotations lockdep issues Lock statistics Viewing lock stats Memory barriers – an introduction An example of using memory barriers in a device driver Summary Questions Further reading Other Books You May Enjoy Index