이것은 운영 체제와 커널의 기본 신비에 대한 이론/법을 둘러싼 이론적이고 개념적 인 아이디어를 키우는 데 도움이 된 것처럼 보이는 훌륭한 학습 곡선이었습니다. 나는 OSS가 어떻게 일했는지에 대한 괜찮은 아이디어를 가지고 있다고 가정했다. 그러나 내 자신의 OS를 만드는 것은 단지 읽는 것과 비교할 때 절대적으로 더 명확했습니다. 내 자신의 정직한 의견으로. 이것은 커널 모드와 사용자 모드에서 엉망으로 만들고 싶은 소프트웨어를 더 잘 이해하는 방법이었습니다.
커널과 운영 체제가 32 비트이지만 시작하기 전에. 나는 개념을 64 비트로 설명 할 것이며, 그 중 하나는 긴 모드 일 것입니다.
모드
인터럽트
설명자
페이징
Intel® 64 및 IA-32 Architectures 소프트웨어 개발자의 매뉴얼 볼륨 3A에서 보호 모드에 대해 자세히 알아보십시오 : 시스템 프로그래밍 안내서, 1 부; 3 장 *
인터럽트 가란 무엇입니까?
인터럽트가 키보드, 솔리드 스테이트 드라이브, 하드 드라이버 또는 마우스 및 소프트웨어와 같은 장치에서 전송되는 신호 또는 데이터라고 생각할 수 있습니다.
예를 들어 마우스를 이동/클릭하면 마우스 컨트롤러가 CPU의 인터럽트 컨트롤러로 인터럽트를 보냅니다. CPU주의는 즉시 마우스 인터럽트로 이동하여 루틴 (마우스 이동 또는 클릭)을 실행합니다. 마우스가 인터럽트 후 CPU는 인터럽트 전 또는 신호가있는 경우 다른 인터럽트를 관리하기 전까지는 계속됩니다.
+------------------------+ +------------+
| TYPES OF INTERRUPTS |------------| Exceptions |
+------------------------+ +------------+
/
/
/
+------------+ +------------+
| HARDWARE | | SOFTWARE |
| INTERRUPTS | | INTERRUPTS |
+------------+ +------------+
IRQ 라인 또는 PIN 기반 IRQ : 일반적으로 칩셋에서 정적으로 라우팅됩니다. 와이어 또는 라인은 칩셋의 장치에서 IRQ 컨트롤러로 실행되어 장치가 보낸 인터럽트 요청을 직렬화하여 경주를 방지하기 위해 CPU로 하나씩 전송합니다. 대부분의 경우, IRQ 컨트롤러는 장치의 우선 순위에 따라 여러 IRQ를 한 번에 CPU로 보냅니다. 잘 알려진 IRQ 컨트롤러의 예는 모든 IBM-PC 호환 칩셋에 존재하는 Intel 8259 컨트롤러 체인으로, 2 개의 컨트롤러를 함께 체인하는데, 각각 Legacy IBM-PC에서 총 16 개의 사용 가능한 IRQ 신호 전달 핀에 8 개의 입력 핀을 제공합니다.
메시지 기반 인터럽트 : 인터럽트 장치, 인터럽트 자체 및 벡터링 정보에 대한 정보를 위해 예약 된 메모리 위치에 값을 작성하여 신호를 보냅니다. 장치에는 펌웨어 또는 커널 소프트웨어에 의해 쓴 위치가 할당됩니다. 그런 다음 장치에 의해 장치에서 IRQ를 장치의 버스와 관련된 중재 프로토콜을 사용하여 생성합니다. 메시지 기반 인터럽트 기능을 제공하는 버스의 예는 PCI 버스입니다. wiki.osdev -https://wiki.osdev.org/interrupts
항목 - 항목은 지역의 한도 및 항목과 관련된 액세스 권한과 함께 시작 위치를 메모리의 영역을 정의합니다. OS가 시스템 (링 0) 또는 응용 프로그램 (링 3)에서 실행중인 경우 프로세서에 대한 액세스 권한. 응용 프로그램이나 usermode가 특정 레지스터/피연산자 및 니모닉에 액세스하는 것을 방지합니다. CR 레지스터 및 CLI/STI와 같은 각각.
한계 - 세그먼트 디스크립터의 크기
세그먼트 선택기 - 설명 자의 색인을 보유하는 레지스터가 있습니다.
더 명확하게하려면 인덱스는 선택기가 아닙니다.
세그먼트 레지스터가 보유한 것 :
액세스 디스크립터 테이블에는 권한이 있으며, 이는 모든 레지스터에 대해 RPL (요청 권한 레벨)이라고하지만 cs 는 CPL (현재 권한 레벨)이라고합니다. 둘 다 다른 목적을 제공하며 인텔 또는 AMD 매뉴얼에서 찾을 수 있습니다.
조사에 사용할 테이블. 한 테이블은 GDT입니다. 다른 테이블은 LDT입니다.
선택기의 사용을 개념적으로 상상하는 비공식 규칙 : 따라서 비공식적 인 규칙은 다음과 같습니다.
selector = index + table_to_use + privilege table_to_use + index = descriptor = 사용할 메모리 세그먼트에 대한 모든 정보
플러스 부호가 산술 작업이 아닌 경우
세그먼트 선택기 레지스터의 비트 필드 :
15 3 2 0
+--------------------------------------------------+----+--------+
| Index | TI | RPL |
+--------------------------------------------------+----+--------+
TI = Table Indicator: 0 = GDT, 1 = LDT
The TI specify if the Descriptor were dealing with is a GDT or LDT
IF(TI == 0) THEN
... THE DESCRIPTOR IS A GDT
ELSEIF(TI == 1) THEN
... THE DESCRIPTOR IS A LDT
GDT는 1 : 1입니다. 논리 주소는 선택기와 협력하는 GDT의 예입니다.
<---- Selector ----> +----- Segment Selector Register
+-------+----+-----+ v
| Index | TI | RPL | = DS
+-------+----+-----+ GDT LDT
| | +---------------------+ +---------------------+
| +------------>| Null Descriptor | | Null Descriptor |
| +---------------------+ +---------------------+
| | Descriptor 1 | | Descriptor 1 |
| +---------------------+ +---------------------+
| | | | |
| ... ... ... ... ... ... ... ...
| | |
| +---------------------+
+------------------->| Descriptor K |
+---------------------+
| |
... ... ... ...
RPL (Request Privilege Level) describes the privilege for accessing the descriptor
우리는 GDTR에 모든 GDT베이스 (주소)와 한계 (GDT 크기)를 저장합니다. GDTR은베이스에서 시작하여 메모리의 모든 GDT 항목을 가리 킵니다. 그런 다음 lgdt 니모닉이 적재됩니다.
typedef union _gdt_descriptor
{
struct
{
uint64_t limit_low : 16 ;
uint64_t base_low : 16 ;
uint64_t base_middle : 8 ;
uint64_t access : 8 ;
uint64_t granularity : 8 ;
uint64_t base_high : 8 ;
};
} __attribute__((packed)) gdt_entry_t ;
gdt_entry_t gdt_entrys[ 256 ];
/* The GDTR (GDT Register) */
struct gdtr
{
uint16_t limit;
uint32_t base;
} __attribute__((packed)) gdtr;
...
gdtr.base = &gdt_entrys;
gdtr.limit = ( sizeof (gdt_descr) * 256 ) - 1 )
AMD64 아키텍처 프로그래머 매뉴얼, 2 권, 4.7 절 (pg. 84-90 {+})에서 자세히 알아보십시오.
이것에 대한 참조와 그에 따라. https://notes.shichao.io/utlk/ch2/#paging-in-hardware 이것은 내가 가진 가장 재미 있었던 것입니다. 나는 그것을 이해하면 매우 흥분했습니다.
4KB 페이지가있는 X86 OS 레거시 페이징 가상 주소 :
X86 OS CR4.PAE 4KB 페이지가있는 가상 주소 :
x86_64 (IA-32E) OS CR4.LME/CR4.PAE 4KB 페이지가있는 가상 주소 :
• 컨트롤 레지스터 CR0 (각각 비트 16 및 비트 31)의 WP 및 PG 플래그.
• 제어 레지스터 CR4 (비트 4, 비트 5, 비트 7, 비트 17, 비트 20, 비트 22 및 비트 22의 PSE, PAE, PGE, SMEP, SMAP 및 PKE 플래그).
• IA32_EFER MSR (각각 비트 8 및 비트 11)의 LME 및 NXE 플래그. • EFLAGS 레지스터의 AC 플래그 (비트 18). Intel® 64 및 IA-32 Architectures 소프트웨어 개발자의 매뉴얼 볼륨 3A : 시스템 프로그래밍 안내서, 1 부; 4 장
• IA32_EFER MSR (각각 비트 8 및 비트 11)의 LME 및 NXE 플래그. • EFLAGS 레지스터의 AC 플래그 (비트 18). Intel® 64 및 IA-32 Architectures 소프트웨어 개발자의 매뉴얼 볼륨 3A : 시스템 프로그래밍 안내서, 1 부; 4 장
CR4.PAE 및/또는 CR4.LME가 1으로 설정되면 PSE가 완전히 무시됩니다.
터미널이 추가되지 않았습니다
cd smkrnl; make run
이 프로젝트에 대한 지속적인 노력에 대한 영감/지원의 불꽃과 커널/OS 개발 내의 특정 개념을 이해하도록 도와주었습니다. =))