An in-depth analysis of Linux device driver interrupts (1) (2)
4. Interrupt handler
The interrupt handler in Linux is very unique. Its interrupt handler is divided into two parts: the upper half (tophalf) and the lower half (bottom half). The reason why there are upper and lower halves is entirely due to the efficiency of interrupt processing.
The function of the upper half is "Registration Interruption". When an interrupt occurs, it hangs the lower half of the interrupt routine in the device driver into the lower half of the device's execution queue, and then it's fine - waiting for a new interrupt to arrive. In this way, the top half will be executed quickly, and he can accept more interruptions generated by the equipment she is responsible for. The reason why the upper part is faster is that it completely masks interrupts. If it does not finish executing, other interrupts cannot be processed in time and can only wait until the interrupt handler is executed. Therefore, to service and process as many interrupts generated by the device as possible, the interrupt handler must be fast.
However, the processing of some interrupt events is more complicated, so the interrupt handler must spend a little more time to complete the thing. But how to resolve the contradiction of completing complex processing in a short time? At this time, Linux introduced the concept of the lower half. The biggest difference between the lower half and the upper half is that the lower half is interruptible, while the upper half is uninterruptible.
The lower half does almost everything the interrupt handler does, because the upper half just queues the lower half to the interrupt processing queue of the device they are responsible for, and then doesn't care about anything. The lower part is generally responsible for observing the device to obtain event information that generates interrupts, and performing corresponding processing based on this information (usually obtained by reading the registers on the device). If there are times when the second half doesn't know what to do, he uses the famous ostrich algorithm to solve the problem - to put it bluntly, he ignores the event.
Since the lower half is interruptible, if other devices are interrupted while it is running, the lower half can be temporarily interrupted. Wait until the upper half of that device is finished running, and then run it again. . But one thing you must pay attention to is that if a device interrupt handler is running, no matter whether it is running the upper half or the lower half, as long as the interrupt handler has not finished processing, new interrupts generated by the device during this period will Interrupts will be ignored. Because interrupt handlers are not reentrant, the same interrupt handler cannot be executed in parallel.
Before Linux Kernel 2.0, interrupts were divided into fast interrupts and slow interrupts (we will not talk about pseudo-interrupts here). The lower half of the fast interrupt is also uninterruptible, which can ensure that it executes faster. However, as the hardware level continues to rise, there is no difference in the running speed of fast interrupts and slow interrupts. Therefore, in order to improve the efficiency of interrupt routine transaction processing, starting from Linux kernel 2.0, all interrupt handlers are in the form of slow interrupts. --Their lower half can be interrupted.
However, in the second half, you can also mask interrupts - if a certain piece of code cannot be interrupted. You can use cti, sti or save_flag, restore_flag to realize your idea. As for their usage and differences, please refer to the interrupt processing section of the designated reference book in this article.
For further details, please refer to the reference book specified in this article. I will not go into details here. It is not my purpose to introduce the details in detail. My purpose is to organize the concepts.
5. Set the interrupt flag bit
When processing an interrupt, the interrupt controller will block the device that originally sent the interrupt until the last interrupt she sent has been processed. Therefore, if the device that sent the interrupt sends another interrupt during interrupt processing, the interrupt will be lost forever.
The reason why this happens is because the interrupt controller cannot buffer interrupt information, so if a new interrupt arrives before the current interrupt is processed, it will definitely lose the new interrupt. However, this defect can be solved by setting the "set interrupt flag" (sti) on the main processor (CPU), because the main processor has the function of buffering interrupts. If "set interrupt flag bit" is used, then the sti function can be used to service the previously masked interrupt after the interrupt is processed.
The above is the in-depth analysis of Linux device driver interrupts (1) (2). For more related content, please pay attention to the PHP Chinese website (www.php.cn)!

Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

Hot Topics



How to use Docker Desktop? Docker Desktop is a tool for running Docker containers on local machines. The steps to use include: 1. Install Docker Desktop; 2. Start Docker Desktop; 3. Create Docker image (using Dockerfile); 4. Build Docker image (using docker build); 5. Run Docker container (using docker run).

The key differences between CentOS and Ubuntu are: origin (CentOS originates from Red Hat, for enterprises; Ubuntu originates from Debian, for individuals), package management (CentOS uses yum, focusing on stability; Ubuntu uses apt, for high update frequency), support cycle (CentOS provides 10 years of support, Ubuntu provides 5 years of LTS support), community support (CentOS focuses on stability, Ubuntu provides a wide range of tutorials and documents), uses (CentOS is biased towards servers, Ubuntu is suitable for servers and desktops), other differences include installation simplicity (CentOS is thin)

Troubleshooting steps for failed Docker image build: Check Dockerfile syntax and dependency version. Check if the build context contains the required source code and dependencies. View the build log for error details. Use the --target option to build a hierarchical phase to identify failure points. Make sure to use the latest version of Docker engine. Build the image with --t [image-name]:debug mode to debug the problem. Check disk space and make sure it is sufficient. Disable SELinux to prevent interference with the build process. Ask community platforms for help, provide Dockerfiles and build log descriptions for more specific suggestions.

Docker process viewing method: 1. Docker CLI command: docker ps; 2. Systemd CLI command: systemctl status docker; 3. Docker Compose CLI command: docker-compose ps; 4. Process Explorer (Windows); 5. /proc directory (Linux).

Docker uses Linux kernel features to provide an efficient and isolated application running environment. Its working principle is as follows: 1. The mirror is used as a read-only template, which contains everything you need to run the application; 2. The Union File System (UnionFS) stacks multiple file systems, only storing the differences, saving space and speeding up; 3. The daemon manages the mirrors and containers, and the client uses them for interaction; 4. Namespaces and cgroups implement container isolation and resource limitations; 5. Multiple network modes support container interconnection. Only by understanding these core concepts can you better utilize Docker.

VS Code system requirements: Operating system: Windows 10 and above, macOS 10.12 and above, Linux distribution processor: minimum 1.6 GHz, recommended 2.0 GHz and above memory: minimum 512 MB, recommended 4 GB and above storage space: minimum 250 MB, recommended 1 GB and above other requirements: stable network connection, Xorg/Wayland (Linux)

VS Code is the full name Visual Studio Code, which is a free and open source cross-platform code editor and development environment developed by Microsoft. It supports a wide range of programming languages and provides syntax highlighting, code automatic completion, code snippets and smart prompts to improve development efficiency. Through a rich extension ecosystem, users can add extensions to specific needs and languages, such as debuggers, code formatting tools, and Git integrations. VS Code also includes an intuitive debugger that helps quickly find and resolve bugs in your code.

VS Code To switch Chinese mode: Open the settings interface (Windows/Linux: Ctrl, macOS: Cmd,) Search for "Editor: Language" settings Select "Chinese" in the drop-down menu Save settings and restart VS Code
