부팅은 어렵다
부팅 ... 글쎄 ... 정말 어려운 부분입니다. 컴퓨터가 부팅 될 때마다 기본적으로 새로워집니다. 다양한 부분을 알고 있으며 각 부분마다 기능을 얻습니다. 그러나 매번 정사각형에서 자체 부트 스트랩으로 끌어 올려야합니다.
부팅 프로세스를 설계 할 때 트릭은 시스템을 단계별로 가동시키는 것입니다. 부팅 빨리해야 하고 신뢰할 수있는, 그것은 완전히 알 수없는 환경에서 모두 일을해야 할 때마다 . 심지어 Real / Protected 모드 대화 도 할 수는 없지만 (그렇게 말할 수는 없습니다) 부팅 할 때 많은 일이 일어나고 있습니다. 컴퓨터는 단계별로 단계마다 수행 할 때마다 다양한 구성 요소를 동화합니다. 아마도 이것들 중 가장 중요한 것은 온보드 코드 실행에서 온 디스크 코드 실행, 즉 다시 말해 커널 실행으로 이동하는 것입니다. 펌웨어는 때이다 (표면 상) 운영 체제에 항복.
몇 년 전에는 그렇지 않았습니다. 예전에는 BIOS가 Basic In / Out이었습니다. 일반 프로그램은 화면을 그리거나 디스크에 액세스하는 등 펌웨어를 호출합니다. 이것들은 인터럽트 라고 불렀습니다. 낡은 모자는 새로운 도트 매트릭스 또는 USR에 IRQ를 할당 할 때 종종 발견 한 스릴을 위해 가장 잘 기억할 것입니다.
INT13H
BIOS가 디스크 액세스를위한 서비스로 제공하는 것은 인터럽트 ( 또는 INT
어셈블리 링고 ) 13H 시리즈 기능입니다. 이것들은 여전히 부팅 프로세스에서 BIOS 시스템에서 펌웨어에서 디스크로 점프하기 위해 여전히 사용됩니다.
BIOS 시스템은 찾은 각 디스크의 처음 몇 바이트를 확인하고 마스터 부트 레코드 ( 또는MBR
) 로 인식되는 패턴을 찾습니다 . 이것은 수십 년 전의 사실상의 표준이며 디스크 헤드에 기록되는 약간의 원시 실행 바이너리를 포함합니다. MBR은 BIOS 디스크를 부팅 가능으로 표시합니다. 그것은 하나를 발견하면 확인을 중지하므로 실제로 하나는 영리한 속임수없이 얻는 것입니다. 하나를 찾으면 메모리에 매핑하고 실행합니다 (실제 모드에서는 여전히 거기에 가지 않습니다) .
실행 된 MBR은 거의 확실히 시스템 커널이 아닙니다. 512 바이트 (주거나 가져 오기) 는 해당 부서에서 매우 쓸모가 없습니다. 이것은 아마도 부트 로더 ( BIOS의 많은 주소 제한 중 하나 를 극복하도록 특별히 설계된 프로그램) 일 것입니다. 특히 어떤 종류의 파일 시스템도 전혀 이해하지 못합니다.
부트 로더가 실제 커널을 읽고 메모리에서 실행할 때 마다 (모두기도 할 때마다)INT13H
인터럽트 호출을 통해 BIOS에 물어볼 것입니다 . 그렇지 않은 경우 (많은 더 멋진 부트 로더가 기존의 의미로 파일 시스템을 마운트하고 다른 방법으로 코드를 실행하는 경우) 부트 로더가 INT13H
한두 개도없이 그렇게 화려할 가능성은 거의 없습니다 . 512 바이트가 처음 할당 된 부트 로더는 필요에 맞지 않기 때문에 부트 로더는 종종 스스로 또는 다양한 단계 를 체인로드해야 합니다.
치킨과 계란
이 모든 것이 디스크를 논의하는 원형 방법이지만,이 시점에서 주요 문제는 닭과 계란 형식이라고 할 수 있습니다. 프로그램 지침이 포함 된 디스크에 액세스하고 있음을 분명히 알 수 있습니다. 에 대해 어떻게 접근 디스크에 . 이 문제의 핵심은 펌웨어 이며, EFI 시스템에서도 매우 다른 방식으로 계속 유지되며, 가장 취약한 지 여부에 관계없이 펌웨어는 부팅 체인에서 가장 중요한 링크입니다.
커널이 실행되고 하드웨어 시작 및 액세스를 제어하는 수많은 루틴이 시작되면 현대 OS가 시스템을 완전히 제어하기 때문에 이러한 모든 문제가 사라지 거나 (적어도 약간 변경됨) , 그러나 그들이 할 때까지 시스템의 한계는 펌웨어가 허용하는 한까지만 연장됩니다. INT13H
8086 이후 BIOS가 많이 바뀌지 않았습니다. 전화는 8086 원본입니다. 그렇습니다. (수많은) 확장과 해킹이 있었지만 혁신은 ...?
더욱더 좋게
BIOS에 대한 대부분의 변경은 단지 붕대 일뿐입니다. 예전에는 하드 디스크 였지만 물리적으로 매핑 해야했습니다. 데이터를 저장하거나 검색 할 때 해당 지오메트리 의 다양하고 구체적인 측면을 참조했습니다. 결국 기존의 하드 디스크는이를 금지하는 크기로 커졌습니다. 추상적 맵조차도 BIOS가 다루기에는 너무 많은 정보였습니다. Real Mode에서만 작동 할 수 있으므로 BIOS는 메모리 레지스터 당 1MB로 제한됩니다. 실린더 맵을 그보다 크게 늘리거나 너무 많은 비트로 처리 할 수있는 것보다 더 큰 속성을 만들면 BIOS가 문자 그대로 손실됩니다.
이 장벽은 여러 번 충족되어 깨 졌습니다. 맵이 더 새롭고 영리하며 덜 정확한 방식으로 추상화되고 인코딩 될 때마다 그리고 요즘 BIOS가 드라이브를 정확하게 매핑하는 것은 사실상 불가능합니다. 일부 실린더 / 헤드 / 섹터 (또는 CHS) 변환이 여전히 필요 하지만 논리 블록 주소 지정 은 사실상의 표준 입니다. 메인 보드 펌웨어가 정확성 / 책임 성에서 잃어버린 것, 이러한 확장 기능은 추상화되어 디스크 펌웨어 책임에 추가되어 간격을 메 웁니다.
귀하의 질문에 언급 된 것은이 고양이 마우스 게임입니다. BIOS가 크기로 인해 특정 지점을 넘어서 디스크를 이해하지 못하면 부트 로더 나 커널과 같이 부팅 할 때 검색 할 데이터가 해당 지점을 벗어나는 것이 더 낫습니다. 이것은 어디에서 /boot
왔는가.
실제로 더 나은
고맙게도 오늘날 BIOS의 종말과는 무관합니다. 30 년이되었지만 지난 몇 년 동안 UEFI (또는 EFI 2.0) 표준 으로 대체되었습니다 . UEFI는 1 분 마다 마운트 를 제공하고 , 보호 모드로 초기화하며, 자체 부트 로더를 통합하고, 재부팅 지속 플래시 메모리 가변 스토리지를 제공하며, 일부 제타 바이트 또는 디스크 당 모든 것을 처리하도록 지정되어 있습니다. 그밖에. 그것은 완벽하지는 않지만 이전 모델보다 크게 개선되었습니다.
디스크 암호화 또는 계층화 된 파일 시스템과 관련된 특수 부트 로더에 대한 인수조차도 OS 커널이 이러한 커널을 모두 처리해야한다고 생각할 때 문제가되지 않으며 부팅시 마운트 를 제공하면 항상 그것을 실행에 샷 (특히 리눅스 커널, 기본 구성에서, EFI 실행 모두 자신의 것으로 고려) .
따라서 별도의 /boot
파티션은 지나치게 걱정하지 않아도되며 EFI 시스템을 사용하는 경우 EFI 모드 부팅에 필요한 EFI 시스템 파티션에 이미 아날로그가있을 수 있습니다.