php教程 PHP开发 Linux 장치 드라이버 인터럽트에 대한 심층 분석 (1) (3)

Linux 장치 드라이버 인터럽트에 대한 심층 분석 (1) (3)

Dec 23, 2016 pm 02:32 PM

6. 인터럽트 핸들러의 비재진입

이전 섹션에서 인터럽트를 마스크해야 하는 경우가 있다고 언급했는데, 이 인터럽트를 마스크해야 하는 이유는 무엇입니까? 이는 동일한 인터럽트 루틴을 병렬화하는 것이 기술적으로 불가능하기 때문이 아니라 관리 고려 사항 때문입니다. 인터럽트 처리 중에 동일한 IRQ의 새로운 인터럽트를 차단해야 하는 이유는 인터럽트 핸들러가 재진입이 아니기 때문에 동일한 인터럽트 핸들러가 병렬로 실행될 수 없기 때문입니다. 여기서는 예를 들어 인터럽트 핸들러를 병렬화할 수 있으면 드라이버 잠금이 발생할 가능성이 있음을 알 수 있습니다. 드라이버가 잠겨 있으면 운영 체제가 반드시 충돌하지는 않지만 잠긴 드라이버가 지원하는 장치는 더 이상 사용할 수 없습니다. 장치 드라이버가 죽으면 장치도 죽습니다.

PS1을 트리거하는 이벤트로 인해 A1이 인터럽트를 생성하고 B1이 R1의 기존 데이터를 읽은 다음 코드 C1이 R2에 데이터를 씁니다. PS2를 트리거하는 이벤트로 인해 A2는 인터럽트를 생성하고 B2는 R1의 데이터를 삭제한 다음 C2는 R2의 데이터를 읽습니다.

PS1이 먼저 생성되고 A1과 B1 사이에서 실행될 때 PS2가 생성되면 A2는 인터럽트를 생성하고 PS2를 인터럽트합니다(작업 대기열의 끝에 매달림). R1이 삭제되었습니다. PS2가 C2로 실행되면 C1이 아직 R2에 데이터를 쓰지 않았기 때문에 C2는 여기서 일시 중지되고 PS2는 데이터를 읽을 수 있을 때 신호에 의해 깨어날 때까지 코드 C2에서 절전 모드로 유지됩니다. 이는 PS1의 B2가 원래 읽으려고 했던 R1의 데이터가 PS2의 B2에 의해 삭제되었기 때문입니다. 따라서 PS1 페이지는 읽을 데이터가 있을 때 신호에 의해 깨어날 때까지 B1에서 절전 모드로 유지됩니다. 이렇게 하면 PS1과 PS2를 깨우는 이벤트가 절대 발생하지 않으므로 PS1과 PS2가 잠깁니다.

디바이스 드라이버는 디바이스 레지스터를 처리해야 하기 때문에 디바이스 레지스터가 전역 변수이기 때문에 재진입 코드를 작성하기가 어렵습니다. 따라서 가장 간단한 방법은 동일한 장치의 인터럽트 핸들러의 병렬성을 금지하는 것입니다. 즉, 해당 장치의 인터럽트 핸들러는 재진입이 불가능합니다.

한 가지 분명한 점은 Linux 커널 버전 2.0에서는 모든 상위 절반이 중단되지 않는다는 것입니다(상위 절반의 작업은 원자적임). 서로 다른 장치 섹션의 하위 절반이 서로를 중단할 수 있습니다. 특정 하단 절반은 그 자체로 중단될 수 없습니다(즉, 동일한 하단 절반은 병렬로 연결될 수 없습니다).

인터럽트 핸들러는 비재진입이 필요하므로 프로그래머는 재진입 코드 작성에 대해 걱정할 필요가 없습니다. 내 경험에 따르면 재진입 장치 드라이버를 작성하는 것은 가능하지만 재진입 인터럽트 핸들러를 작성하는 것은 매우 드물고 거의 불가능합니다.

7. 경쟁 조건 발생 방지

경합 조건이 발생하면 교착 상태가 발생할 수 있으며, 심한 경우 전체 시스템이 잠길 수 있다는 사실은 모두가 알고 있습니다. 따라서 경쟁 조건을 피하십시오. 여기서는 많이 말하지 않겠지만 모두들 한 가지만 주의하면 됩니다. 인터럽트로 인해 발생하는 대부분의 경쟁 조건은 인터럽트가 절전 모드로 전환되는 커널 프로세스에 의해 발생합니다. 따라서 인터럽트를 구현할 때 프로세스가 휴면 상태가 되도록 주의해야 합니다. 필요한 경우 cli, sti 또는 save_flag, Restore_flag를 사용할 수 있습니다. 구체적인 내용은 이 기사에 명시된 참고서를 참조하세요.

8. 구현

드라이버의 인터럽트 루틴을 구현하는 방법은 독자의 몫입니다. 짧은 루틴의 소스 코드를 주의 깊게 읽고 드라이버 인터럽트 루틴 작성 규칙을 이해한다면 자신만의 인터럽트 루틴을 작성할 수 있습니다. 개념이 정확하고 코드가 올바른 규칙에 따라 작성된다면 의미가 있습니다. 저는 항상 개념이 먼저이고 얼마나 많은 코드를 작성할 수 있는지는 그 다음이라고 강조합니다. 올바르게 생각하려면 올바른 개념이 있어야 합니다.

(T114)

위 내용은 Linux 장치 드라이버 인터럽트에 대한 심층 분석입니다(1)(3). 자세한 내용은 PHP 중국어 웹사이트(www. .php.cn)!


본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

Web.xml을 열는 방법 Web.xml을 열는 방법 Apr 03, 2025 am 06:51 AM

Web.xml 파일을 열려면 다음 방법을 사용할 수 있습니다. 텍스트 편집기 (예 : 메모장 또는 문자 메시지)를 사용하여 통합 개발 환경 (예 : Eclipse 또는 NetBeans)을 사용하여 명령을 편집하십시오 (Windows : Notepad Web.xml; Mac/Linux : Open -A Texted web.xml).

C 언어로 멀티 스레딩을 구현하는 4 가지 방법 C 언어로 멀티 스레딩을 구현하는 4 가지 방법 Apr 03, 2025 pm 03:00 PM

언어의 멀티 스레딩은 프로그램 효율성을 크게 향상시킬 수 있습니다. C 언어에서 멀티 스레딩을 구현하는 4 가지 주요 방법이 있습니다. 독립 프로세스 생성 : 여러 독립적으로 실행되는 프로세스 생성, 각 프로세스에는 자체 메모리 공간이 있습니다. 의사-다일리트 레딩 : 동일한 메모리 공간을 공유하고 교대로 실행하는 프로세스에서 여러 실행 스트림을 만듭니다. 멀티 스레드 라이브러리 : PTHREADS와 같은 멀티 스레드 라이브러리를 사용하여 스레드를 만들고 관리하여 풍부한 스레드 작동 기능을 제공합니다. COROUTINE : 작업을 작은 하위 작업으로 나누고 차례로 실행하는 가벼운 다중 스레드 구현.

가장 잘 사용되는 Linux는 무엇입니까? 가장 잘 사용되는 Linux는 무엇입니까? Apr 03, 2025 am 12:11 AM

Linux는 서버 관리, 임베디드 시스템 및 데스크탑 환경으로 사용되는 것이 가장 좋습니다. 1) 서버 관리에서 Linux는 웹 사이트, 데이터베이스 및 응용 프로그램을 호스팅하는 데 사용되어 안정성과 안정성을 제공합니다. 2) 임베디드 시스템에서 Linux는 유연성과 안정성으로 인해 스마트 홈 및 자동차 전자 시스템에서 널리 사용됩니다. 3) 데스크탑 환경에서 Linux는 풍부한 응용 프로그램과 효율적인 성능을 제공합니다.

데비안 하프 (Debian Hadoop)의 호환성은 어떻습니까? 데비안 하프 (Debian Hadoop)의 호환성은 어떻습니까? Apr 02, 2025 am 08:42 AM

Debianlinux는 안정성과 보안으로 유명하며 서버, 개발 및 데스크탑 환경에서 널리 사용됩니다. 현재 Debian 및 Hadoop과 직접 호환성에 대한 공식 지침이 부족하지만이 기사에서는 Debian 시스템에 Hadoop를 배포하는 방법을 안내합니다. 데비안 시스템 요구 사항 : Hadoop 구성을 시작하기 전에 Debian 시스템이 Hadoop의 최소 작동 요구 사항을 충족하는지 확인하십시오. 여기에는 필요한 JAVA 런타임 환경 (JRE) 및 Hadoop 패키지 설치가 포함됩니다. Hadoop 배포 단계 : 다운로드 및 unzip hadoop : 공식 Apachehadoop 웹 사이트에서 필요한 Hadoop 버전을 다운로드하여 해결하십시오.

GO를 사용하여 Oracle 데이터베이스에 연결할 때 Oracle 클라이언트를 설치해야합니까? GO를 사용하여 Oracle 데이터베이스에 연결할 때 Oracle 클라이언트를 설치해야합니까? Apr 02, 2025 pm 03:48 PM

GO를 사용하여 Oracle 데이터베이스에 연결할 때 Oracle 클라이언트를 설치해야합니까? GO에서 개발할 때 Oracle 데이터베이스에 연결하는 것이 일반적인 요구 사항입니다 ...

libv는 두입니다 libv는 두입니다 Apr 03, 2025 pm 08:03 PM

Lua-Libuv라는 프로젝트를 개발했으며 내 경험을 공유하게되어 기쁩니다. 이 프로젝트의 원래 의도는 Libuv (C로 작성된 비동기 I/O 라이브러리)를 사용하여 C 언어를 심층적으로 배울 필요없이 간단한 HTTP 서버를 구축하는 방법을 탐색하는 것입니다. Chatgpt의 도움으로 Http.c의 기본 코드를 완료했습니다. 지속적인 연결을 다룰 때 적절한 시간에 연결을 닫고 리소스를 자유롭게하는 것을 성공적으로 구현했습니다. 처음에는 연결을 닫아 기본 프로그램을 종료 한 간단한 서버를 만들려고했지만 문제가있었습니다. 스트리밍을 사용하여 데이터 블록을 전송하려고 시도했지만 작동하는 동안 메인 스레드가 차단됩니다. 결국, 나는 내 목표가 C 언어를 깊이 배우는 것이 아니기 때문에이 접근법을 포기하기로 결정했습니다. 마지막으로, 나는

MySQL에 루트로 로그인 할 수 없습니다 MySQL에 루트로 로그인 할 수 없습니다 Apr 08, 2025 pm 04:54 PM

Root로 MySQL에 로그인 할 수없는 주된 이유는 권한 문제, 구성 파일 오류, 암호 일관성이 없음, 소켓 파일 문제 또는 방화벽 차단입니다. 솔루션에는 다음이 포함됩니다. 구성 파일의 BAND-ADDRESS 매개 변수가 올바르게 구성되어 있는지 확인하십시오. 루트 사용자 권한이 수정 또는 삭제되어 재설정되었는지 확인하십시오. 케이스 및 특수 문자를 포함하여 비밀번호가 정확한지 확인하십시오. 소켓 파일 권한 설정 및 경로를 확인하십시오. 방화벽이 MySQL 서버에 연결되는지 확인하십시오.

C 언어 조건부 편집 : 초보자가 실제 응용 프로그램에 대한 자세한 안내서 C 언어 조건부 편집 : 초보자가 실제 응용 프로그램에 대한 자세한 안내서 Apr 04, 2025 am 10:48 AM

C 언어 조건부 컴파일은 컴파일 시간 조건을 기반으로 코드 블록을 선택적으로 컴파일하는 메커니즘입니다. 입문 방법에는 다음이 포함됩니다. #IF 및 #ELSE 지시문을 사용하여 조건에 따라 코드 블록을 선택합니다. 일반적으로 사용되는 조건부 표현에는 STDC, _WIN32 및 LINUX가 포함됩니다. 실제 사례 : 운영 체제에 따라 다른 메시지를 인쇄합니다. 시스템의 숫자 수에 따라 다른 데이터 유형을 사용하십시오. 컴파일러에 따라 다른 헤더 파일이 지원됩니다. 조건부 컴파일은 코드의 휴대 성과 유연성을 향상시켜 컴파일러, 운영 체제 및 CPU 아키텍처 변경에 적응할 수 있도록합니다.

See all articles