Linux 드라이버는 어떤 공간에서 실행되나요?
Linux 드라이버는 "커널" 공간에서 실행됩니다. 일반적으로 드라이버는 kmalloc()를 호출하여 데이터 구조에 대한 메모리를 할당하고, vmalloc()를 호출하여 활성 스왑 영역에 대한 데이터 구조를 할당하거나, 일부 I/O 드라이버에 대한 버퍼를 할당하거나, kmalloc 및 vmalloc이 커널 메모리를 할당할 공간을 할당합니다.
이 튜토리얼의 운영 환경: linux7.3 시스템, Dell G3 컴퓨터.
Linux 드라이버는 "커널" 공간에서 실행됩니다.
일반적으로 작성된 마이크로 컨트롤러 프로그램의 경우 애플리케이션과 드라이버가 혼합되는 경우가 많습니다. 일정 수준의 능력을 갖춘 마이크로 컨트롤러 프로그래머는 애플리케이션과 드라이버의 계층화를 실현할 수 있습니다. Linux 시스템에서는 애플리케이션과 드라이버가 강제로 계층화되었습니다.
마이크로 컨트롤러 프로그램에서 애플리케이션은 기본 레지스터를 직접 작동할 수 있습니다. 그러나 Linux 시스템에서는 이러한 동작이 금지됩니다. 예를 들어 Linux 애플리케이션 작성자는 의도적으로 애플리케이션에서 전원 관리 드라이버를 호출하고 시스템을 종료할 가치가 있지 않습니까?
특정 Linux 애플리케이션은 그림에 표시된 대로 드라이버를 호출합니다.
애플리케이션은 사용자 공간에서 실행되고 드라이버는 커널 공간에서 실행됩니다. 사용자 공간의 애플리케이션이 커널을 동작시키려면 사용자 공간에서 커널 공간으로 진입해 최하위 계층을 동작시키기 위해 '시스템 호출' 방식을 거쳐야 한다.
Linux의 커널 공간
커널도 프로그램이므로 자체 가상 메모리 공간도 있어야 합니다. 그러나 사용자 프로그램을 서비스하는 프로그램으로서 커널 공간에는 고유한 특성이 있습니다.
커널 공간과 사용자 공간의 관계
32비트 시스템에서 프로그램의 가상 공간은 최대 4GB까지 가능하므로 가장 직접적인 방법은 커널을 프로그램으로 간주하여 만드는 것입니다. 다른 프로그램과 마찬가지로 4GB의 공간도 있습니다. 그러나 이 접근 방식은 시스템이 사용자 프로그램의 페이지 테이블과 커널 페이지 테이블을 지속적으로 전환하게 하여 컴퓨터의 효율성에 영향을 미칩니다. 이 문제를 해결하는 가장 좋은 방법은 4GB 공간을 두 부분으로 나누는 것입니다. 한 부분은 사용자 공간이고 다른 부분은 커널 공간입니다. 이렇게 하면 커널 공간이 고정되고 변경되지 않고 프로그램이 전환될 때 프로그램 변경. 이 접근 방식의 유일한 단점은 커널 공간과 사용자 공간이 모두 작아진다는 것입니다.
예: i386과 같은 32비트 하드웨어 플랫폼에서 Linux는 page.h 파일에 상수 PAGE_OFFSET을 정의합니다.#ifdef CONFIG_MMU #define __PAGE_OFFSET (0xC0000000) //0xC0000000为3GB #else #define __PAGE_OFFSET (0x00000000) #endif #define PAGE_OFFSET ((unsigned long)__PAGE_OFFSET)
Linux는 PAGE_OFFSET을 경계로 사용하여 4GB 가상 메모리 공간을 두 부분으로 나눕니다. 0부터 3G-1까지의 낮은 주소 공간은 3GB 크기의 사용자 공간이고, 3GB부터 4GB-1까지의 높은 주소 공간은 1GB 크기의 커널 공간입니다.
시스템에서 여러 프로그램이 실행 중인 경우 여러 사용자 공간과 커널 공간의 관계는 다음과 같이 표현할 수 있습니다.커널 공간의 전체 레이아웃
리눅스의 개발 과정에서 하드웨어 장비의 업데이트와 기술 수준의 향상에 따라 커널 공간 레이아웃의 개발도 지속적인 패치의 한 방법입니다. 그 결과 커널 공간은 여러 영역으로 나누어지고 영역마다 매핑 방법이 달라집니다.보통 사람들은 Linux 커널 공간이 DMA 영역(ZONE_DMA), 일반 영역(ZONE_NORMAL), 고급 메모리 영역(ZONE_HIGHMEM)의 세 가지 영역으로 구성되어 있다고 생각합니다.
실제 물리 메모리가 작을 때 커널 공간을 직접 매핑
초기 컴퓨터에 구성된 실제 물리 메모리는 대개 몇 MB에 불과하므로커널이 물리 주소에 액세스하는 속도를 향상시키기 위해 가상 주소를 통한 메모리, 커널 공간의 가상화 주소와 물리 메모리 주소는 낮은 주소에서 높은 주소까지 1:1로 대응하는 고정된 매핑 방식을 채택합니다. 아래 그림과 같이
이 고정 매핑 방법은 가상 주소와 물리적 메모리 주소를 만듭니다. 주소 간의 관계는 매우 간단해집니다. 즉, 커널 가상 주소와 실제 물리적 주소는 고정 오프셋 PAGE_OFFSET에 의해서만 값이 달라지므로 커널이 가상 주소를 사용할 때 물리적 페이지 프레임에 액세스하려면 가상 주소에서 PAGE_OFFSET만 빼면 실제 물리적 주소를 얻을 수 있으며 이는 페이지 테이블을 사용하는 것보다 훨씬 빠릅니다.
이 방법은 거의 물리 주소를 직접 사용하기 때문에 이런 고정 매핑 기반의 커널 공간을 "물리적 메모리 공간", 줄여서 물리 메모리라고도 합니다. 또한 고정 매핑 방식은 선형 매핑이므로 이 영역을 선형 매핑 영역이라고도 합니다.
물론, 이 경우(컴퓨터의 실제 물리적 메모리가 작은 경우) 커널 고정 매핑 공간은 전체 1GB 커널 공간 중 일부만 차지합니다. 예를 들어 32MB의 실제 물리 메모리로 x86 컴퓨터 시스템을 구성할 때 커널의 고정 매핑 영역은 PAGE_OFFSET~(PAGE_OFFSET+0x02000000)의 32MB 공간입니다. 그렇다면 커널 공간에 남아있는 커널 가상 공간은 어떻게 해야 할까요?
물론 일반적인 가상 공간 관리 방법에 따른 페이지 테이블의 비선형 매핑에는 여전히 물리적 메모리가 사용됩니다. 구체적으로 1GB 커널 공간 전체에서 고정 매핑 영역을 제거한 후 나머지 부분에서 처음의 8MB 격리 영역을 제거하고 나머지는 사용자 공간과 동일하게 매핑되는 일반 가상 메모리 매핑 영역이다. . 이 영역은 가상 주소와 물리 주소 사이에 고정된 매핑 관계가 없을 뿐만 아니라, 커널 함수 vmalloc()을 호출하여 동적 메모리를 획득하므로 이 영역을 아래 그림과 같이 vmalloc 할당 영역이라 부른다. :
여기에 언급된 커널 공간과 물리적 페이지 프레임 간의 고정 매핑은 본질적으로 커널 페이지를 물리적 페이지 프레임에 "예약"하는 것입니다. 이는 이러한 페이지가 이러한 물리적 페이지 프레임을 "점유"한다는 의미는 아닙니다. 즉, 가상 페이지가 실제로 물리적 페이지 프레임에 액세스해야 하는 경우에만 가상 페이지가 물리적 페이지 프레임에 바인딩됩니다. 일반적으로 해당 가상 페이지에서 물리적 페이지 프레임을 사용하지 않는 경우 페이지 프레임은 사용자 공간과 나중에 소개할 커널 kmalloc 할당 영역에서 사용할 수 있습니다.
즉, 실제 물리 메모리가 작은 시스템에서 실제 메모리 크기는 커널 공간의 물리 메모리 영역과 vmalloc 할당 영역의 경계가 됩니다.ZONE_DMA 영역과 ZONE_NORMAL 영역
1GB 커널 공간 전체에 대해 공간 앞부분의 16MB를 DMA 영역, 즉 ZONE_DMA 영역이라고 부르기도 합니다. 물리적 메모리의 DMA 공간을 고정했습니다. 나머지 16MB 공간을 일반 영역, 즉 ZONE_NORMAL이라고 합니다.
커널 공간의 하이엔드 메모리
컴퓨터 기술의 발전으로 컴퓨터의 실제 물리적 메모리가 점점 커지고 있으며, 이로 인해 커널 고정 매핑 영역(선형 영역)이 더 커지고 있습니다. 그리고 더 크다. 분명히 제한이 없으면 실제 물리적 메모리가 1GB에 도달하면 vmalloc 할당 영역(비선형 영역)이 더 이상 존재하지 않게 됩니다. 따라서 이전에 개발된 vmalloc()을 호출하는 커널 코드는 더 이상 사용할 수 없습니다. 물론 초기 커널 코드와 호환되기 위해서는 이는 허용되지 않습니다.
다음 그림은 이 커널 공간이 직면한 상황을 보여줍니다.위의 문제가 발생한 이유는 실제 물리적 메모리가 1GB를 초과할 수 있다는 것을 예상하지 못했기 때문에 커널의 경계가 고정되었기 때문입니다. 매핑 영역이 설정되지 않았습니다. 제한을 설정하고 실제 물리적 메모리가 증가함에 따라 증가하도록 합니다.
위 문제를 해결하는 방법은 다음과 같습니다.물리적 메모리 증가에 따라 임의로 증가할 수 없도록 커널 공간의 고정 매핑 영역의 상한을 제한합니다. Linux에서는 커널 매핑 영역의 상한값이 1G보다 작은 상수 high_menory보다 클 수 없다고 규정하고 있으며, 실제 물리적 메모리가 큰 경우에는 3G+high_memory를 물리적 메모리 영역을 결정하는 경계로 사용합니다.
예: x86 시스템의 경우 high_memory 값은 896M이므로 1GB 커널 공간 중 나머지 128MB는 비선형 매핑 영역입니다. 이는 어떠한 경우에도 커널이 초기 코드와 호환될 만큼 충분한 비선형 매핑 영역을 가지며 일반적인 가상 메모리 방식으로 1GB 이상의 실제 물리적 메모리에 액세스할 수 있음을 보장합니다.즉, 하이엔드 메모리의 가장 기본적인 아이디어는 주소 공간의 섹션을 빌려서 임시 주소 매핑을 설정하고 사용 후 해제하는 것입니다. 이 주소 공간을 재활용하여 모든 물리적 메모리에 액세스할 수 있습니다. 컴퓨터에 큰 물리적 메모리가 있는 경우 커널 공간의 개략도는 다음과 같습니다.
- ZONE_DMA: 커널 공간 시작 16MB
- ZONE_NORMAL: 커널 공간 16MB~896MB(고정 매핑)
- ZONE_HIGHMEM: 커널 공간 896MB ~ 끝(1G)
응용 대상에 따라 다르며, high-end 메모리는 vmalloc 영역, 영구 매핑 영역, 임시 매핑 영역으로 구분됩니다. 커널 공간에서 고급 메모리의 레이아웃은 아래 그림과 같습니다.
vmalloc 매핑 영역
vmalloc 매핑 영역은 고급 메모리의 주요 부분입니다. 이 간격의 헤드와 커널 선형 매핑 공간 사이의 간격은 8MB 격리 영역과 끝 부분의 4KB 격리 영역 및 후속 영구 매핑 영역입니다.
vmalloc 매핑 영역의 매핑 방법은 사용자 공간의 매핑 방법과 완전히 동일합니다. 커널은 vmalloc() 함수를 호출하여 이 영역에서 메모리를 얻을 수 있습니다. 이 함수의 기능은 사용자 공간의 malloc()과 동일합니다. 제공되는 메모리 공간은 가상 주소에서 연속적입니다. (물리적 주소는 연속성을 보장하지 않습니다.)
영구 커널 매핑 영역
alloc_page()를 통해 고성능 메모리에 해당하는 페이지를 얻은 경우 이에 대한 선형 공간은 어떻게 찾나요?
커널은 영구 커널 매핑 영역인 고급 메모리를 매핑하는 데 사용되는 PKMAP_BASE부터 시작하여 이러한 목적을 위해 특별히 선형 공간을 따로 설정합니다.
영구 커널 매핑 영역에서는 kmap() 함수를 호출하여 물리적 페이지 프레임과 커널 가상 페이지 간의 장기 매핑을 설정할 수 있습니다. 이 공간은 일반적으로 4MB이며 최대 1024개의 페이지 프레임을 매핑할 수 있습니다. 따라서 페이지 프레임의 회전율을 높이려면 kunmap() 함수를 제때에 호출하여 물리적 페이지 프레임을 해제해야 합니다. 더 이상 사용되지 않습니다.
임시 매핑 영역
임시 매핑 영역은 고정 매핑 영역, 예약 영역이라고도 합니다. 이 영역은 주로 다중 프로세서 시스템에서 사용됩니다. 이 영역에서 얻은 메모리 공간은 보호되지 않으므로 얻은 메모리를 제때에 사용해야 합니다. 그렇지 않으면 새 요청이 있으면 페이지 프레임의 내용을 덮어쓰게 됩니다. . 이므로 이 영역을 임시 매핑 영역이라고 합니다.
하이엔드 메모리 영역에 관한 아주 좋은 기사: Linux 사용자 공간과 커널 공간-하이엔드 메모리에 대한 자세한 설명.
커널 메모리 할당 수정자 gfp
커널 메모리 요청 함수에서 요청에 대해 필요한 설명을 제공하기 위해 Linux에서는 다양한 메모리 할당 수정자 gfp를 정의합니다. 이는 동작 수정자, 영역 수정자 및 유형 수정자입니다.
동작 수정자
메모리 할당 함수의 동작 수정자는 커널이 메모리를 할당하는 방법을 설명합니다. 주요 동작 수정자는 다음과 같습니다.
수정자 | 설명 |
__GFP_WAIT | 할당자는 잠자기 가능 |
__GFP_HIGH | 할당자는 긴급 상황에 접근할 수 있습니다. 이벤트 버퍼 풀 g___gfp_io allocator는 디스크를 시작할 수 있습니다 io |
__gfp_fs | 할당자는 파일 시스템을 시작할 수 있습니다. 캐시 |
__GFP_NOWARN | 할당자가 경고를 발행하지 않음 |
__GFP_REPEAT | 할당 실패 시 재할당 |
__GFP_NOFAILT | 성공할 때까지 할당 실패 시 재할당 |
__GFP_NORETRY | 할당이 실패하면 더 이상 재할당이 발생하지 않습니다. |
지역 수정자 | |
지역 수정자는 할당해야 하는 커널 공간 메모리 영역을 나타냅니다. 기본적으로 메모리 할당자는 커널 공간의 ZONE_NORMAL에서 시작하여 점차적으로 메모리 요청자에게 메모리 영역을 할당합니다. 사용자가 특별히 ZONE_DMA 또는 ZONE_HOGNMEM에서 메모리를 가져와야 하는 경우 메모리 요청자는 메모리에서 다음 두 영역을 사용해야 합니다. 요청 함수. 수정자 설명: |
수정자 설명
__GFP_DMA
ZONE_HIGHMEM 영역에서 메모리 할당 | ||||||||||
고사양 메모리(3G+high_memory~4G) ZONE_HIGHMEM비선형 매핑 영역 | 임시 매핑 영역||
저사양 메모리(3G~3G+high_memory-1)선형 매핑 영역(고정 매핑 영역) | ZONE_NORMAL||
페이지 디렉토리 --> 중간 페이지 디렉토리 --> 페이지 테이블 |
Linux 비디오 튜토리얼"
위 내용은 Linux 드라이버는 어떤 공간에서 실행되나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

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

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

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

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

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

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

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

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

뜨거운 주제











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

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

Linux의 5 가지 기본 구성 요소는 다음과 같습니다. 1. 커널, 하드웨어 리소스 관리; 2. 기능과 서비스를 제공하는 시스템 라이브러리; 3. 쉘, 사용자가 시스템과 상호 작용할 수있는 인터페이스; 4. 파일 시스템, 데이터 저장 및 구성; 5. 시스템 리소스를 사용하여 기능을 구현합니다.

MySQL 설치 오류에 대한 솔루션은 다음과 같습니다. 1. MySQL 종속성 라이브러리 요구 사항이 충족되도록 시스템 환경을주의 깊게 확인하십시오. 다른 운영 체제 및 버전 요구 사항이 다릅니다. 2. 오류 메시지를주의 깊게 읽고 프롬프트 (예 : 라이브러리 파일 누락 또는 부족한 권한)에 따라 종속성 설치 또는 Sudo 명령 사용과 같은 해당 조치를 취합니다. 3. 필요한 경우 소스 코드를 설치하고 컴파일 로그를주의 깊게 확인하십시오. 그러나 일정량의 Linux 지식과 경험이 필요합니다. 궁극적으로 문제를 해결하는 핵심은 시스템 환경 및 오류 정보를 신중하게 확인하고 공식 문서를 참조하는 것입니다.

MySQL 시작이 실패하는 데는 여러 가지 이유가 있으며 오류 로그를 확인하여 진단 할 수 있습니다. 일반적인 원인에는 포트 충돌 (포트 점유 체크 및 구성 수정), 권한 문제 (서비스 실행 사용자 권한 실행), 구성 파일 오류 (파라미터 설정 확인), 데이터 디렉토리 손상 (데이터 복원 또는 테이블 공간 재건), IBDATA 테이블 공간 문제 (IBDATA1 파일 확인), 플러그로드 (확인 오류 로그)가 포함됩니다. 문제를 해결할 때 오류 로그를 기반으로 문제를 분석하고 문제의 근본 원인을 찾고 문제를 방지하고 해결하기 위해 정기적으로 데이터를 백업하는 습관을 개발해야합니다.

MySQL은 Android에서 직접 실행할 수는 없지만 다음 방법을 사용하여 간접적으로 구현할 수 있습니다. Android 시스템에 구축 된 Lightweight Database SQLite를 사용하여 별도의 서버가 필요하지 않으며 모바일 장치 애플리케이션에 매우 적합한 작은 리소스 사용량이 있습니다. MySQL 서버에 원격으로 연결하고 데이터 읽기 및 쓰기를 위해 네트워크를 통해 원격 서버의 MySQL 데이터베이스에 연결하지만 강력한 네트워크 종속성, 보안 문제 및 서버 비용과 같은 단점이 있습니다.

MySQL 설치 실패의 주된 이유는 다음과 같습니다. 1. 권한 문제, 관리자로 실행하거나 Sudo 명령을 사용해야합니다. 2. 종속성이 누락되었으며 관련 개발 패키지를 설치해야합니다. 3. 포트 충돌, 포트 3306을 차지하는 프로그램을 닫거나 구성 파일을 수정해야합니다. 4. 설치 패키지가 손상되어 무결성을 다운로드하여 확인해야합니다. 5. 환경 변수가 잘못 구성되었으며 운영 체제에 따라 환경 변수를 올바르게 구성해야합니다. 이러한 문제를 해결하고 각 단계를 신중하게 확인하여 MySQL을 성공적으로 설치하십시오.

터미널에서 MySQL에 액세스 할 수 없음 : MySQL 서비스가 실행되지 않음; 연결 명령 오류; 불충분 한 권한; 방화벽 블록 연결; MySQL 구성 파일 오류.
