Linux 커널 내부에 대한 질문 [닫기]

Linux 커널 내부에 대한 질문 [닫기]

"Linux 장치 드라이버, 제3판"을 읽고 있는데 잘 이해되지 않는 몇 가지 커널 항목을 발견했습니다.

  1. Linux 커널은 가상 주소 또는 물리적 주소를 사용하여 내부적으로 작동합니까? 특히 나를 혼란스럽게 하는 것은 여러 유형의 주소(논리적, 가상, 버스 및 물리적)가 있고 모두 커널에서 유효하고 작동 가능하다는 것입니다.

  2. CPU 명령은 주변 장치에 저장된 데이터의 주소를 직접 지정할 수 없으므로 주소 지정이 가능한 메모리(예: 버퍼)가 이러한 목적으로 사용됩니다. 이것이 맞습니까?

  3. 세마포어가 요청되면(해당 값은 0) 프로세스가 절전 모드로 전환될 때까지 기다려야 합니까?

  4. 원자적 연산 - 특정 CPU 명령어로 보장됩니까?

답변1

한 번에 여러 가지 질문을 하지 않는 것이 가장 좋습니다. 모든 사람이 모든 질문에 답할 수 있거나 기꺼이 대답할 수는 없기 때문입니다. 그럼에도 불구하고, 각 질문에 대해 간략한 답변을 드리겠습니다.

Linux 커널은 가상 주소 또는 물리적 주소를 사용하여 내부적으로 작동합니까? 특히 나를 혼란스럽게 하는 것은 여러 유형의 주소(논리적, 가상, 버스 및 물리적)가 있고 모두 커널에서 유효하고 작동 가능하다는 것입니다.

예. 커널의 다른 부분은 다른 주소 공간을 사용합니다.

커널 코드가 시스템 호출을 처리할 때 해당 메모리 맵에는 전체 커널 메모리 공간과 프로세스의 전체 메모리 공간이 포함됩니다(커널이 높은 메모리로 구성되어 있지 않은 한 여기에서 설명하기에는 너무 복잡합니다). 이는 논리(가상이라고도 함) 주소입니다. 주소의 상위 비트는 어느 페이지를 볼 것인지 나타냅니다.메모리 관리 유닛, 낮은 비트는 페이지 내의 선형 주소입니다. 작업 전환이 발생할 때마다 MMU 내부의 메모리 맵이 변경됩니다(MMU의 페이지 테이블 변경은 작업 전환의 중요한 부분입니다).

일부 장치 드라이버는 자신이 구동하는 장치에 유효한 메모리 주소를 조작해야 합니다. 이는 일반적으로 물리적 주소이지만 일부 아키텍처에는아이오무이 방법으로 장치는 자체 논리 주소도 볼 수 있습니다. 물론 커널의 메모리 관리 하위 시스템은 다양한 유형의 주소에서 작동해야 합니다.

CPU 명령은 주변 장치에 저장된 데이터의 주소를 직접 지정할 수 없으므로 주소 지정이 가능한 메모리(예: 버퍼)가 이러한 목적으로 사용됩니다. 이것이 맞습니까?

이는 아키텍처에 따라 다릅니다. 대부분의 아키텍처에는 일종의DMA(직접 메모리 액세스), RAM을 통해 장치와의 적어도 일부 통신을 수행할 수 있습니다. 또한 일부 아키텍처(예: ARM)에서는 모든 장치 액세스가 적절한 주소의 로드 및 저장 명령어를 통해 수행되는 반면, 다른 아키텍처(예: i386)에는 이러한 목적을 위한 특정 프로세서 명령어가 있습니다. 바라보다메모리 매핑된 I/O자세한 내용은.

세마포어가 요청되면(해당 값은 0) 프로세스가 절전 모드로 전환될 때까지 기다려야 합니까?

예, 세마포어( down및 친구)를 얻는 것은 차단 작업입니다. 이 내용은 책에 잘 설명되어 있습니다.

원자적 연산 - 특정 CPU 명령어로 보장됩니까?

예. 세부 사항은 아키텍처에 따라 다릅니다. 멀티태스킹을 위한 모든 플랫폼은 동기화를 위해 최소한 하나의 원자 기본 요소를 제공합니다.비교하고 교환하다,테스트 및 설정,링크 로드 + 조건부 저장등. 올바른 기본 요소를 사용하는 것 외에도 코드에서는 올바른 기본 형식을 사용하는 데 주의를 기울여야 할 수도 있습니다.기억 장애다중 프로세서 시스템에서. Linux 커널은 지원하는 모든 아키텍처에 대해 동기화 기본 요소 구현을 제공하므로 커널의 이식 가능한 기본 요소만 사용하면 됩니다.

답변2

1, 3, 4번에 답해 볼게요.

Linux 커널은 다양한 단계를 사용하여 프로그램 코드를 전기 신호로 변환합니다.

논리 주소: 연산이나 명령어를 다루기 위해 기계어 명령어에 포함됩니다. 세그먼트와 오프셋으로 구분됩니다.

선형 주소: 분할 단위는 논리 주소를 선형 주소로 변환합니다. 이는 0x00000000-0xffffffff메모리 공간을 지정하는 데 사용되는 16진수(32비트 아키텍처: )입니다 .

실제 주소: 또한 페이징 단위는 선형 주소를 물리적 주소로 변환합니다. 이는 마이크로프로세서 핀을 통해 메모리 셀의 주소를 지정하는 전기 신호입니다.

버스 주소: CPU를 제외한 모든 하드웨어 장치에서 메모리 셀 주소를 지정하는 데 사용됩니다(DMA에는 CPU가 필요하지 않지만 여전히 주소가 필요합니다). 이러한 주소는 별도의 I/O 메모리 관리 장치를 포함하는 SPARC 및 Alpha와 같은 일부 다른 아키텍처를 제외하고는 대부분 물리적 주소와 동일합니다.

커널은 모든 주소를 사용하여 작동하며, 각 주소는 사용자 요청과 하드웨어 수준에서 해당 요청의 실제 처리 사이의 단계입니다.


프로세스가 0 이하의 값으로 세마포에 접근하면 값이 1 이상이 될 때까지 일시 중지됩니다. 이는 잠자기 상태인 프로세스에서만 발생합니다. 인터럽트 핸들러는 잠들 수 없으므로 세마포어 사용이 금지됩니다.


원자적 연산은 다음과 같이 정의된 어셈블리 언어 명령어를 사용하여 구현할 수 있습니다.

  • 0개 또는 1개의 메모리 액세스
  • 접두사는LOCK_PREFIX

C 수준에서 커널은 atomic_t접두사가 붙은 유형과 매크로를 제공합니다.atomic_
( LOCK_PREFIX조립설명서에 추가되었습니다.)

관련 정보