Chính xác thì microcode là gì và nó khác với firmware như thế nào?


50

Trong chừng mực là thuật ngữ, "microcode" chính xác là gì và nếu nó có thể được cập nhật, nó khác với firmware như thế nào?

Câu hỏi này không phải là một bản sao của câu hỏi này (theo như tôi có thể nói) mà tôi cũng đã hỏi về việc sửa đổi vi mã. Ở đây tôi thực sự muốn biết làm thế nào để sử dụng các thuật ngữ này đúng cách.

Cập nhật

Tôi có một câu trả lời được chọn, nhưng tôi không đặc biệt hài lòng với nó. Tôi đã tham gia rất nhiều câu trả lời và tôi thấy rất nhiều câu trả lời không thỏa mãn như nhau. Vì vậy, hãy để tôi trình bày cho bạn hai khung hình của tôi,

  1. "Vi mã bộ xử lý gần giống với phần sụn của bộ xử lý." Khi tôi đọc nó ngày càng nhiều, đó là cách tôi lấy nó. "Microcode" trong bối cảnh này chỉ là tiếp thị trên "phần mềm xử lý". Chịu đựng tôi, ..
  2. Hoặc, tôi sai, và tôi biết điều đó xảy ra! Trong trường hợp này, tôi cần một ý tưởng kỹ lưỡng hơn nhiều về lý do tại sao tôi sai. Trong câu trả lời mà tôi đọc để chỉ cho tôi là sai, tôi đang đấu tranh để hiểu chúng,
    • "Thực thi so với dữ liệu" rất nhiều câu trả lời sử dụng mô hình này, nhưng đối với CPU không có ý nghĩa gì với tôi. Một số phần mềm khẳng định được thực thi, nhưng bằng gì? Khi nói đến CPU, các chương trình hướng dẫn hoặc dữ liệu?
    • Nếu phần sụn kết nối phần mềm và phần cứng (đọc: công cụ kỹ thuật điện của các vị thần), thì làm thế nào là vi mã cũng không thể làm rõ sự khác biệt đó.
    • "Phiên dịch" khi thời gian trôi qua, điều này thậm chí còn ít ý nghĩa hơn. Có nghĩa là gì khi nói "hướng dẫn phần cứng được diễn giải" với Microcode. Nếu đó là sự thật, liệu một cái gì đó sẽ là hiệu suất nếu nó không được giải thích nhưng được biên dịch theo các hướng dẫn phần cứng khác nhau và chỉ "thực thi"? Ngoài ra, làm thế nào để MIDI chung không được diễn giải trong cùng một ánh sáng? Đó là ngôn ngữ được hiểu bởi "MIDI microcode" và chạy trên phần cứng. Hoặc, các thiết bị đầu cuối câm diễn giải các hướng dẫn từ xa cho hiển thị trực quan?
    • "Microcode" có áp dụng cho mã chạy trên card âm thanh và thẻ video (GPU) không?

Tôi không phải là chuyên gia, nhưng tôi sẽ nói rằng microcode là phần sụn của bộ xử lý. Tôi tưởng tượng tất cả dữ liệu về cách vi mã được thực thi sẽ là độc quyền của intel / AMD, nhưng tôi có thể đoán nó sẽ hoạt động như thế nào. Bạn có một bộ CPU đơn giản, những thứ cơ bản như tìm nạp từ các toán tử bộ nhớ và toán học. Sau đó, bạn có một tập lệnh phức tạp (chẳng hạn như x86 / intel). CPU nhận lệnh từ bộ nhớ và sử dụng vi mã để chuyển đổi lệnh phức tạp thành đơn giản hơn. Một ví dụ sẽ là phép nhân. Hầu hết các CPU đều có một lệnh nhân, nhưng thực sự nhân bao gồm nhiều lần dịch chuyển bit.
Chương trình

Thuật ngữ Microcode đề cập đến thực tế là nó sử dụng / làm cơ sở cho nhiều hướng dẫn mã CPU của CPU. Về cơ bản, nó cho CPU biết cách mô phỏng các hướng dẫn và tính năng. Do đó, nó là tên. Từ quan điểm của một chủ sở hữu máy tính, nó là một bộ mã khác được cung cấp bởi nhà cung cấp phần cứng, do đó, nó có thể được tóm tắt là phần sụn.
eckes

IMO, câu trả lời đơn giản tốt nhất là "Mỗi lần bộ xử lý thực thi một lệnh, nó thực sự đang thực thi một chương trình vi mã." Điều dường như đối với bạn là một lệnh của bộ xử lý là một chuỗi các lệnh vi mã cụ thể, một "chương trình vi mã". Mỗi hướng dẫn có chương trình vi mã riêng. Các hướng dẫn vi mã riêng lẻ kích hoạt / vô hiệu hóa / vv các bit bên trong khác nhau của bộ xử lý.
Ethan Reesor

Câu trả lời:


57

Nguồn gốc của phần sụn từ là điểm giữa giữa phần cứng và phần mềm - phần mềm được nhúng trên phần cứng. Nó đề cập đến phần mềm được lưu trữ trong bộ nhớ không bay hơi trên thiết bị phần cứng. Ví dụ là EEPROM và bộ nhớ Flash được nhúng vào các thiết bị phần cứng, khi chúng được sử dụng để lưu trữ mã được chạy bởi chính thiết bị.

Nó trở nên phổ biến hơn trong một số loại phần cứng để "phần sụn" của nó được lưu trữ trong phần mềm trình điều khiển và được tải lên thiết bị khi thiết bị khởi động / khởi tạo, thay vì để nó vĩnh viễn trên thiết bị. Ví dụ, ngày nay không phải là vấn đề lớn để lưu trữ vài trăm KB mã chương trình cơ sở trong trình điều khiển phần mềm được tải lên hệ điều hành máy chủ và gửi nó xuống thiết bị khi trình điều khiển khởi tạo.

Điều này thường vẫn được gọi là "phần sụn" mặc dù tùy thuộc vào định nghĩa phần sụn bạn chấp nhận, về mặt kỹ thuật, bạn không thể xem xét phần sụn vì nó không nằm trên phần cứng (nếu bạn tách phần cứng và đặt nó vào hệ thống khác, nó sẽ sẽ không giữ lại phiên bản "phần sụn" đó).

Microcode là một tập hợp con của loại "phần sụn" sau này. Microcode không phải là một thuật ngữ chung cho tất cả "phần sụn" được tải lên thiết bị khi khởi động. Thay vào đó, nó đặc trưng cho CPU, trong đó vi mã về cơ bản tạo thành lớp dịch giữa các hướng dẫn CPU tiêu chuẩn cấp cao hơn và các hoạt động cấp thấp hơn dành riêng cho CPU đó. Nó được tải vào CPU khi khởi động, bởi BIOS, nhưng cũng có thể được hệ điều hành thay thế sau này trong giai đoạn khởi động.

Một bản cập nhật cho microcode có thể cho phép sửa đổi hành vi cấp thấp của CPU để khắc phục một số lỗi chưa được phát hiện mà không cần thay thế phần cứng CPU. Microcode thường chứa ánh xạ hiệu quả nhất từ ​​hướng dẫn cấp cao hơn xuống cấp thấp nhất có thể để có tốc độ và hiệu quả năng lượng tốt nhất, vì vậy đôi khi cần thay đổi microcode để sửa một số lỗi, điều đó có thể làm giảm hiệu suất.

Lưu ý rằng Meltdown (lỗ hổng chỉ ảnh hưởng đến chip Intel) không thể được khắc phục chỉ bằng các bản cập nhật vi mã và yêu cầu thay đổi chức năng hệ điều hành cốt lõi, điều này có thể làm giảm hiệu suất hơn nữa. Spectre (lỗ hổng ảnh hưởng đến chip Intel, AMD và ARM) có thể được xử lý xung quanh chỉ với các bản cập nhật vi mã.


Để trả lời một số câu hỏi cụ thể của bạn kể từ khi chỉnh sửa:

  1. Có, microcode về cơ bản là phần mềm chạy trên bộ xử lý. Thuật ngữ đặc biệt "microcode" đặc biệt dùng để chỉ phần sụn trên bộ xử lý có bản kế hoạch chi tiết để dịch từ ngôn ngữ máy tiêu chuẩn sang hướng dẫn bộ xử lý cấp thấp. Vì vậy, nó là một thuật ngữ cụ thể hơn phần sụn.

    Lưu ý rằng như tôi đã thảo luận ở trên, nó không được lưu trữ trên CPU trong khi nó tắt mà được tải vào nó mỗi khi bạn khởi động nên theo nghĩa là nó không hoạt động như phần sụn truyền thống. Tuy nhiên, rất nhiều phần cứng thực hiện điều này ngay bây giờ và vẫn được gọi là "phần sụn" nên việc gọi nó là phần sụn là chấp nhận được.

  2. Tôi không nghĩ bạn sai. Phần sụn không phải được viết bằng một ngôn ngữ máy nhất định và việc thực thi phần mềm không phải được kích hoạt theo một cách nhất định. Ở một mức độ thấp nhất định, tất cả mã máy là "dữ liệu" được "đọc" bởi bộ xử lý và được diễn giải theo một cách nhất định.

    Thuật ngữ "microcode" thường chỉ được sử dụng cho CPU chính và không phải card đồ họa hoặc phần cứng khác, mặc dù những thiết bị khác đó có thể có mã được tải lên chúng theo cùng một cách.


1
Câu thứ hai của bạn không chính xác; phần sụn bao gồm phần mềm được lưu trữ trong ROM. Ngày xưa phần lớn phần sụn là ROM, trước khi các lựa chọn thay thế trở nên hợp lý.
Harry Johnston

1
Rõ ràng, "microcode" dành riêng cho CPU. Câu hỏi khác hơn là cụ thể là nó có làm khác đi không. Xóa phạm vi ("CPU"), bạn sẽ nhận được một trích dẫn gần như trực tiếp về "lớp dịch giữa các hướng dẫn cấp cao hơn và các hoạt động cấp thấp hơn". Đó chỉ là định nghĩa của phần sụn. Đó không phải là tất cả các phần mềm làm gì? Đó là rất nhiều từ, nhưng tôi nghĩ rằng mô tả ngắn gọn và mô tả nhất là ở trên, "Mã vi xử lý giống như phần sụn của bộ xử lý."
Evan Carroll

@Evan, hầu hết các thiết bị đều nhận được hướng dẫn của chúng một cách gián tiếp, được gửi từ mã đang chạy trên CPU. Chỉ CPU là trực tiếp xử lý mã được cung cấp bởi người dùng. Cũng xem xét rằng hầu hết các thiết bị đều chứa một loại CPU nhúng nào đó chạy phần sụn và CPU đó có thể có vi mã riêng. Sự khác biệt có thể chỉ quan trọng đối với các nhà thiết kế phần cứng và lập trình viên hạt nhân, nhưng nó không phải là một tùy ý.
Harry Johnston

"Hầu hết các thiết bị đều chứa CPU nhúng của một số loại chạy phần sụn và CPU đó có thể có vi mã riêng", đó là điều tôi muốn nói. Vậy mã xử lý luồng midi trên card âm thanh cũng là "microcode"? Hoặc mã vẽ / kết xuất hiển thị các ký tự trên một thiết bị đầu cuối câm?
Evan Carroll

Không. Mã đang chạy trên card âm thanh để xử lý luồng MIDI chỉ là phần sụn thông thường. Mã xử lý mã đang chạy trên card âm thanh để xử lý luồng MIDI sẽ là microcode. (Trong thực tế, tôi không chắc chắn rằng CPU nhúng trên một thứ đơn giản như card âm thanh sẽ cần microcode ngay từ đầu, nhưng đó là điểm chính.) Điều quan trọng là luồng MIDI hoặc các ký tự được gửi đến một thiết bị đầu cuối câm, không mã. Chúng chỉ là dữ liệu.
Harry Johnston

23

https://wiki.debian.org/Microcode

CPU vi mã

Bộ vi xử lý giống như phần sụn của bộ xử lý. Nhân có thể cập nhật chương trình cơ sở của bộ xử lý mà không cần cập nhật thông qua bản cập nhật BIOS. Một bản cập nhật vi mã được giữ trong bộ nhớ dễ bay hơi, do đó BIOS / UEFI hoặc kernel cập nhật vi mã trong mỗi lần khởi động.

Bộ xử lý của Intel và AMD có thể cần cập nhật cho vi mã của họ để hoạt động chính xác. Các bản cập nhật này sửa các lỗi / errata có thể gây ra bất cứ điều gì từ xử lý không chính xác, đến hỏng mã và dữ liệu và khóa hệ thống.

BIOS (hoặc UEFI) cập nhật mã vi mô CPU trong khi khởi động, tuy nhiên, hầu hết thời gian, nhà cung cấp bo mạch chủ sẽ không phát hành các bản cập nhật BIOS / UEFI thường xuyên hoặc người dùng sẽ không cài đặt các bản cập nhật đó. Vì những lý do này, bộ xử lý hệ thống có thể sẽ chạy với vi mã lỗi thời trên một số lượng lớn hệ thống.

Ví dụ:

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


9
Điều đó không đơn giản: Microcode là "một kỹ thuật áp đặt trình thông dịch giữa phần cứng và mức kiến ​​trúc của máy tính". Như vậy, microcode là một lớp các hướng dẫn cấp phần cứng, thực hiện các hướng dẫn mã máy cấp cao hơn hoặc giải trình tự máy trạng thái nội bộ trong nhiều yếu tố xử lý kỹ thuật số. Nguồn: en.wikipedia.org/wiki/Microcode

17
Vậy chờ đã ... một chiếc "thuyền" chỉ là một loại "phương tiện" đặc biệt? Thật là một từ vô dụng! :-)
Harry Johnston

4
@HarryJohnston Chà, tôi thấy khá hữu ích khi phân biệt "thuyền" với các loại phương tiện khác trong bối cảnh nhất định ... và "microcode" là một loại "thứ gì đó" rất đặc trưng có trong nhiều CPU hiện đại ... ( do đó, nó là mong muốn để có một thuật ngữ cho nó).
Radovan Garabík

4
@ RadovanGarabík: Đó chính xác là quan điểm của Harry, được thực hiện với sự mỉa mai.
Peter Cordes

4
Tôi không hiểu Nếu "Nhân có thể cập nhật chương trình cơ sở của bộ xử lý mà không cần cập nhật thông qua bản cập nhật BIOS", thì tại sao thực tế là "nhà cung cấp bo mạch chủ sẽ không phát hành các bản cập nhật BIOS / UEFI thường xuyên" có nghĩa là "bộ xử lý hệ thống là có khả năng đang chạy với vi mã lỗi thời trên một số lượng lớn hệ thống "? Tại sao kernel không vá microcode? Tại sao phải dựa vào BIOS nếu BIOS không bao giờ được cập nhật và có sẵn một bản thay thế được cập nhật thường xuyên hơn?
Ajedi32

6

Chà, Intel "cập nhật vi mã" trên thực tế là các bản cập nhật "phần sụn" theo nghĩa là chúng cập nhật nhiều hơn chỉ là đơn vị dịch mã vi mã của bộ xử lý.

Các bản cập nhật gói bộ xử lý hợp nhất này mà chúng tôi gọi là "cập nhật vi mã" cho Intel cũng cập nhật các bộ vi điều khiển chết khác (như PMU và lõi quản lý nguồn) cũng như một số bảng tham số cho các hệ thống con bộ xử lý chết khác nhau. Chúng khá phức tạp.

Thông tin này có sẵn trên một số bằng sáng chế của Intel liên quan đến cập nhật vi mã và vi mã.


4

Tôi nghĩ thuật ngữ "microcode" chủ yếu đề cập đến những gì mã làm (nó thực thi các hướng dẫn cấp thấp bằng cách sử dụng các hướng dẫn cấp thấp hơn), trong khi thuật ngữ "phần sụn" chủ yếu đề cập đến cách nó được lưu trữ và quản lý (ít cập nhật hơn phần mềm , dễ dàng cập nhật hơn phần cứng). Theo nghĩa đó, nó giống như sự phân biệt giữa "ứng dụng" và "tệp JAR" - cùng một chương trình có thể là cả hai, nhưng bạn đang xem xét nó từ hai quan điểm khác nhau.

Ngẫu nhiên, ý tưởng về microcode quay trở lại với Maurice Wilkes vào năm 1951, nhiều thập kỷ trước khi bộ xử lý máy tính được nhúng trong silicon.


3

Phần sụn thường dùng để chỉ mã cho các thiết bị chứa CPU chứ không phải CPU, ví dụ như phần sụn cho điện thoại Android.

Microcode là lớp dịch giữa các tập lệnh phức tạp (ví dụ 486, 686, AMD-64 ect.) Và các hướng dẫn cấp thấp hơn mà các nhà sản xuất chip thiết kế silicon cho. Vì vậy, một số hướng dẫn trong bộ hướng dẫn CPU không được triển khai bằng silicon mà được dịch qua microcode thành nhiều hướng dẫn được thực hiện bằng silicon.


Nhưng, điều đó không đúng với tất cả các phần sụn. Hướng dẫn ABI có thể được triển khai bằng Silicon nhưng không được cập nhật thông qua phần mềm?
Evan Carroll

1
"Cập nhật vi mã" của Intel có thể làm được nhiều hơn là sửa đổi cách giải mã các hướng dẫn vi mã hóa . ví dụ, họ có thể vô hiệu hóa bộ đệm vòng lặp (trong Skylake để sửa lỗi SKL150) vì khi có thể CPU được thiết kế để thực hiện điều này trong trường hợp phát hiện ra lỗi phần cứng.
Peter Cordes

3

"Microcode" là thuật ngữ gốc và được dùng để chỉ các hướng dẫn được sử dụng để triển khai trình thông dịch cho tập lệnh "công khai" của bộ xử lý.

Nhưng theo thời gian, với nhiều biến thể trong các kế hoạch thực hiện, sự khác biệt, chẳng hạn như nó, đã trở nên mơ hồ hơn. Đầu tiên là microcode ngang và dọc, sau đó là các sơ đồ khác nhau để viết "microcode" (để thực hiện, giả sử, hướng dẫn I / O) trong tập lệnh của bộ xử lý "chính". Sau đó, cần phải phân biệt giữa mã được tải dễ dàng thông qua các hoạt động "chạy" chương trình thông thường, so với mã (đối với BIOS, ví dụ) được lưu trong ROM hoặc một số lưu trữ được bảo vệ và tương đối khác. Do đó, thuật ngữ "phần sụn" đã được phát minh để chỉ các hướng dẫn này bằng cách nào đó được thực hiện liên tục hơn (và ít truy cập hơn để sửa đổi người dùng) trong bộ lưu trữ.

Nhưng mọi thứ đã biến đổi và vặn vẹo nhiều lần kể từ khi những sự phân biệt đầu tiên này được thực hiện, và các điều khoản khác chỉ có thể xác định với bất kỳ độ chính xác nào trong một môi trường bộ xử lý và hệ điều hành nhất định.


+1, mấu chốt ở đây là có nhiều ý nghĩa của thuật ngữ "microcode" và tôi nghĩ OP thực sự muốn biết về "cập nhật vi mã", chứ không phải các ý nghĩa khác.
Peter Cordes

3

[NB: câu trả lời này được dành riêng để giải quyết các chỉnh sửa gần đây và không thêm vào một số câu trả lời âm thanh đã được đăng.]

Vì vậy, để nhắc lại: microcode (ít nhất là xấp xỉ đầu tiên) là một loại phần sụn cụ thể.

"Microcode" trong bối cảnh này chỉ là tiếp thị trên "phần mềm xử lý".

Vâng, nó không phải là tiếp thị. Tiếp thị sẽ gọi nó là XBoost Pro (TM) hoặc một cái gì đó. Thay vào đó, đó là một thuật ngữ kỹ thuật; nếu bạn thiết kế CPU, sự khác biệt giữa microcode và phần sụn khác của CPU (và loại phần sụn điển hình cho các thiết bị khác) rất quan trọng đối với bạn. Nếu không, có lẽ là không.

Nếu bạn thiết kế bo mạch chủ hoặc viết hệ điều hành, bạn có thể sử dụng "cập nhật vi mã" làm tốc ký cho "cập nhật phần sụn CPU" khó sử dụng và ít quen thuộc hơn. Hầu hết các bản cập nhật firmware CPU chủ yếu ảnh hưởng đến microcode, vì vậy nó đủ gần với cùng một thứ. Bạn có thể biết sự khác biệt, nhưng bạn không cần quan tâm đến nó.

Người dùng cuối không cần biết hoặc quan tâm đến sự khác biệt và trong một thế giới lý tưởng sẽ không bao giờ nghe thấy từ "microcode" nào cả.

Tôi đoán nó đã thu hút sự chú ý của bạn trên báo chí về các lỗ hổng thực thi đầu cơ gần đây, mặc dù bạn cũng có thể đã nghe thấy nó sớm hơn trong một bối cảnh làm cho rõ ràng hơn rằng bạn không cần phải quan tâm. Những lỗ hổng này đã được phát hành sớm hơn so với kế hoạch, điều này có thể dẫn đến việc báo chí được kiểm duyệt ít hơn so với trước đây. Từ quan điểm của người dùng cuối, bạn cần cài đặt các bản cập nhật BIOS, cập nhật hệ điều hành và trong một số trường hợp cập nhật ứng dụng; bạn không cần biết cũng không quan tâm nếu bất kỳ thứ nào trong số này bao gồm microcode mới.


Vì vậy, ngay cả khi nhận ra rằng có lẽ bạn không cần phải biết hoặc quan tâm, bạn vẫn có thể quan tâm đến sự tò mò thuần túy: làm thế nào bạn có thể phân biệt microcode với phần sụn khác?

Chà, điều đầu tiên nhận ra là không nhất thiết phải có một định nghĩa khó và nhanh, đó là tình huống Bleggs và Rubes . Tuy nhiên, có một số điều chúng ta có thể nói về microcode:

  • Microcode thường chạy bên trong CPU chứ không phải trên CPU. Đó là quan điểm cấp cao.

  • Kiến trúc của microcode thường trông khá khác biệt với kiến ​​trúc của mã thông thường, bao gồm cả phần mềm thông thường. Nó có khả năng song song cao và được triển khai gần hơn với phần cứng. Một số câu trả lời hiện có (bao gồm cả câu trả lời của riêng bạn) thảo luận về điều này, mặc dù cần lưu ý rằng các chi tiết có thể thay đổi tùy thuộc vào thiết kế CPU.

  • Mặc dù phần cứng thường được thiết kế để chỉ chạy phần sụn do nhà sản xuất cung cấp, nhưng nó không đặc biệt hiếm khi sử dụng phần sụn của bên thứ ba - mặc dù có thể nó sẽ làm mất hiệu lực bảo hành! Vi mã của bên thứ ba hiếm hơn nhiều, mặc dù tôi tin rằng vào thời cổ đại (tôi đang nói về việc CPU có kích thước bằng hộp bánh mì), một số người dùng cuối sẽ sửa đổi mã vi mô trong CPU của họ. Theo như tôi biết, điều này là không thể đối với loại CPU được sử dụng trong PC.

  • Microcode thường dịch hoặc giúp thực hiện kiến ​​trúc tập lệnh công khai, nghĩa là, nó chạy mã máy mà người thiết kế hệ điều hành và lập trình viên ứng dụng sử dụng. Thêm về điều này trong phần tiếp theo.


"Thực thi so với dữ liệu" rất nhiều câu trả lời sử dụng mô hình này

Theo những cách khác nhau, tôi sợ, nhưng tôi sẽ giải quyết bình luận của riêng tôi. Phần này cũng phục vụ để mở rộng trên điểm đạn cuối cùng ở trên. Mục tiêu ở đây là cố gắng phân biệt giữa công việc mà CPU đang làm (đạt được bằng sự kết hợp giữa phần cứng và vi mã) và công việc mà một thiết bị thông thường đang làm (đạt được bằng sự kết hợp giữa phần cứng và phần sụn). Tôi sẽ chọn một ổ đĩa cứng SATA.

Ổ đĩa SATA tuân theo các hướng dẫn từ máy tính, nằm dọc theo dòng "đọc dữ liệu từ sector 5.123" và "ghi dữ liệu này vào sector 1.321". Phần sụn của ổ đĩa chịu trách nhiệm làm cho phần cứng biến điều này thành hiện thực và nó thường là mã thông thường khá phổ biến chạy trên một loại CPU nhúng nào đó. Các hướng dẫn của ổ đĩa đến theo tuần tự, mặc dù chúng có thể không được xử lý theo thứ tự mà chúng đến. Các hướng dẫn này không phải là chương trình, chúng được gửi bởi một chương trình chạy trên CPU chính. Đặc biệt, không có luồng điều khiển, tức là không có lệnh nào để báo cho ổ đĩa SATA biết hướng dẫn nào sẽ chạy tiếp theo.

CPU phụ trách máy tính. Sau khi khởi tạo xong, nó chạy các hướng dẫn ("mã máy") do bo mạch chủ cung cấp (BIOS, một loại phần sụn khác) để nó chạy mã máy do hệ điều hành cung cấp để chạy mã máy được cung cấp bởi các nhà cung cấp ứng dụng. Bản thân CPU lấy mã máy từ EEPROM (trong trường hợp BIOS) hoặc RAM (trong trường hợp hệ điều hành và ứng dụng). Cụ thể, mã máy có một luồng điều khiển: mã máy cho CPU biết mã máy nào sẽ thực hiện tiếp theo. Bạn có thể lặp đi lặp lại cùng một mã máy, bạn có thể chạy các bit mã khác nhau tùy thuộc vào dữ liệu mà mã đang làm việc - các hướng dẫn trong ngôn ngữ giao diện thiết bị như mã SATA có thể thực hiện một số tác vụ đơn giản giới hạn, nhưng mã máy có thể làmbất cứ điều gì . (Xem thêm Turing Hoàn thiện .)

Chúng ta có thể viết lại điểm đầu dòng cuối cùng ở trên như: microcode thường thực hiện ngôn ngữ Turing Complete; phần mềm thông thường thường không.


Có nghĩa là gì khi nói "hướng dẫn phần cứng được diễn giải" với microcode.

Đúng nhưng có lẽ khó hiểu; điểm quan trọng là sự khác biệt giữa mã máy, có luồng điều khiển và là Turing Complete, và các hướng dẫn được xác định bởi giao diện thiết bị như SATA, không và không.


"Microcode" có áp dụng cho mã chạy trên card âm thanh không

Không, card âm thanh nhận hướng dẫn, không phải mã, giống như ổ đĩa SATA. Các hướng dẫn có thể giống như "phát A sharp" hoặc "diễn giải dữ liệu này dưới dạng sóng và phát dữ liệu". Vẫn rất đơn giản.

và thẻ video (GPU)?

Thẻ video kiểu cũ (những thẻ không có GPU) giống như ổ đĩa SATA. Các hướng dẫn giống như "đặt pixel này thành màu này" hoặc "ghi A vào vị trí này".

... GPU rất phức tạp và nằm ở đâu đó giữa hai thế giới mà tôi đã cố gắng mô tả ở trên. Có lẽ đơn giản nhất khi nghĩ về chúng như một máy tính chuyên dụng ngồi bên trong máy tính chính, một máy tính có CPU riêng. Đúng là các thiết bị như ổ đĩa SATA cũng có CPU nhúng, nhưng điểm khác biệt là CPU nhúng trong ổ đĩa SATA chỉ chạy mã do nhà sản xuất ổ đĩa cung cấp, trong khi GPU cũng chạy mã do hệ điều hành và / hoặc nhà cung cấp ứng dụng cung cấp. Thực sự đây là một câu hỏi hoàn toàn riêng biệt.


TL; DR: microcode là một loại phần sụn cụ thể, giúp phần cứng thực hiện một bộ hướng dẫn Turing Complete.


1

Microcode ( "kho lưu trữ điều khiển" ) là dữ liệu nằm trong bộ nhớ dễ bay hơi hoặc không dễ bay hơi - thường là bộ nhớ khá nhỏ nhưng rất rộng, có tín hiệu đầu ra dữ liệu được nối với đầu vào tín hiệu điều khiển của các đơn vị chức năng phần cứng song song, logic điều khiển ngẫu nhiên, v.v. . Các đầu vào địa chỉ của bộ nhớ vi mã được cung cấp bởi một máy trạng thái bước qua một từ của bộ nhớ ("hướng dẫn chương trình vi mô") để sắp xếp hiệu quả các tín hiệu điều khiển của một hoặc nhiều khối phần cứng. Phần cứng đa thời gian này và cho phép các hoạt động phức tạp được thực hiện với logic ngẫu nhiên ít hơn đáng kể.

Trong các bộ vi xử lý hiện đại, có thể có một hệ thống các đơn vị vi mã / trình tự cần thiết để trừu tượng vi kiến ​​trúc silicon vật lý thành một họ kiến ​​trúc tổng quát hơn với giao diện "mã máy" chung. Ví dụ, có thể có một vài lớp vi mã / trình tự để thực hiện các bộ giải mã lệnh và các đơn vị dấu phẩy động.

Phần sụn theo nghĩa truyền thống là bất kỳ phần mềm / dữ liệu nào nằm trong bộ nhớ không bay hơi, được dự kiến ​​là không thường xuyên hoặc không bao giờ thay đổi. Điều này tương phản trực tiếp với phần mềm được lưu trữ hoặc được ghi vào và được thực thi từ bộ nhớ hệ thống luôn thay đổi. Microcode đặc biệt đề cập đến dữ liệu đại diện cho một chương trình vi mô để kiểm soát trình tự phần cứng.

Microcode có thể được triển khai trong firmware / firmware có thể chứa microcode, nhưng chúng không giống nhau.


1
CPU x86 hiện đại có dây cứng hơn nhiều so với bạn mô tả; có vẻ như bạn đang mô tả một hệ thống không có đường ống 386, không phải là Haswell / Skylake. "Cập nhật vi mã" của Intel có thể làm được nhiều hơn là sửa đổi cách giải mã các hướng dẫn vi mã hóa . ví dụ, họ có thể vô hiệu hóa bộ đệm vòng lặp (trong Skylake để sửa lỗi SKL150) vì khi có thể CPU được thiết kế để thực hiện điều này trong trường hợp phát hiện ra lỗi phần cứng.
Peter Cordes

@PeterCordes 1) Kiến trúc x86 không liên quan đến việc trình bày khái niệm về vi mã 2) bạn có hiểu câu trả lời của tôi không, chúng tôi đồng ý rằng nó sẽ giải mã các tín hiệu điều khiển, như bạn đã nói

1
Không, Intel uops không thực sự kiểm soát tín hiệu. Họ không trực tiếp lập trình các đơn vị logic như trong một đường ống MIPS cổ điển. uops được đọc bởi bộ lập lịch không theo thứ tự để tìm ra các uops có phụ thuộc dữ liệu vào các uops khác. Đây là một mô hình nội bộ rất khác với một cái gì đó giống như 6502 trong đó nhiều bước thực hiện một lệnh được đọc từ một ROM giải mã. Những gì bạn mô tả là một ý nghĩa lịch sử của thuật ngữ microcode, nhưng đó không phải là "cập nhật vi mã" cho các CPU hiện đại.
Peter Cordes

Trường hợp tôi (hoặc câu hỏi cho vấn đề đó) đã đề cập đến các hoạt động vi mô của Intel hoặc x86 (KHÔNG giống như "chương trình vi mô" trong kho lưu trữ điều khiển)? Ngoài ra, theo nghĩa đen, bất cứ thứ gì được cung cấp từ cửa hàng điều khiển đều là tín hiệu điều khiển, cho dù tín hiệu đó có được tuần tự hay tĩnh, logic hay dây. Những gì tôi mô tả là định nghĩa theo nghĩa đen của microcode, "cập nhật microcode". Bạn đang gác máy về khía cạnh giải trình tự câu trả lời của tôi vì nhiều tín hiệu đã nói trong Haswell sẽ tĩnh. Đối với hồ sơ, nhiều người được giải trình tự, trình tự hoàn toàn không loại trừ lẫn nhau đối với đường ống hoặc OoOE.

1
Vì vậy, bạn đang trả lời đúng câu hỏi "hướng dẫn vi mã hóa" là gì , nhưng "cập nhật vi mã" cho CPU không có cùng ý nghĩa kỹ thuật của từ "vi mã". Đây là một điểm quan trọng cần được làm rõ ràng, vì nó là gốc rễ của sự nhầm lẫn của OP tôi nghĩ.
Peter Cordes

0

Phần sụn là mã thực thi được đặt trong ROM hoặc bộ nhớ không bay hơi khác.

Mục đích ban đầu và chính của phần sụn là ở đó khi CPU khởi động, do đó, nó có mã để thực thi để khởi động hoặc khởi động bất kỳ hệ thống nào mà CPU là một phần của. Trong trường hợp của PC, phần sụn cũng được sử dụng để cung cấp dịch vụ cho hệ điều hành đang chạy và cũng giữ mã cho các bộ điều khiển nhúng điều khiển quạt, nguồn và một số thứ khác và mã cho ME / PSP chạy trong nền .

Các thiết bị ngoại vi có chương trình cơ sở, chẳng hạn như ổ cứng, thiết bị USB, v.v ... có CPU nhúng.


Microcode không phải là mã thực thi, mà là mã được sử dụng bởi các phương tiện nội bộ của thiết bị.

Nó được nạp vào CPU Intel hoặc AMD với lệnh WRMSR. Tải phần sụn vào thiết bị bao gồm lập trình ROM hoặc phương tiện flash hoặc dựa vào chương trình trình tải nhỏ để có mặt trong thiết bị để chấp nhận phần sụn.

Các bản cập nhật phần sụn và vi mã nằm trong một danh mục tương tự - những điều bạn cần làm để phần cứng hoạt động và có thể cần cập nhật theo thời gian - nhưng chúng là những thứ rất khác nhau.

Các hướng dẫn phức tạp trong nhiều CPU không được nối trực tiếp vào phần cứng, nhưng được "thực thi" bởi một cơ sở giống như CPU ​​nhỏ hơn trong CPU chính. Microcode kiểm soát các hoạt động này. Điều này quay trở lại ít nhất là Motorola 68000 có "MicroROM" chứa microcode.

Không ai khác ngoài bộ xử lý Intel hoặc AMD biết vi mã thực sự kiểm soát hoặc làm gì, vì chúng không tiết lộ chi tiết. Có những nỗ lực để hack nó. Tham khảo .

Trên thực tế, các bản cập nhật vi mã về cơ bản được sử dụng để vô hiệu hóa các hướng dẫn gây ra sự cố trên các mô hình / bước đi đã biết của CPU và các CPU mới nhất của Intel thường yêu cầu ít nhất một bản cập nhật vi mã trước khi chúng hoạt động một cách đáng tin cậy.


Một số quan điểm về những gì mà một vi mã CPU thực sự có thể làm / thực sự có thể đạt được nếu bạn đọc về ROM giải mã 6502 PLA - 6502 là CPU 8 bit cũ và các lệnh của nó được trình tự / điều khiển bởi PLA bên trong. PLA về cơ bản sẽ cho biết các bộ phận của chip có liên quan ở mỗi bước của mỗi hướng dẫn (6502 hướng dẫn nằm trong khoảng từ 2 đến 7 chu kỳ). Điều này là rất xa, trước khi những thứ như bộ nhớ đệm, kiến ​​trúc siêu khối, dự đoán nhánh, v.v. Không chắc chắn nếu vi mã trên CPU hiện đại sẽ điều khiển thứ gì đó giống như PLA đó.


1
"Cập nhật vi mã" của Intel có thể làm được nhiều hơn là sửa đổi cách giải mã các hướng dẫn vi mã hóa . ví dụ, họ có thể vô hiệu hóa bộ đệm vòng lặp (trong Skylake để sửa lỗi SKL150) vì khi có thể CPU được thiết kế để thực hiện điều này trong trường hợp phát hiện ra lỗi phần cứng.
Peter Cordes

1
Điểm thú vị về 6502 PLA, nhưng CPU có đường ống phải cứng hơn thế. MIPS cổ điển đã sử dụng các trường khác nhau của từ hướng dẫn để điều khiển trực tiếp logic bên trong theo cách tương tự như vậy, nhưng tất nhiên, một CPU có đường dẫn có nhiều hướng dẫn trong chuyến bay, có khả năng là một cho mỗi giai đoạn đường ống nếu không có gian hàng. (Hoặc đối với superscalar, 2 hoặc nhiều hơn trong mỗi giai đoạn đường ống và không theo thứ tự thậm chí còn phức tạp hơn.) Rất nhiều phần bên trong của CPU hiện đại có dây cứng, nhưng với các nút mà cập nhật vi mã có thể điều chỉnh.
Peter Cordes

0

Thuật ngữ

Tôi sẽ tự trả lời điều này bằng cách chỉ sử dụng bối cảnh sử dụng trong bản pdf này .

  • Phần sụn - Microcode được cập nhật thông qua một đường dẫn được cung cấp bởi phần sụn của CPU.

    "Thông thường, một bản vá vi mã được tải lên CPU bởi phần sụn bo mạch chủ (ví dụ: BIOS hoặc UEFI) hoặc hệ điều hành trong quá trình khởi động sớm."

  • Microcode - chính là dữ liệu được sử dụng bởi "Đơn vị giải mã lệnh (IDU)." IDU có thể được mã hóa cứng hoặc được mã hóa . Microcoding trong bối cảnh này chỉ đơn giản là có nghĩa là lập trình. CSONG có nghĩa là "số nhiều của microcode." IDU

    IDU đóng vai trò trung tâm trong đơn vị điều khiển và tạo tín hiệu điều khiển dựa trên nội dung của thanh ghi lệnh.

  • Hướng dẫn macro một lệnh được gửi đến IDU để được giải mã, có thể trả về bất kỳ số lượng Hướng dẫn vi mô nào .

  • Hướng dẫn vi mô một "từ điều khiển" được tính toán trước, tất cả trạng thái và hướng dẫn thực hiện trong một chu kỳ đồng hồ. Gửi đến CPU để tạo tín hiệu điều khiển .

Vì vậy, trong bối cảnh này, bạn sẽ cập nhật microcode với phần sụn. Bạn sẽ gửi các lệnh macro đến IDU được mã hóa để phân giải lệnh macro thành "lệnh vi mô" để thực thi trên CPU, biến chúng thành tín hiệu điều khiển.

Tôi đọc cái này

Microcode là dữ liệu , nhưng việc cập nhật microcode được thực hiện thông qua firmware. Và thật khó hiểu bởi vì bạn đang nói về những gì cơ bản lên tới một bảng tra cứu nội bộ, chắc chắn nó cũng là phần sụn trong đó về cơ bản nó được lưu trữ trên chip và được sử dụng trong dòng thực thi của chip. Tôi nghĩ rằng bạn có thể đưa ra lập luận rằng General MIDI, PostScript phần cứng và tín hiệu điều khiển cho các thiết bị đầu cuối câm cũng được hiểu theo nghĩa tương tự, trong phần cứng và rằng một cái gì đó có hướng dẫn và cuối cùng tạo ra "tín hiệu điều khiển" trong một loại quy trình giải thích .

Dường như chúng ta có một tên đặc biệt cho các quy trình và thành phần này trong CPU: "IDU" trên CPU và tên cho bảng đầu vào cụ thể mà IDU sử dụng chứa tất cả các "vi lệnh": "vi mã". Thông tin về quy trình đó là độc quyền và đóng. Tôi cho rằng nó tương tự với bất kỳ công nghệ nào khác từ modem (với ATDT và tương tự trên modem Hayes), với thẻ MIDI nhưng chúng tôi không đặt tên cho bảng tra cứu cụ thể là "microcode", và thay vào đó sử dụng thuật ngữ "firmware" cho ô quá trình nhấp nháy và toàn bộ tải trọng được lưu trữ trên chip.


2
Linux (và Windows) có thể cập nhật vi mã CPU hoàn toàn độc lập với phần sụn bo mạch chủ mà bạn đang nói đến. Firmware bo mạch chủ không chứa các vi CPU mới nhất và một cơ chế để áp dụng nó trước khi bất kỳ mã được nạp từ đĩa, nhưng nếu bạn chưa cập nhật firmware Bo mạch của bạn trong một thời gian, bạn vẫn có thể có vi CPU mới nhất của chỉ cập nhật phần mềm. Bạn đang thực hiện một thỏa thuận quá lớn từ kết nối giữa phần mềm mobo và vi mã CPU. Thật hữu ích khi chương trình cơ sở cập nhật vi mã mỗi khi khởi động, nhưng không cần thiết (ngoại trừ sự ổn định đôi khi).
Peter Cordes

2
Ngoài ra, không phải tất cả các hướng dẫn macro x86 đều được giải mã bằng cách tra cứu chúng trong ROM trình sắp xếp chuỗi vi mã. Trên CPU Intel, các hướng dẫn giải mã thành 4 hoặc ít hơn (micro-op) được mã hóa cứng vào bộ giải mã. Hầu hết các hướng dẫn không được "mã hóa vi mô" theo nghĩa này của từ này. Phân chia số nguyên là ( dividiv), nhưng ngay cả phân chia FP là một uop đơn (vì nó có hiệu suất quan trọng hơn, logic lặp nhiều bước được thực hiện bên trong đơn vị phân chia thay vì với các vi mạch được mã hóa).
Peter Cordes

@PeterCordes bạn là người viết câu trả lời này, hãy chỉnh sửa bất kỳ câu trả lời nào của tôi để làm cho nó đúng hơn về mặt kỹ thuật. Bạn đã có carte blush. Mặc dù tôi sẽ cố gắng thực hiện những thay đổi đó vào tối nay, nếu bạn không có thời gian.
Evan Carroll

Nếu tôi hiểu được, tôi sẽ viết xong câu trả lời. Hiện tại, câu trả lời của Harry Johnston có lẽ là câu trả lời hay nhất từ ​​trước đến nay khi trả lời những gì tôi nghĩ bạn thực sự muốn biết (đó là "cập nhật vi mã" thực sự cập nhật, không giống với "vi mã CPU", bởi vì đó là một cái tên được đơn giản hóa quá mức, phổ biến với các công cụ kỹ thuật cần một từ một từ mà công chúng có thể theo dõi.)
Peter Cordes

0

Tôi đã tham gia một khóa học về thiết kế cơ bản của ISA, chủ yếu là nghiên cứu và thiết kế bộ xử lý RISC được mô phỏng theo các khái niệm MIPS. Đây là những gì tôi đã nhớ

Theo hiểu biết của tôi, các khối cơ bản của bộ xử lý như thanh ghi, ALU, bộ ghép kênh và mô-đun bộ nhớ yêu cầu một số tín hiệu nhất định để chúng thực hiện công việc. Bạn sẽ gọi những tín hiệu này là tín hiệu "khẳng định", vì chúng là tín hiệu cần thiết để vận hành các khối này. Về bản chất, CPU là một khối spaghetti gồm ALU, mô-đun bộ nhớ, thanh ghi và phần cứng khác. Có nghĩa là mỗi CPU phải xác nhận một chuỗi tín hiệu điều khiển nhất định để thực hiện công việc của chúng (ý tôi là các hướng dẫn cơ bản như ANDI, ORI, JMP, BNE, BEQ, v.v.). Tôi đã có những cảm xúc lẫn lộn về nó khi tôi phải tự mình xác nhận các tín hiệu (thực hiện theo tất cả các hướng dẫn MIPS) trong quá trình kiểm tra và gỡ lỗi một tập lệnh vì tốc độ của chương trình giảng dạy đã dạy tôi bất cứ điều gì về các đơn vị điều khiển tại thời điểm đó.

Mặt khác, ngôn ngữ trình biên dịch mã hóa thành opcodes và toán hạng của chúng trong từ lệnh (về cơ bản là chiều rộng của bus dữ liệu của bạn). Về mặt MIPS, 6 bit đầu tiên của từ hướng dẫn của bạn là opcode của bạn. Bằng cách kiểm tra toán học một mình, bạn không thể "khẳng định" ALU, thanh ghi, bộ nhớ, muxes của mình .. về cơ bản phần còn lại của phần cứng chỉ có 6 bit.

Không, trừ khi bạn có ... MỘT QUYẾT ĐỊNH HƯỚNG DẪN. Bộ giải mã lệnh về cơ bản lấy opcode của bạn và tạo TẤT CẢ các tín hiệu "khẳng định" của bạn cần để vận hành phần cứng của bạn. Tuy nhiên, bộ giải mã lệnh khác nhau trong việc thực hiện giữa các kiến ​​trúc và trong một số trường hợp, có thể lập trình được. Microcode ảnh hưởng đến phần lập trình của bộ giải mã lệnh.

Tôi đã tin rằng phần sụn là một thuật ngữ chung cho bất kỳ thông tin nào được nhúng trong phần cứng. Trong một số trường hợp, nó cũng đề cập đến microcode vì dòng bit của nó có thể được mã hóa và lưu trữ trong phần cứng như EEPROM và bộ nhớ flash. Tuy nhiên, hầu hết thời gian, nó được biên dịch mã, asm hoặc thậm chí là các luồng bit VHDL / Verilog được sử dụng trong các GPU. Microcode đối với tôi có vẻ như ngữ nghĩa được sử dụng để chỉ định "tín hiệu khẳng định" trong bộ xử lý lựa chọn.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.