마이크로 코드 란 정확히 무엇이며 펌웨어와 어떻게 다른가요?


46

용어로는 정확히 무엇입니까? "마이크로 코드" 업데이트가 가능한 경우 펌웨어와 어떻게 다릅니 까?

이 질문은 이 질문의 사본 (제가 말할 수있는 한) 마이크로 코드 수정에 대해 질문했습니다. 여기서 나는이 용어들을 올바르게 사용하는 방법을 엄격히 알고 싶다.

최신 정보

답변을 선택했는데 특히 만족스럽지 않습니다. 나는 많은 해답을 썼고, 나는 그러한 반응들도 똑같이 만족스럽지 않다는 것을 알았다. 그래서 내 두 프레임을 당신에게 보여 드리겠습니다.

  1. "프로세서 마이크로 코드는 프로세서 펌웨어와 유사합니다." 내가 이것을 점점 더 읽음에 따라 그것이 내가 취하는 방식입니다. 이 맥락에서 "마이크로 코드"는 단지 "프로세서 펌웨어"를 통한 마케팅 일뿐입니다. 나와 맺어 라. ..
  2. 또는 나는 틀렸고, 나는 그것이 일어난다는 것을 안다! 이 경우, 왜 내가 틀렸는 지에 대한 훨씬 더 철저한 생각이 필요합니다. 내가 잘못 읽었다는 것을 지적하는 대답에서, 나는 그들을 이해하는 데 어려움을 겪고 있습니다.
    • "실행 대 데이터"많은 답변이이 패러다임을 사용하지만 CPU에 대해서는 나에게별로 의미가 없습니다. 일부 펌웨어를 실행하지만, 무엇에 의해 실행됩니까? CPU와 관련하여 프로그램 지침이나 데이터가 있습니까?
    • 펌웨어가 소프트웨어와 하드웨어를 연결하면 (읽기 : 신들의 전기 공학적 내용) 마이크로 코드가 그 구별을 만족시키지 못하는 이유는 무엇입니까?
    • 시간이 지남에 따라 "해석하기"가 더 어려워집니다. 마이크로 코드로 "하드웨어 명령어가 해석된다"는 것은 무엇을 의미합니까? 이것이 사실이라면 해석되지 않고 다른 하드웨어 지침으로 사전 컴파일되어 단순히 "실행"된 경우 어떤 것이 성능면에서 좋을까요? 또한, 일반 미디는 동일한 조명에서 어떻게 해석되지 않습니까? "MIDI 마이크로 코드"로 해석되고 하드웨어에서 실행되는 언어입니다. 또는 시각적 인 표시를 위해 텔레 프린터 지침을 해석하는 바보 터미널이 있습니까?
    • "마이크로 코드"가 사운드 카드에서 실행되는 코드에 적용됩니까? 비디오 카드 (GPU) ?

나는 전문가는 아니지만, 마이크로 코드는 프로세서 펌웨어라고 말할 것입니다. 나는 마이크로 코드가 실행되는 방법에 관한 모든 데이터가 Intel / AMD에 의해 독점적 일 것이라고 상상했지만 어떻게 작동 할 것인가를 짐작할 수 있습니다. 간단한 CPU 세트, 메모리 및 수학 연산자에서 가져 오는 것과 같은 기본적인 것들을 가지고 있습니다. 그런 다음 복잡한 명령어 세트 (예 : x86 / intel)가 있습니다. CPU는 메모리에서 명령어를 가져오고 마이크로 코드를 사용하여 복잡한 명령어를보다 간단한 명령어로 변환합니다. 한 가지 예가 곱셈입니다. 대부분의 CPU에는 곱셈 명령어가 있지만 실제로 곱셈은 여러 비트 쉬프트로 구성됩니다.
Programmdude

마이크로 코드라는 용어는 많은 CPU "코드"명령어를 사용 / 기반으로한다는 사실을 의미합니다. 기본적으로 CPU에 명령 및 기능을 에뮬레이트하는 방법을 알려줍니다. 그러므로 그것은 이름입니다. 컴퓨터 소유자의 관점에서 보면 하드웨어 공급 업체가 제공하는 또 다른 코드 세트이기 때문에 펌웨어로 요약 될 수 있습니다.
eckes

IMO, 가장 간단한 대답은 "프로세서가 명령어를 실행할 때마다 실제로 마이크로 코드 프로그램을 실행하고 있습니다." 단일 프로세서 명령어로 보이는 것은 마이크로 코드 명령어의 특정 시퀀스 인 '마이크로 코드 프로그램'입니다. 각 명령어에는 자체 마이크로 코드 프로그램이 있습니다. 개별 마이크로 코드 명령어는 프로세서의 다양한 내부 비트를 활성화 / 비활성화합니다.
Ethan Reesor

답변:


53

펌웨어라는 단어의 근원은 하드웨어와 소프트웨어의 중간 지점입니다.  하드웨어에 내장 된 소프트웨어. 하드웨어 장치의 비 휘발성 메모리에 저장되는 소프트웨어를 나타냅니다. 장치 자체에서 실행되는 코드를 저장하는 데 사용되는 경우 하드웨어 장치에 내장 된 EEPROM 및 플래시 메모리가 그 예입니다.

"펌웨어"가 드라이버 소프트웨어에 저장되고 부팅 / 초기화 될 때 장치에 영구적으로 남겨 두는 대신 장치에로드되기 때문에 일부 유형의 하드웨어에서는 점점 더 일반화되고 있습니다. 예를 들어, 호스트 OS에로드 된 소프트웨어 드라이버에 몇 백 킬로바이트의 펌웨어 코드를 저장하고 드라이버에 의해 초기화 될 때이를 장치로 전송하는 것은 큰 일이 아닙니다.

수락하는 펌웨어의 정의에 따라 다르긴하지만, 하드웨어에 상주하지 않기 때문에 펌웨어를 기술적으로 고려하지 못할 수도 있습니다 (하드웨어를 분리하여 다른 시스템에 설치하면 해당 "펌웨어"버전은 유지되지 않습니다).

마이크로 코드는이 후자의 "펌웨어"유형의 하위 집합입니다. 마이크로 코드는 부팅 할 때 장치에로드되는 모든 "펌웨어"에 대한 일반적인 용어가 아닙니다. 대신, 마이크로 코드는 기본적으로 상위 레벨 표준 CPU 명령어와 해당 CPU에 특정한 하위 레벨 연산 사이의 변환 계층을 형성하는 CPU에만 해당됩니다. 부팅시 CPU에 BIOS에 의해로드되지만 나중에 부팅 단계에서 OS로 대체 될 수 있습니다.

마이크로 코드를 업데이트하면 CPU 하드웨어를 교체하지 않고도 발견 된 특정 버그를 해결하기 위해 CPU의 저급 동작을 수정할 수 있습니다. 마이크로 코드는 보통 최고 속도와 에너지 효율성을 위해 가능한 한 높은 수준에서 낮은 수준의 명령으로 가장 효율적인 매핑을 포함하므로 일부 버그를 수정하기 위해 마이크로 코드를 변경해야 할 때 성능이 저하 될 수 있습니다.

Meltdown (Intel 칩에만 영향을주는 취약점)은 마이크로 코드 업데이트만으로는 수정할 수 없으며 핵심 OS 기능을 변경해야하므로 성능이 추가로 저하 될 수 있습니다. 스펙터 (Intel, AMD 및 ARM 칩에 영향을주는 취약성)는 마이크로 코드 업데이트만으로도 해결 될 수 있습니다.


수정 후 특정 질문에 답하려면 다음을 수행하십시오.

  1. 예, 마이크로 코드는 기본적으로 프로세서에서 실행되는 펌웨어입니다. 특수 용어 "마이크로 코드"는 특히 표준 기계 언어에서 저수준 프로세서 명령어로 변환하기위한 청사진을 포함하는 프로세서의 펌웨어를 나타냅니다. 따라서 펌웨어보다 더 구체적인 용어입니다.

    위에서 논의한 것처럼 CPU가 켜져있는 동안에는 CPU에 저장되지 않지만 부팅 할 때마다 기존 펌웨어처럼 작동하지 않는다는 점에 유의하십시오. 그러나 많은 하드웨어가이 작업을 수행하며 여전히 "펌웨어"라고하며 펌웨어라고 부릅니다.

  2. 나는 네가 틀렸다고 생각하지 않는다. 펌웨어는 특정 기계 언어로 쓰여질 필요는 없으며 실행은 특정 방식으로 트리거 될 필요가 없습니다. 어떤 낮은 수준에서 모든 기계 코드는 프로세서에 의해 "읽혀지고"특정한 방식으로 해석되는 "데이터"입니다.

    일반적으로 "마이크로 코드"라는 용어는 메인 CPU에만 사용되고 그래픽 카드 나 다른 하드웨어에는 사용되지 않습니다. 다른 장치에도 동일한 방식으로 코드가로드 될 수 있습니다.


1
두 번째 문장이 잘못되었습니다. 펌웨어에는 ROM에 저장된 소프트웨어가 포함됩니다. 옛날 옛날에는 대부분의 펌웨어가 ROM에 들어 있었기 때문에 대안이 적당 해졌습니다.
Harry Johnston

1
분명히 "마이크로 코드"는 CPU에만 해당됩니다. 문제는 구체적이지 않은가하는 것이 다른 것과 다른가요? 범위 ( "CPU")를 제거하면 "상위 수준 명령어와 하위 레벨 연산 사이의 변환 계층"을 거의 직접 인용 할 수 있습니다. 꽤 많이있다. 다만 펌웨어의 정의. 그것은 모든 펌웨어가하는 것이 아닙니까? 단어가 많지만, 가장 설명적이고 간결한 설명이 위의 내용이라고 생각합니다. "프로세서 마이크로 코드는 프로세서 펌웨어와 유사합니다."
Evan Carroll

@ 에반 (Evan), 대부분의 장치는 CPU에서 실행중인 코드에서 보낸 지침을 간접적으로받습니다. CPU 만이 사용자가 제공 한 코드를 직접 처리합니다. 또한 대부분의 장치에는 펌웨어를 실행하는 일종의 임베디드 CPU가 들어 있으며 CPU에는 자체 마이크로 코드가있을 수 있습니다. 이 차이점은 하드웨어 설계자와 커널 프로그래머에게만 중요 할 수 있지만 임의적 인 것은 아닙니다.
Harry Johnston

"대부분의 장치에는 펌웨어를 실행하는 일종의 임베디드 CPU가 들어 있습니다. CPU에는 자체 마이크로 코드가있을 수 있습니다." 따라서 사운드 카드에서 MIDI 스트림을 처리하는 코드는 "마이크로 코드"입니까? 또는 바보 터미널에 문자를 표시 / 렌더링하는 코드입니까?
Evan Carroll

아니요. MIDI 스트림을 처리하기 위해 사운드 카드에서 실행되는 코드는 일반적인 펌웨어 일뿐입니다. 그 코드 프로세스들 MIDI 스트림을 처리하기 위해 사운드 카드에서 실행되는 코드는 마이크로 코드입니다. (실제로 사운드 카드처럼 단순한 임베디드 CPU가 마이크로 코드를 필요로하는지는 모르겠지만 요점은 그 점이다.) 중요한 점은 MIDI 스트림 또는 바보 터미널은 코드가 아닙니다. 그것들은 단지 데이터 일뿐입니다.
Harry Johnston

23

https://wiki.debian.org/Microcode

CPU 마이크로 코드

프로세서 마이크로 코드는 프로세서 펌웨어와 유사합니다. 커널은 BIOS 업데이트를 통해 커널을 업데이트 할 필요없이 프로세서의 펌웨어를 업데이트 할 수 있습니다. 마이크로 코드 갱신은 휘발성 메모리에 보관되므로 BIOS / UEFI 또는 커널은 부팅 할 때마다 마이크로 코드를 업데이트합니다.

Intel 및 AMD의 프로세서가 제대로 작동하려면 마이크로 코드에 대한 업데이트가 필요할 수 있습니다. 이 업데이트는 부정확 한 처리, 코드 및 데이터 손상 및 시스템 잠김에서 발생할 수있는 버그 / 정오표를 수정합니다.

BIOS (또는 UEFI)는 부팅 중에 CPU 마이크로 코드를 업데이트하지만 대부분의 경우 마더 보드 공급 업체는 빈번한 BIOS / UEFI 업데이트를 실행하지 않거나 사용자가 그러한 업데이트를 설치하지 않습니다. 이러한 이유로 시스템 프로세서는 방대한 수의 시스템에서 오래된 마이크로 코드로 실행될 수 있습니다.

예 :

https://www.win-raid.com/t3355f47-Intel-AMD-amp-VIA-CPU-Microcode-Repositories.html


9
그렇게 간단하지 않습니다. 마이크로 코드는 "하드웨어와 컴퓨터의 아키텍처 수준간에 해석기를 부과하는 기술"입니다. 이와 같이, 마이크로 코드는 많은 디지털 처리 요소에서보다 높은 수준의 기계 코드 명령 또는 내부 상태 기계 시퀀싱을 구현하는 하드웨어 수준 명령의 계층입니다. 출처: en.wikipedia.org/wiki/Microcode

17
잠깐만 요. "보트"는 단지 특별한 종류의 "차량"일뿐입니다. 이 얼마나 쓸모없는 단어! :-)
Harry Johnston

4
@ HarryJohnston 글쎄, 나는 특정 상황에서 다른 종류의 차량과 "보트"를 구별하는 것이 오히려 유용하다고 생각한다. "마이크로 코드"는 많은 현대 CPU에 존재하는 매우 구체적인 "무언가"유형이다 ... 그러므로 그것에 대한 용어를 갖는 것이 바람직하다).
Radovan Garabík

4
@ RadovanGarabík : 정확히 해리의 요지, 풍자로 만든 것입니다.
Peter Cordes

4
나는 그것을 얻지 않는다. "커널이 BIOS 업데이트를 통해 프로세서의 펌웨어를 업데이트 할 필요없이 프로세서 펌웨어를 업데이트 할 수 있다면"마더 보드 공급 업체가 빈번한 BIOS / UEFI 업데이트를 실행하지 않는다는 사실은 "시스템 프로세서는 방대한 수의 시스템에서 시대에 뒤떨어 진 마이크로 코드로 실행될 가능성이 있습니까? " 커널이 왜 마이크로 코드를 패치하지 않는가? BIOS가 업데이트되지 않는 경우 BIOS에 의존하는 이유는 무엇입니까?
Ajedi32

6

Intel의 "마이크로 코드 업데이트"는 실제로 프로세서의 마이크로 코드 변환 장치 이상으로 업데이트된다는 의미에서 실제로 "펌웨어"업데이트입니다.

인텔 용 "마이크로 코드 업데이트"라고 불리는이 통합 프로세서 패키지 업데이트는 다른 온다이 (die) 마이크로 컨트롤러 (PMU 및 전원 관리 코어)와 다른 온다이 프로세서 서브 시스템 용 여러 매개 변수 표를 업데이트합니다. 그들은 다소 복잡합니다.

이 정보는 마이크로 코드 및 마이크로 코드 업데이트와 관련된 여러 인텔 특허에서 사용할 수 있습니다.


4

"마이크로 코드"라는 용어는 주로 코드가하는 일을 (저수준 명령을 사용하여 저수준 명령을 실행하는) 주로 말합니다. "펌웨어"라는 용어는 주로 어떻게 저장되고 관리되는지 (소프트웨어보다 덜 쉽게 업데이트됩니다 , 하드웨어보다 더 쉽게 업데이트 됨). 그런 의미에서 "응용 프로그램"과 "JAR 파일"의 구분과 비슷합니다. 동일한 프로그램이 두 가지 일 수 있지만 두 가지 다른 관점에서 볼 수 있습니다.

덧붙여 말하자면 마이크로 코드에 대한 생각은 컴퓨터 프로세서가 실리콘에 내장되기 수십 년 전인 1951 년 모리스 윌크스 (Maurice Wilkes)에게 돌아갔다.


3

"마이크로 코드"는 원래 용어였으며 프로세서의 "공용"명령어 세트에 대한 인터프리터를 구현하는 데 사용 된 명령어를 나타냅니다.

그러나 시간이 지남에 따라 구현 방식이 다양하게 변해가는 등 구별이 더 모호 해졌습니다. 먼저 수평 대 수직 마이크로 코드와 "메인"프로세서 명령어 세트에서 "마이크로 코드"(예 : I / O 명령어를 구현)를 작성하는 다양한 기법이있었습니다. 그런 다음 일반 프로그램 "실행"작업을 통해 쉽게로드 된 코드와 ROM에 저장된 코드 또는 다른 보호되고 상대적으로 변경 불가능한 스토리지를 구별 할 필요가있었습니다. 따라서 "펌웨어"라는 용어는 스토리지에서 어떻게 든 더 영구적으로 (그리고 사용자 수정을 위해 접근하기 어렵게) 만들어진 이러한 지침을 나타 내기 위해 고안되었습니다.

그러나 이러한 첫 번째 구별이 만들어지기 때문에 여러 번 변이가 있었고 여러 번 왜곡 된 적이 있으며이 용어는 주어진 프로세서와 OS 환경 내에서 어떤 정밀도로만 정의 할 수 있습니다.


+1, 여기서 핵심은 용어 "마이크로 코드"의 의미가 많다는 것입니다. OP가 실제로 "마이크로 코드 업데이트"에 대해 알고 싶어한다고 생각합니다. 다른 의미는 아닙니다.
Peter Cordes

2

펌웨어는 대개 CPU 자체가 아닌 CPU를 포함하는 장치의 코드를 말합니다. 안드로이드 폰을위한 펌웨어.

마이크로 코드는 복잡한 명령어 세트 (예 : 486, 686, AMD-64 등)와 칩 제조업체가 실리콘을 설계하는 하위 레벨 명령어 사이의 변환 레이어입니다. 따라서 CPU 명령어 세트의 많은 명령어가 실리콘에 구현되어 있지는 않지만 마이크로 코드를 통해 실리콘에 구현 된 여러 명령어로 변환됩니다.


그러나 모든 펌웨어에 해당하는 것은 아닙니다. 실리콘에서 구현할 수 있지만 소프트웨어를 통해 업데이트 할 수없는 ABI 지침
Evan Carroll

1
인텔의 "마이크로 코드 업데이트" 마이크로 코드 된 명령이 디코딩하는 방법을 수정하는 것보다 훨씬 많은 작업을 수행 할 수 있습니다. . 예 : 가능하다면 CPU가 하드웨어 버그가 발견 된 경우이를 가능하게하기 위해 루프 버퍼를 비활성화 할 수 있습니다 (Skylake에서 SKL150 에라타를 수정).
Peter Cordes

2

[주의 :이 답변은 최근 수정 사항을 처리하기 위해 특별히 고안되었으며 이미 게시 된 여러 가지 소리 답변에 추가되지 않습니다.]

따라서, 다시 말하면 : 마이크로 코드 (적어도 제 1 근사까지) 특정 종류의 펌웨어입니다.

이 맥락에서 "마이크로 코드"는 단지 "프로세서 펌웨어"를 통한 마케팅 일뿐입니다.

음, 마케팅이 아닙니다. 마케팅은 그것을 호출했을 것입니다. XBoost Pro (TM) 또는 뭔가. 오히려 엔지니어링 용어입니다. CPU를 설계 할 경우 마이크로 코드와 CPU의 다른 펌웨어 (및 다른 장치의 일반적인 펌웨어 종류) 사이의 구분이 중요합니다. 그렇지 않은 경우 아마 그렇지 않습니다.

마더 보드를 설계하거나 운영 체제를 작성하는 경우 "마이크로 코드 업데이트"를 좀 더 다루기 쉽고 익숙하지 않은 "CPU 펌웨어 업데이트"의 약자로 사용하는 것이 좋습니다. 대부분의 CPU 펌웨어 업데이트는 주로 마이크로 코드에 영향을 미치므로 동일한 문제가 발생하지 않습니다. 당신은 아마 차이를 알지만, 당신은 필요가 없습니다. 케어 그것에 대해.

최종 사용자는 그 차이를 알거나 신경 쓸 필요가 없으며, 이상적인 세상에서는 결코 "마이크로 코드"라는 단어를들을 수 없습니다.

나는 최근의 투기 적 실행 취약점에 대한 언론의 보도에 관심을 갖게되었다고 생각합니다. 이전에 컨텍스트에서 들었을 지 모르니 걱정할 필요가 없다는 것이 더 분명했습니다. 이 취약점은 계획보다 이전에 발표되었으므로 언론의 보도 범위가 다른 경우보다 적습니다. 최종 사용자의 관점에서 BIOS 업데이트, 운영 체제 업데이트 및 경우에 따라 응용 프로그램 업데이트를 설치해야합니다. 이들 중 하나에 새 마이크로 코드가 포함되어있는 경우이를 알거나 신경 쓸 필요가 없습니다.


그래서 당신이 알거나 신경 쓸 필요가 없다는 것을 깨닫더라도, 순수한 호기심에 관심이있을 수 있습니다 : 다른 펌웨어와 마이크로 코드를 어떻게 구별 할 수 있습니까?

글쎄요, 먼저 알아야 할 것은 하나의 단단하고 빠른 정의가 반드시 필요한 것은 아니라는 것입니다. Bleggs and Rubes 상황 . 여전히 마이크로 코드에 대해 말할 수있는 몇 가지 사항이 있습니다.

  • 마이크로 코드는 일반적으로 CPU가 아닌 CPU 내부에서 실행됩니다. 그것이 상위 수준의 견해입니다.

  • 마이크로 코드의 아키텍처는 일반적으로 일반 펌웨어를 포함한 일반 코드의 아키텍처와 상당히 다릅니다. 병렬성이 높으며 하드웨어에 훨씬 가깝게 구현 될 수 있습니다. 몇 가지 기존 답변 (사용자 답안 포함)이 이에 대해 논의하지만, 세부 사항은 CPU 설계에 따라 달라질 수 있습니다.

  • 하드웨어는 종종 제조업체가 제공 한 펌웨어 만 실행하도록 설계되었지만 특히 드문 것은 아니다. 타사 펌웨어를 사용할 수는 있지만 보증이 무효화됩니다! 제 3 자 마이크로 코드는 훨씬 드물다. 비록 고대시기 (CPU가 빵 상자 크기에 관한 이야기였던 때)에 최종 사용자 중 일부가 CPU의 마이크로 코드를 수정할 것이라고 생각한다. 지금까지 내가 알고있는 한, 이것은 PC에서 사용되는 CPU 종류에서 가능하지 않습니다.

  • 마이크로 코드는 통상적으로 공용 명령 세트 아키텍처를 구현하거나 번역하는데 도움을 주며, 즉, 운영 체제 설계자 및 애플리케이션 프로그래머가 사용하는 기계 코드를 실행한다. 이에 대한 자세한 내용은 다음 섹션을 참조하십시오.


"실행 대 데이터"많은 답변이이 패러다임을 사용합니다.

혼란스럽게 다른 방식으로, 나는 두려워하지만, 나는 내 자신의 의견을 말할 것입니다. 이 섹션은 위의 마지막 글 머리 기호로 확장됩니다. 여기서 목표는 CPU가 수행하는 작업 (하드웨어와 마이크로 코드의 조합으로 달성)과 일반 장치가 수행하는 작업 (하드웨어와 펌웨어의 조합으로 달성)을 구별하는 것입니다. SATA 하드 디스크 드라이브를 선택하겠습니다.

SATA 드라이브는 "섹터 5,123에서 데이터 읽기"및 "섹터 1,321에이 데이터 쓰기"라인을 따라 컴퓨터에서 명령을 따릅니다. 드라이브의 펌웨어는 하드웨어가 하드웨어를 작동하게하는 책임이 있으며 일반적으로 임베디드 CPU에서 실행되는 꽤 일반적인 코드입니다. 드라이브의 지시는 순차적으로 도착하지만 도착한 순서대로 처리되지 않을 수 있습니다. 이 지침은 프로그램이 아니며 보낸 메인 CPU에서 실행되는 프로그램에 의해. 특히, 제어 흐름이 없으며, 즉, 다음에 실행할 명령을 SATA 드라이브에 알려주는 명령이 없다.

CPU가 컴퓨터를 담당합니다. 초기화가 완료되면 마더 보드 (BIOS, 다른 유형의 펌웨어)가 제공하는 지침 ( "기계 코드")을 실행하여 운영 체제가 제공 한 기계 코드를 실행하여 제공된 기계 코드를 실행하도록 지시합니다 응용 프로그램 공급 업체. CPU 자체는 EEPROM (BIOS의 경우) 또는 RAM (운영 체제 및 응용 프로그램의 경우)에서 기계 코드를 검색합니다. 특히 기계 코드는 제어 흐름을 가지고 있습니다. 기계 코드는 다음에 수행 할 기계 코드를 CPU에 알려줍니다. 동일한 기계 코드를 반복적으로 반복 할 수 있습니다. 코드가 작동하는 데이터에 따라 다른 코드 비트를 실행할 수 있습니다. SATA 코드와 같은 장치 인터페이스 언어의 지침은 제한된 일련의 작업을 수행 할 수 있지만 기계 코드는 해야 할 것 아무것도 . (또한보십시오 튜링 완전성 .)

위의 마지막 글 머리 기호는 다음과 같이 다시 작성할 수 있습니다. 일반적으로 마이크로 코드는 Turing Complete 언어를 구현합니다. 보통의 펌웨어는 그렇지 않습니다.


마이크로 코드로 "하드웨어 명령어가 해석된다"는 것은 무엇을 의미합니까?

사실이지만 혼란 스럽네요. 중요한 점은 제어 흐름이 있고 Turing Complete 인 기계 코드와 SATA와 같은 장치 인터페이스에 의해 정의 된 명령 간의 차이입니다.


사운드 카드에서 실행되는 코드에 "마이크로 코드"가 적용됩니까?

아니요, 사운드 카드는 SATA 드라이브처럼 코드가 아닌 지침을받습니다. 지침은 "날카로운 연주"또는 "이 데이터를 파형으로 해석하고 연주"와 같을 수 있습니다. 여전히 매우 간단합니다.

및 비디오 카드 (GPU)?

구식 비디오 카드 (GPU가없는)는 SATA 드라이브와 동일합니다. 지침은 "이 픽셀을이 색으로 설정"또는 "이 위치에 A 쓰기"와 같습니다.

... GPU는 복잡하고 위에 설명 된 두 개의 세계 사이에 자리 잡고 있습니다. 아마도 자신의 CPU를 가지고있는 주 컴퓨터에 앉아있는 특수 컴퓨터로 생각하는 것이 가장 간단 할 것입니다. SATA 드라이브와 같은 장치에도 CPU가 내장되어 있지만 SATA 드라이브의 임베디드 CPU는 드라이브 제조업체가 제공 한 코드 만 실행하는 반면 GPU는 운영 체제 및 / 또는 응용 프로그램 공급 업체에서 제공하는 코드도 실행한다는 점이 다릅니다. 정말로 이것은 완전히 별개의 질문입니다.


TL : 마이크로 코드는 하드웨어가 Turing Complete 명령어 세트를 구현하는 데 도움이되는 특정 종류의 펌웨어입니다.


1

마이크로 코드 ( "제어 저장소" )은 휘발성 또는 비 휘발성 메모리에있는 데이터입니다. 일반적으로 다소 작지만 매우 넓은 메모리이며, 데이터 출력 신호는 제어 신호 랜덤 제어 로직 등을 포함한다. 마이크로 코드 메모리의 어드레스 입력은 메모리 ( "마이크로 프로그램 명령")의 워드를 통해 단계적으로 진행하는 상태 머신에 의해 효과적으로 제공된다 제어 신호를 시퀀싱 하나 또는 여러 개의 하드웨어 블록으로 구성됩니다. 이렇게하면 하드웨어가 시간이 많이 걸리고 복잡하지 않은 로직을 사용하여 복잡한 작업을 구현할 수 있습니다.

현대의 마이크로 프로세서에는 물리적 인 실리콘 마이크로 아키텍처를 일반적인 "기계 코드"인터페이스를 가진 좀 더 일반적인 아키텍처 패밀리로 추상화하는 데 필요한 마이크로 코드 / 시퀀싱 단위의 계층 구조가있을 수 있습니다. 예를 들어, 명령어 디코더 및 부동 소수점 유닛을 구현하기 위해 마이크로 코드 / 시퀀싱의 여러 계층이있을 수 있습니다.

전통적인 의미에서의 펌웨어는 비 휘발성 메모리에 상주하는 소프트웨어 / 데이터로 드물거나 변경되지 않을 것으로 예상됩니다. 이것은 끊임없이 변화하는 시스템 메모리에 저장되거나 오히려 저장되고 실행되는 소프트웨어를 직접 대조합니다. 마이크로 코드는 특히 하드웨어의 시퀀스 제어에 대한 마이크로 프로그램을 나타내는 데이터를 참조합니다.

마이크로 코드는 펌웨어 / 펌웨어에 구현 될 수 있지만 마이크로 코드를 포함 할 수는 있지만 동일하지는 않습니다.


1
최신 x86 CPU는 사용자가 설명하는 것보다 훨씬 더 유선으로되어 있습니다. 당신은 Haswell / Skylake가 아닌 non-pipelined 386을 묘사하는 것처럼 들립니다. 인텔의 "마이크로 코드 업데이트" 마이크로 코드 된 명령어가 어떻게 디코딩되는지 수정하는 것보다 더 많은 일을하십시오. . 예 : 가능하다면 CPU가 하드웨어 버그가 발견 된 경우이를 가능하게하기 위해 루프 버퍼를 비활성화 할 수 있습니다 (Skylake에서 SKL150 에라타를 수정).
Peter Cordes

@PeterCordes 1) x86 아키텍처는 마이크로 코드의 개념을 표현하는 것과 관련이 없습니다. 2) 내 대답을 이해했으면, 제어 신호를 순차적으로 처리한다는 것에 동의했습니다.

1
아닙니다. 인텔은 실제로 제어 신호가 아닙니다. 이들은 고전적인 MIPS 파이프 라인과 같이 로직 유닛을 직접 프로그래밍하지 않습니다. uops는 out-of-order 스케줄러에 의해 읽혀 져서 어떤 uops가 다른 uops에 데이터 의존성이 있는지 파악합니다. 이것은 하나의 명령을 실행하는 여러 단계가 디코드 ROM에서 읽혀지는 6502와 매우 다른 내부 모델입니다. 당신이 기술하는 것은 마이크로 코드라는 용어의 역사적인 의미 중 하나이지만 현대 CPU에 대한 "마이크로 코드 업데이트"는 아닙니다.
Peter Cordes

Intel 또는 x86 마이크로 작업 (컨트롤 저장소의 "마이크로 프로그램"과 동일하지 않음)은 어디에서 언급 했습니까? 또한 문자 그대로 제어 저장소에서 제공되는 것은 신호의 순서가 정해져 있는지 또는 정적인지 논리적인지 또는 와이어인지에 관계없이 제어 신호입니다. 필자가 설명하는 것은 마이크로 코드의 문자 적 ​​정의 인 "마이크로 코드 업데이트"입니다. Haswell의 많은 신호가 정적 일 것이기 때문에 당신은 나의 대답의 연속적인 측면에 매달려있다. 기록을 위해, 많은 아르 시퀀싱은 파이프 라이닝이나 OoOE와 절대적으로 상호 배타적이지 않습니다.

1
그래서 당신은 올바르게 대답하고 있습니다. "마이크로 코드 된 명령이란 무엇인가"라는 질문 그러나 CPU에 대한 "마이크로 코드 업데이트"는 "마이크로 코드"라는 단어와 기술적 인 의미가 다릅니다. 이것은 내가 생각하는 OP의 혼란의 근원이기 때문에 명시 적으로 만들어야하는 중요한 포인트입니다.
Peter Cordes

0

펌웨어 ROM 또는 다른 비 휘발성 메모리에 배치 된 실행 가능 코드이다.

펌웨어의 원래 목적과 주 목적은 CPU가 시작될 때 거기에있는 것이므로 CPU가 어떤 시스템이든 시작하거나 부팅하기 위해 실행할 코드가 있습니다. PC의 경우 펌웨어는 실행중인 운영 체제에 서비스를 제공하는 데 사용되며 팬, 전원 및 기타 몇 가지 사항을 제어하는 ​​내장형 컨트롤러에 대한 코드를 보유하고 백그라운드에서 실행되는 ME / PSP를 코딩합니다 .

하드 드라이브, USB 장치 등과 같은 펌웨어를 사용하는 주변 장치에는 CPU가 내장되어 있습니다.


마이크로 코드 실행 가능한 코드가 아니라 장치의 내부 기능에 사용되는 코드입니다.

WRMSR 명령으로 Intel 또는 AMD CPU에로드됩니다. 장치에 펌웨어를로드하는 것은 ROM 또는 플래시 매체를 프로그래밍하거나 펌웨어를 받아들이 기 위해 장치에있는 작은 로더 프로그램에 의존합니다.

펌웨어 및 마이크로 코드 업데이트는 비슷한 범주에 속합니다. 하드웨어를 작동시키기 위해해야 ​​할 일들과 수시로 업데이트해야 할 필요가있는 것들입니다. 그러나 그것들은 매우 다른 것들입니다.

많은 CPU의 복잡한 명령어는 하드웨어에 직접 연결되지 않고 메인 CPU의 더 작은 CPU와 유사한 기능에 의해 "실행"됩니다. 마이크로 코드는 이러한 조작을 제어합니다. 이것은 마이크로 코드가 들어있는 "MicroROM"이있는 Motorola 68000으로 돌아갑니다.

인텔이나 AMD 프로세서를 제외한 다른 어느 누구도 세부 사항을 공개하지 않기 때문에 마이크로 코드가 실제로 통제하거나하는 것을 알고 있지 않습니다. 해킹 시도가 있습니다. 참고 .

실질적으로 마이크로 코드 업데이트는 본질적으로 알려진 모델 / CPU 스테핑에 문제를 일으키는 명령어를 비활성화하는 데 사용되며 인텔의 최신 CPU는 안정적으로 작동하기 전에 최소 하나 이상의 마이크로 코드 업데이트가 필요합니다.


CPU 마이크로 코드가 실제로 무엇을 할 수 있는지에 대한 일부 관점은 6502 PLA 디코드 ROM - 6502는 구형 8 비트 CPU이며 명령은 내부 PLA에 의해 시퀀싱 / 제어되었습니다. PLA는 기본적으로 각 명령어의 각 단계에서 칩의 어느 부분이 포함되었는지를 나타냅니다 (6502 명령어 범위는 2-7 사이클). 캐싱, 수퍼 스칼라 아키텍처, 분기 예측 등과 같은 것들은 훨씬 이전입니다.  최신 CPU의 마이크로 코드가 PLA와 같은 것을 제어하는지 확신 할 수 없습니다.


1
인텔의 "마이크로 코드 업데이트" 마이크로 코드 된 명령이 디코딩하는 방법을 수정하는 것보다 훨씬 많은 작업을 수행 할 수 있습니다. . 예 : 가능하다면 CPU가 하드웨어 버그가 발견 된 경우이를 가능하게하기 위해 루프 버퍼를 비활성화 할 수 있습니다 (Skylake에서 SKL150 에라타를 수정).
Peter Cordes

1
6502 PLA에 대한 흥미로운 점이 있지만 파이프 라인 방식의 CPU는 그보다 더 하드 와이어해야합니다. 클래식 MIPS는 명령어의 다른 필드를 사용하여 내부 로직을 다소 비슷한 방식으로 직접 제어했지만 물론 파이프 라인 된 CPU는 여러 개의 명령어를 포함하고 있습니다 (실속이없는 경우 각 파이프 라인 스테이지마다 하나씩). (또는 수퍼 스칼라의 경우 각 파이프 라인 단계에서 2 개 이상이 필요하고 순서가 복잡하면 훨씬 더 복잡합니다.) 현대 CPU의 많은 내부 회로는 하드 와이어 방식이지만 마이크로 코드 업데이트로 조정할 수있는 손잡이가 있습니다.
Peter Cordes

0

술어

나는 이것에 대한 사용 - 문맥만을 사용하여 스스로에게 대답 할 것이다. 이 pdf .

  • 펌웨어 - 마이크로 코드 ~이다. CPU의 펌웨어가 제공하는 경로를 통해 업데이트됩니다.

    "일반적으로 마이크로 코드 패치는 마더 보드 펌웨어에 의해 CPU에 업로드 됨 (예 : BIOS 또는 UEFI) 또는 운영 체제를 부팅 할 수 없습니다. "

  • 마이크로 코드 - 그 자체가 "Instruction Decode Unit (IDU)"에서 사용되는 데이터입니다. IDU는 하드 와이어드 또는 마이크로 코드 된 . 이러한 맥락에서 마이크로 코딩은 단순히 프로그래밍 된 것을 의미합니다. 또한 방법 "복수의 마이크로 코드". IDU

    IDU는 제어 장치 내에서 중심 역할을하며   명령 내용에 따라 제어 신호를 생성합니다.   레지스터.

  • 매크로 명령 IDU로 보내져 하나의 명령이 디코딩 될 경우, 마이크로 설명서 .

  • 미세 교육 하나의 사전 계산 된 "제어 워드", 모든 상태 및 명령을 1 클록 사이클 동안 실행합니다. CPU로 보내서 제어 신호 .

따라서이 컨텍스트에서 펌웨어로 마이크로 코드를 업데이트하십시오. 매크로 명령을 마이크로 코드화 된 IDU로 전송하여 매크로 명령을 CPU에서 실행하기위한 "마이크로 명령"으로 변환하여 제어 신호로 변환합니다.

이걸 읽었 어.

마이크로 코드 데이터 , 그러나 마이크로 코드 업데이트 중 수행 ...을 통하여 펌웨어. 근본적으로 내부 조회 테이블에 해당하는 것에 대해 이야기하고 있기 때문에 혼란 스러울뿐만 아니라 확실히 그 자체이기도합니다. 펌웨어 기본적으로 칩에 저장되어 칩의 실행 흐름에 사용됩니다. 제 생각에 일반 MIDI, 하드웨어 포스트 스크립트 및 벙어리 터미널의 제어 신호는 하드웨어와 같은 의미로 해석됩니다. 어떤 것 지시를 받고 궁극적으로 "제어 신호" 어떤 종류의 해석 과정에서.

CPU 내의 "IDU"와 모든 "마이크로 명령어"를 보유하고있는 IDU가 사용하는 특정 입력 테이블의 이름 인 "마이크로 코드"와 같은 CPU 내의 이러한 프로세스와 구성 요소에 대한 특별한 이름이있는 것 같습니다. 해당 프로세스에 대한 정보는 독점적이며 폐쇄되었습니다. 나는 모뎀 (ATDT 등 Hayes 모뎀을 사용하는 것), MIDI 카드 등 다른 기술과 유사하다고 가정하지만 특정 조회 테이블의 이름을 "마이크로 코드"로 지정하지 않고 "펌웨어"라는 포괄적 인 용어를 대신 사용합니다 깜박이는 과정과 전체 페이로드가 칩에 저장됩니다.


1
Linux (및 Windows)는 사용자가 말하는 마더 보드 펌웨어와 완전히 독립적으로 CPU 마이크로 코드를 업데이트 할 수 있습니다. 마더 보드 펌웨어 ~하다 최신 CPU 마이크로 코드와 디스크에서 코드가로드되기 전에 적용하기위한 메커니즘이 포함되어 있지만 잠시 동안 mobo 펌웨어를 업데이트하지 않은 경우 소프트웨어를 업데이트하기 만하면 최신 CPU 마이크로 코드를 계속 사용할 수 있습니다. mobo 펌웨어와 CPU 마이크로 코드 간의 연결에서 너무 큰 거래를하고 있습니다. 펌웨어가 부팅 할 때마다 마이크로 코드를 업데이트하도록하는 것이 유용하지만 때로는 안정성을 제외하고는 필요하지 않습니다.
Peter Cordes

2
또한 모든 x86 매크로 명령어가 마이크로 코드 시퀀서 ROM에서 찾 아서 디코딩되지는 않습니다. Intel CPU에서 4 개 이하의 μOP (마이크로 ops)로 디코딩되는 명령어는 디코더에 하드 코딩됩니다. 대부분의 지시 사항은 "마이크로 코드" 이 단어의 의미에서. 정수 부분은 ( dividiv ), FP 분할조차도 단일 uop입니다 (성능이 더 중요하기 때문에 다중 단계 반복 논리는 마이크로 코드화 된 uops 대신 분할 단위 내에서 수행됩니다).
Peter Cordes

@ PeterCordes 당신은이 답변을 쓰는 ​​사람이고, 내 답변을 기술적으로 더 정확하게 편집 할 생각입니다. 당신은 일종의 블랜치를 가지고 있습니다. 비록 당신이 시간이 없다면, 나는 오늘 밤에 그 변화를 롤 시도 할거야.
Evan Carroll

내가 주변에 도착하면, 내가 시작한 대답을 쓰는 것을 끝내겠다. 현재로서는, 해리 존스턴의 대답 아마도 "마이크로 코드 업데이트"가 정말로 업데이트되는 것인데, "CPU 마이크로 코드"가하는 것과 다른 것은 아닙니다. 왜냐하면 그것이 지나치게 단순화 되었기 때문입니다. 일반 대중이 추적 할 수있는 한 단어로 된 이름이 필요한 기술적 인 것들과 공통적 인 이름입니다.
Peter Cordes

0

저는 MIPS 개념을 모델로 한 RISC 프로세서의 연구와 디자인을 중심으로 기본적인 ISA 디자인 과정을 수강했습니다. 내가 기억하게 된 것은 다음과 같다.

내 이해를 위해 레지스터, ALU, 멀티플렉서 및 메모리 모듈과 같은 프로세서의 기본 블록에는 작업을 수행하는 데 필요한 특정 신호가 필요합니다. 이 신호는이 블록을 조작하는 데 필요한 신호이기 때문에 "신호"신호라고 부릅니다. CPU는 본질적으로 ALU, 메모리 모듈, 레지스터 및 기타 하드웨어의 스파게티 블록입니다. 의미는 각 CPU가 자신의 작업을 수행하기 위해 제어 신호의 특정 순서를 표명해야 함을 의미합니다 (ANDI, ORI, JMP, BNE, BEQ 등과 같은 기본 지침을 의미 함). 커리큘럼의 페이스가 그 당시 컨트롤 유닛에 대해 아무 것도 가르쳐주지 않았기 때문에 명령어 세트를 테스트하고 디버깅하는 동안 자신이 직접 MIPS 명령어를 사용하여 신호를 표시해야 할 때 나는 그것에 대해 여러 감정을 가지고있었습니다.

반면에 어셈블러 언어는 명령어 (기본적으로 데이터 버스의 너비)에서 opcode와 피연산자로 귀결됩니다. MIPS의 관점에서 보면, 명령어의 처음 6 비트가 사용자의 opcode입니다. 완전한 수학적 검사만으로 ALU, 레지스터, 메모리, 멀티플렉서를 "주장"할 수는 없습니다. 하드웨어의 나머지 부분은 6 비트 혼자만 사용할 수 있습니다.

네가 가진 것이 아니라면 ... INSTRUCTION DECODER. 명령어 디코더는 기본적으로 opcode를 취하여 하드웨어를 작동시키는 데 필요한 "assertion"신호를 모두 생성합니다. 그러나 명령 디코더는 아키텍처 간 구현이 다르며 일부 경우 프로그래밍이 가능합니다. 마이크로 코드는 명령 디코더의 프로그래머블 섹션에 영향을줍니다.

나는 그것을 믿게되었다. 펌웨어 하드웨어에 내장 된 모든 정보에 대한 일반적인 용어입니다. 경우에 따라 비트 스트림을 EEPROM 및 플래시 메모리와 같은 하드웨어에 인코딩하고 저장할 수 있으므로 마이크로 코드도 참조하게됩니다. 그러나 대부분의 경우 컴파일 된 코드, asm 또는 심지어 FPGA에 사용되는 VHDL / Verilog 비트 스트림입니다. 나에게 마이크로 코드는 선택 프로세서에서 "주장 신호"를 지정하는 데 사용되는 의미론처럼 보인다.


-2

마이크로 코드는 하위 ASM 레벨의 cpu 통합 펌웨어입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.