Làm thế nào là một chương trình được thực hiện ở cấp độ CPU?


14

Tôi biết đây là một câu hỏi rất phổ biến. Nhưng tôi có một góc nhìn khác trong tâm trí. Tôi sẽ chỉ cố gắng nói rõ ở đây.

Từ những gì tôi biết, mọi lệnh mà CPU thực thi, đều bằng ngôn ngữ máy và tất cả CPU có thể làm là thực hiện một số thao tác số học nhờ ALU và các bóng bán dẫn của nó (nếu chúng ta đi ở cấp độ phần cứng).

Tuy nhiên điều này dễ gõ hơn là hiểu nó. Vì vậy, nếu tất cả CPU thực hiện thêm, trừ, v.v., thì chương trình JAVA nói như thế nào là in Hello World, được thực hiện với các phép toán số học này?

Ý tôi là làm thế nào chương trình này được chuyển đổi thành một cái gì đó chỉ là một bổ sung cho CPU?

PS Nếu câu hỏi này không áp dụng cho trang web này thì tôi xin lỗi.

-----Phần hai-----

Được chứ. Cảm ơn tất cả đã trả lời nhanh và với sự nhiệt tình này. Tôi nghĩ tốt hơn là sửa đổi câu hỏi của mình một chút hơn là đi và bình luận cho tất cả các câu trả lời và hỏi lại họ.

Vì vậy, đây là.

Đầu tiên, tất cả đã trả lời cụ thể ví dụ wrt của Hello World. Đây là lỗi của tôi. Tôi nên giữ cái chung này. Ví dụ Hello world đưa ra câu hỏi về các thiết bị đầu ra và cách xử lý của nó không chỉ giới hạn ở CPU, mà được đưa ra một cách chính xác trong câu trả lời của bạn.

Ngoài ra, nhiều bạn đã thông báo rằng CPU không chỉ bổ sung. Tôi đồng ý với điều đó. Tôi chỉ không viết nó và giả sử nó theo mọi cách. Từ những gì tôi hiểu, đây là quá trình:

  1. đọc hướng dẫn từ bộ nhớ (sử dụng dữ liệu và địa chỉ bus và công cụ truy cập chương trình)

    1. lưu trữ dữ liệu trong thanh ghi bên trong CPU
    2. Bây giờ ALU thực hiện các phép toán số học, tất nhiên sau khi giải mã lệnh hoặc nhảy nếu nó giống như lệnh nếu
    3. Và sau đó liên lạc với các tài nguyên khác nếu cần như với thiết bị đầu ra, v.v. Các quy trình vượt quá điều này là tầm thường bây giờ.

Vì vậy, trong bước 3, nơi CPU giải mã một lệnh và quyết định thực hiện một phép toán số học (ở đây chúng tôi giả định rằng không có thao tác nào khác được thực hiện như nhảy lệnh hiện tại .. vì vậy, hầu hết các thao tác số học đều được thực hiện. ) Đây là nơi hình dung của tôi kết thúc. Làm thế nào một lệnh từ chương trình của tôi chỉ là một hoạt động số học cho CPU. Nó thực hiện thao tác số học và hướng dẫn đó phục vụ mục đích của nó.

Tôi hy vọng tôi làm cho mình rõ ràng thời gian này.

PS Tôi đang đưa ra một giả định lớn ở đây rằng ALU không bị hạn chế đối với hoạt động số học thực tế mà chúng tôi thực hiện trong các chương trình của mình, thay vào đó, nó thực hiện tất cả các hướng dẫn, hiện ở dạng nhị phân, bằng cách thêm hoặc bớt vv chúng để mang lại kết quả rằng chúng có nghĩa đến năng suất. Nếu tôi sai ở đây hơn câu trả lời dưới đây trả lời đúng câu hỏi của tôi.


Tôi hiểu rằng trình biên dịch chuyển đổi chương trình thành ngôn ngữ máy. Tôi chỉ không thể hình dung một chương trình như là một phép toán số học. Mặc dù nếu bản thân chương trình là về việc thêm hai số thì có thể hiểu được nhưng nếu không thì không..yet !! :)
dùng2827893

1
Có lẽ bạn nên bắt đầu xem bộ hướng dẫn thực tế của CPU, ví dụ như những bộ rất đơn giản như MC6502, Z80 ... sau đó thấy rằng có các hướng dẫn truy cập bộ nhớ, hướng dẫn xử lý dữ liệu, các nhánh ... Sau đó, bạn có thể đoán chúng có thể như thế nào kết hợp để thực hiện bất kỳ thuật toán.
TEMLIB

3
Một CPU chắc chắn có thể làm nhiều hơn ngoài. Điều quan trọng cần đề cập là CPU có thể so sánh và nhảy.
Theodoros Chatzigiannakis

1
Bạn (dường như) vẫn kiên quyết từ chối xem IF (đưa ra quyết định) và MOVE (đọc và lưu trữ dữ liệu), Lập trình là 99% IF và DI CHUYỂN. Số học là không đáng kể. Ví dụ đầu tiên của bạn (Hello world) hoàn toàn không có số học.
edc65

1
1. Tôi nghĩ rằng bạn sẽ có nhiều khả năng nhận được câu trả lời tốt nếu bạn hỏi một câu hỏi mới với sự nhầm lẫn mới của bạn, thay vì chỉnh sửa câu hỏi này để thay đổi những gì bạn đang hỏi. Bạn đã có câu trả lời tốt cho câu hỏi ban đầu của mình và câu hỏi ban đầu của bạn có vẻ như có thể tự đứng vững, vậy tại sao không xóa bản chỉnh sửa và đặt câu hỏi mới? 2. Điều đó nói rằng, tôi không thể hiểu phần mới. Chính xác câu hỏi của bạn về phần mới là gì? Khi bạn nói "đây là nơi mà hình dung của tôi kết thúc", bạn có nghĩa là bạn làm hiểu bước 3, hoặc bạn không hiểu bước 3? Nếu bạn làm, bạn không hiểu gì?
DW

Câu trả lời:


7

Bạn có thể thử lấy một chương trình đơn giản và biên dịch nó thành mã máy gốc. (Java thường biên dịch thành mã JVM, nhưng Andrew Tennenbaum có một cuốn sách mà anh ta mô tả cách thiết kế CPU chạy tự nhiên, do đó, nó sẽ làm.) Trên GCC, ví dụ, bạn cung cấp cho trình biên dịch công -Stắc.

Điều này sẽ cho bạn biết rằng bất cứ điều gì khó khăn, như I / O, đều được thực hiện bằng cách gọi hệ điều hành. Mặc dù bạn có thể tải nguồn về nhân Linux và làm tương tự với nó, nhưng điều đang diễn ra là: mọi thứ đang thao túng trạng thái của bộ nhớ máy tính, ví dụ như danh sách các tiến trình đang chạy hoặc nói cách khác với phần cứng bằng cách sử dụng địa chỉ bộ nhớ đặc biệt điều khiển nó hoặc sử dụng các hướng dẫn CPU đặc biệt như inouttrên x86. Tuy nhiên, nói chung, chỉ các chương trình đặc biệt được gọi là trình điều khiển thiết bị sẽ nói chuyện với phần cứng cụ thể và HĐH sẽ gửi yêu cầu sử dụng phần cứng đến đúng trình điều khiển.

Cụ thể, nếu bạn in, "xin chào, thế giới!" trình biên dịch của bạn sẽ biến nó thành một tập hợp các lệnh tải chuỗi vào một vị trí cụ thể (ví dụ: tải địa chỉ của chuỗi trong bộ nhớ vào thanh %rdighi) và gọi hàm thư viện bằng calllệnh. Hàm thư viện này có thể tìm thấy độ dài của chuỗi bằng một vòng lặp, sau đó gọi cuộc gọi hệ thốngwrite()để ghi số byte đó từ chuỗi vào tệp mô tả số 1, là đầu ra tiêu chuẩn. Tại thời điểm đó, HĐH sẽ tìm kiếm tệp số 1 của quá trình đó là gì và quyết định việc viết nó có nghĩa gì. Nếu ghi vào đầu ra tiêu chuẩn được in trên màn hình của bạn, sẽ có một số quy trình như sao chép các byte vào bộ đệm, sau đó được chương trình đầu cuối của bạn đọc, thông báo cho hệ thống cửa sổ sẽ đặt các chữ cái ở đâu trong phông chữ nào. Hệ thống cửa sổ quyết định chính xác những gì sẽ trông như thế nào, và nói với trình điều khiển thiết bị để đặt các pixel trên màn hình, điều này thực hiện bằng cách thay đổi bộ nhớ video.


Cảm ơn @Lorehead. Giải thích này có vẻ tốt wrt Xin chào ví dụ thế giới.
dùng2827893

5

CPU của bạn tự nó bị câm, như bạn đã tìm ra. Nhưng có một microcosm chip phần cứng xung quanh nó. Bạn có một hướng dẫn cho phép bạn đặt một dòng CPU ở mức cao được nối với chip khác. Con chip phần cứng đó giám sát đường dây và nói: "Này, nếu đường dây này cao, thì tôi sẽ làm gì đó với một số dòng khác."

Để làm cho điều này dễ dàng hơn, những dòng này được nhóm lại với nhau. Một số được sử dụng để giải quyết các thiết bị, một số được sử dụng để truyền dữ liệu cho các địa chỉ đó và một số khác chỉ là "Dude, có một điều quan trọng đang diễn ra trong chip của tôi".

Cuối cùng, CPU của bạn chỉ bảo một số chip khác hoạt động tốt, vui lòng sửa đổi tín hiệu sang màn hình để nó trông giống như "Hello World".

Google bản vẽ của màn hình 7 đoạn. Nó có dây, sẽ làm cho một phân đoạn sáng lên nếu bạn áp dụng điện áp cho nó. Nếu bạn kết nối ngay một dòng đầu ra của CPU với một dòng màn hình 7 đoạn, màn hình sẽ sáng lên. Đây không phải là CPU làm cho đèn LED phát sáng, nó chỉ áp dụng điện áp cho các đường dây, nhưng một số thứ phần cứng khác có thể làm những điều tiện lợi do nó.

Nếu CPU của bạn bây giờ đặt tất cả các dòng cho H lên cao, phân đoạn 7 sẽ hiển thị H, mặc dù H không phải là số mà CPU sẽ thêm hoặc trừ.

Bây giờ, nếu tất cả các lớp đồng ý những gì cần thiết để làm cho H hiển thị 7 đoạn (đặt 5 dòng cụ thể thành cao), trình biên dịch Java có thể tạo mã để hiển thị H. Điều này tất nhiên khá bất tiện - vì vậy các lớp bắt đầu để trừu tượng. Lớp thấp nhất sẽ bắt đầu bằng: "Yo, có 26 chữ cái, hãy gán số cho mỗi chữ cái - làm thế nào để chúng ta đưa chữ 'H' số '72'? Sau đó, bạn có thể chỉ cho tôi" Hiển thị chữ 72 ", thay vì "Đặt dòng cao 309, đặt dòng cao 310, đặt dòng cao 498, đặt dòng cao 549, đặt dòng 3 cao". Vì vậy, mỗi lớp bắt đầu thông tin trừu tượng, làm thế nào để đạt được kết quả nhất định, vì vậy bạn không cần quan tâm đến họ.

Vì vậy, có, nó tổng hợp thành một ánh xạ huuuuge của các số hoặc bit, CPU thực sự có thể xử lý, theo ý nghĩa mà mọi người trong chuỗi đã đồng ý.


3

Ở trường đại học là một phần của chương trình cấp bằng CS, tôi đã nghiên cứu một ví dụ mở rộng về ngôn ngữ chuyển đăng ký xác định CPU. Tôi đã được truyền cảm hứng để thực hiện nó và viết một trình giả lập chấp nhận ký hiệu đó như một định nghĩa và xuất bản rằng trong Lập trình hệ thống nhúng (số tháng 3 năm 1989) như một cách để trả lời cùng loại câu hỏi mà bạn đã hỏi, cho phép mọi người xây dựng sự hiểu biết trực quan của họ về những điều như vậy.

Trong lớp, chúng tôi tiếp tục chắt lọc ký hiệu chuyển tiếp đó vào các cổng logic thực tế trên các thanh ghi! Nó tự viết: xem tất cả mọi thứ đã đăng ký 'A' là đích và mã A = (case1) hoặc (case2) ... và được biểu thị dưới dạng tổng hợp các sản phẩm hoặc sản phẩm tổng hợp.

Chỉ khi kết thúc khóa học, tôi mới biết rằng đây là CPU thực sự: PDP-8 nếu tôi nhớ lại chính xác.

Hôm nay bạn có thể đưa sơ đồ cổng vào một chip mảng logic có thể lập trình.

Đó là ý chính của nó: một thanh ghi được thiết lập với kết quả của các cổng AND và OR dẫn trở lại các thanh ghi khác. Một trong những giá trị cần bao gồm là giá trị opcode.

Hãy tưởng tượng: A: = (opcode == 17 & X + Y) | (opcode == 18 & X + Z) | ...

Các cpus hiện đại phức tạp hơn, với các đường ống và thanh cái, nhưng các tiểu đơn vị giống như một ALU duy nhất hoạt động theo cách đó.


2

Bạn đang xem xét CPU ở đây, nhưng có một thành phần khác liên quan khi chạy 'Hello World': màn hình!

Đối với CPU, một giá trị trong bộ nhớ chỉ là một số được biểu thị dưới dạng một số bit nhất định (0 và 1).

Làm thế nào nó biến thành chữ trên màn hình là một câu chuyện khác: màn hình cũng có bộ nhớ. Bộ nhớ này (bộ nhớ đồ họa) được ánh xạ tới 'pixel' trên màn hình. Mỗi pixel được mã hóa bằng một giá trị: nếu đó là màn hình đơn sắc rất cơ bản, giá trị chỉ là cường độ, đối với màn hình màu, giá trị là sự kết hợp của Red Green và Blue (RGB) có thể được mã hóa theo nhiều cách khác nhau.

Vì vậy, khi CPU 'ghi' một giá trị nhất định vào bộ nhớ hiển thị, các pixel sẽ sáng lên. Để thực sự viết thư, người ta cần làm sáng nhiều pixel. Thông thường, một máy tính sẽ có một bộ ký tự (thực tế là một số) được xác định trong hệ điều hành của nó. (thực hiện trừu tượng hóa các 'phông chữ', ánh xạ tới một định nghĩa về mỗi chữ cái sẽ trông như thế nào trên màn hình)

Vì vậy, khi mã được biên dịch, nó bao gồm tất cả các thứ xuất phát từ các thư viện hệ điều hành, bao gồm các bộ phông chữ / char này, v.v. cho phép CPU biết phải viết gì trong bộ nhớ đồ họa. (Nó khá phức tạp nhưng đó là ý tưởng chung: trình biên dịch bao gồm nhiều mã hơn so với những gì trong mã 'xin chào thế giới' của bạn, thông qua các thư viện đã nhập)

Cuối cùng, có rất nhiều điều xảy ra như bạn nghi ngờ, nhưng bạn không phải viết tất cả mã đó.


1

Đây là một cách tiếp cận chính thức cho câu hỏi của bạn từ lĩnh vực khoa học máy tính lý thuyết.

Về cơ bản, chúng ta có thể định nghĩa một ánh xạ giữa mô hình tính toán của CPU và máy xử lý. Có tồn tại bằng chứng lý thuyết rằng tập hợp tất cả các chương trình máy turing có thể tưởng tượng (và do đó tất cả các chương trình có thể tưởng tượng được thực thi trên CPU) là vô hạn. Điều này có nghĩa là chúng ta có thể xác định mọi chương trình có một số tự nhiên duy nhất, bao gồm cả chương trình sẽ mở rộng số tự nhiên cho các máy xử lý .

Như bạn đã biết rằng hầu hết mọi thứ CPU làm là tính toán trên các số tự nhiên trong biểu diễn nhị phân, bạn có thể lý do rằng CPU có thể thực hiện mọi chương trình có thể tưởng tượng được.

Lưu ý: Điều này được đơn giản hóa quá mức, nhưng, theo tôi, mang lại một trực giác tốt đẹp.


1

Những gì có thể giúp là để thay đổi suy nghĩ của bạn từ "làm số học." Nếu bạn thực sự cố gắng đào sâu vào những gì máy tính đang làm dưới mui xe để in "Hello World" thì tốt nhất bạn nên nghĩ thấp hơn một cấp. "Trạng thái" của máy tính có thể được mô tả như một tập hợp các bit, được lưu trữ bởi các công tắc bóng bán dẫn bật hoặc tắt (hoặc tụ điện được sạc hoặc không tích điện). Máy tính thao tác các bit đó theo quy tắc. Các cách máy tính được phép thao tác với các bit đó được ghi lên CPU dưới dạng bóng bán dẫn thực hiện công việc thay đổi bit từ 0 thành 1 hoặc 1 thành 0.

Khi ALU "thực hiện số học", điều đó thực sự có nghĩa là nó đã thay đổi trạng thái của máy tính theo cách phù hợp với quy tắc số học của chúng tôi. Tất cả nó đã làm là thay đổi một số bit. Đó là ý nghĩa đằng sau phần mềm giải thích lý do tại sao chúng ta nên nghĩ về nó như là phép cộng hoặc phép trừ. CPU không "biết" nó đang làm gì. Nó chỉ thay đổi từ trạng thái này sang trạng thái khác, và đó là tất cả (ít nhất là cho đến khi Skynet tiếp quản).

Khi bạn nghĩ về nó theo cách đó, các hướng dẫn phức tạp hơn như hướng dẫn "nhảy" không khác nhau. Tất cả những gì nó làm là thay đổi một số bit. Trong trường hợp này, nó thay đổi các bit mà chúng ta biết có nghĩa là vị trí của lệnh tiếp theo sẽ thực thi. CPU không "biết" điều này, nhưng chúng tôi làm. Vì vậy, chúng tôi sử dụng hướng dẫn thay đổi các bit đó để "nhảy" từ nơi này sang nơi khác trong mã của chúng tôi.

IO thực sự cũng không khác, nó chỉ thay đổi bit. Sự khác biệt nhỏ duy nhất là các bit đó được kết nối với bóng bán dẫn, điều này dẫn đến việc làm sáng các ký tự trên màn hình của bạn. Nếu tôi có thể quay trở lại vài thập kỷ trước khi "Hello World" thực sự đơn giản, có một không gian bộ nhớ trong đó, nếu bạn viết các bit tương ứng với các ký tự ASCII cho "Hello World", các ký tự đó sẽ được hiển thị trực tiếp cho màn. Ngày nay, nó phức tạp hơn một chút, bởi vì chúng ta có card đồ họa và hệ điều hành lộn xộn với nó, nhưng ý tưởng cơ bản là như nhau. Bạn có một bộ bóng bán dẫn được bật hoặc tắt, được liên kết với mạch để hiển thị một pixel trên màn hình. Chúng tôi đặt đúng cái và có vẻ như "Hello World" xuất hiện trên màn hình.

Sự nhầm lẫn chỉ đơn giản là một vấn đề của cú pháp so với ngữ nghĩa. Hành vi của "thêm một nửa" hoặc "thêm đầy đủ" trong ALU là cú pháp. Nó định nghĩa những bit nào sẽ xuất hiện khi bạn đặt bit vào. Ngữ nghĩa của nó là khái niệm về khả năng thực hiện phép cộng. Bạn và tôi biết rằng ALU có thể "thực hiện bổ sung", nhưng để thực sự hiểu những gì xảy ra bên dưới, bạn phải nhớ rằng ALU chỉ thao tác các bit và byte của cú pháp.


0

CPU hoạt động như thế này:

  • tìm nạp lệnh hiện tại, tăng con trỏ "lệnh hiện tại".

  • giải mã nó (ví dụ: tìm hiểu hướng dẫn này bảo CPU phải làm gì)

  • thực hiện nó (làm những gì hướng dẫn nói) - con trỏ lệnh hiện tại có thể được sửa đổi nếu lệnh đó giống như "bước nhảy".

  • Lặp lại mãi mãi

Các CPU hiện đại phức tạp hơn và cố gắng chồng chéo và thậm chí dự đoán các phần của quá trình đó (ví dụ: bắt đầu thực thi trong khi 10 lệnh khác đang giải mã trong khi CPU đang tìm nạp trước con trỏ "lệnh hiện tại" để giữ cho "đường ống" đầy đủ), nhưng quá trình thiết yếu là thực sự giống nhau.

Có nhiều loại hướng dẫn, một ví dụ về hầu hết chúng là:

  • Hướng dẫn "Di chuyển". Chúng có thể sao chép X sang X khác, trong đó X là bộ nhớ (RAM), thanh ghi hoặc địa chỉ trong không gian I / O nếu CPU hỗ trợ khái niệm như vậy.

  • Hướng dẫn thao tác ngăn xếp, bao gồm bật vào thanh ghi, đẩy thanh ghi trên ngăn xếp, v.v ... Đây là trường hợp đặc biệt của hướng dẫn "di chuyển" sử dụng và cập nhật thanh ghi "con trỏ ngăn xếp".

  • Các hướng dẫn thực hiện các phép toán, giữa hai thanh ghi hoặc bộ nhớ và một thanh ghi. Các hướng dẫn này tự động ảnh hưởng đến một thanh ghi cờ. Một cờ như vậy là cờ "không" được đặt nếu kết quả bằng 0, một cờ khác là cờ "âm" được đặt nếu bit quan trọng nhất của kết quả được đặt. Có thể có những người khác tùy thuộc vào CPU.

  • Một trường hợp đặc biệt của các phép toán là các hướng dẫn so sánh, giống như phép trừ, nhưng kết quả không được giữ lại. Cờ vẫn bị ảnh hưởng.

  • Có các hướng dẫn chi nhánh nhảy đến địa chỉ bộ nhớ NẾU cờ cụ thể được đặt. Ghi nhớ cờ "không" được đề cập ở trên? Nó cũng tăng gấp đôi là cờ "nếu bằng", vì vậy bạn thấy các hướng dẫn như BEQtrên nhiều CPU thực sự phân nhánh nếu cờ "không" được đặt.

  • Các hướng dẫn thực hiện các phép toán logic (AND, OR, NOT), bit shift và bit test. Chúng có thể ảnh hưởng đến các cờ như hướng dẫn toán học tùy thuộc vào CPU.

  • Hướng dẫn mà nhảy vô điều kiện.

  • Hướng dẫn nhảy và lưu địa chỉ trả về trên ngăn xếp ("cuộc gọi") và các hướng dẫn khác bật địa chỉ khỏi ngăn xếp ("trả lại").

  • Các hướng dẫn đặc biệt như các lệnh dừng CPU, xác định CPU hoặc gọi các trình xử lý ngắt.

  • "Không hoạt động" - hầu hết tất cả các CPU đều có lệnh "không hoạt động" chỉ tiêu tốn chu kỳ và di chuyển.

Đây thực sự chỉ là một ví dụ, có những CPU có ít loại hướng dẫn và CPU có nhiều hơn.

Vấn đề là để minh họa rằng có nhiều loại hướng dẫn bên cạnh các hướng dẫn toán học trong CPU. Tất cả mọi thứ trong một ngôn ngữ cấp cao hơn được chia thành các loại hoạt động ở trên và chỉ một số trong số đó sẽ là hướng dẫn toán học hoặc loại ALU.

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.