Tại sao hệ thống x86-64 chỉ có không gian địa chỉ ảo 48 bit?


97

Trong một cuốn sách tôi đã đọc như sau:

Bộ xử lý 32 bit có 2 ^ 32 địa chỉ có thể, trong khi bộ xử lý 64 bit hiện tại có không gian địa chỉ 48 bit

Kỳ vọng của tôi là nếu đó là bộ xử lý 64-bit, không gian địa chỉ cũng phải là 2 ^ 64.

Vì vậy, tôi đã tự hỏi lý do cho hạn chế này là gì?


11
Cuốn sách chắc hẳn đã nói cụ thể về việc triển khai hiện tại của kiến ​​trúc AMD64 (x86-64). Chỉ 48 bit bậc thấp được sử dụng. Tuy nhiên, đây không phải là giới hạn phần cứng - tất cả 64 bit đều có sẵn.
Cody Grey

7
Luôn luôn là một ý tưởng tốt để xác định cuốn sách.
Henk Holterman

1
Tôi đoán rằng các dòng địa chỉ vật lý không miễn phí (bạn cần ít nhất 16 chân cpu bổ sung). Và tôi không biết bất kỳ phần cứng nào có thể lấp đầy khoảng trống 48 bit với chip RAM vật lý trên cùng một bộ xử lý. Khi điều này trở nên khả thi, tôi chắc chắn rằng AMD sẽ thêm mất tích 16 chân :)
Torp

7
thậm chí, The 32-bit processors have 2^32 possible addresseskhông nhất thiết phải đúng, có thể tồn tại cpu 32bit chỉ có 24 "chân" để định địa chỉ bộ nhớ. Ví dụ: 68EC020 (phiên bản 68020 rẻ hơn) là một cpu 32 bit nhưng có 24 bit để định địa chỉ bộ nhớ.
ShinTakezou,

21
Có một vấn đề rất thực tế với địa chỉ vật lý 64-bit, kích thước trang bộ nhớ ảo quá nhỏ. Điều này làm cho các thư mục trang khổng lồ và bộ nhớ cache TLB cực kỳ đắt tiền tuôn ra trên mọi chuyển đổi ngữ cảnh. Chuyển từ trang 4KB sang 4MB là một tùy chọn nhưng rất không tương thích với các hệ điều hành hiện tại.
Hans Passant

Câu trả lời:


134

Vì đó là tất cả những gì cần thiết. 48 bit cung cấp cho bạn không gian địa chỉ 256 terabyte. Đó là rất nhiều. Bạn sẽ không sớm thấy một hệ thống cần nhiều hơn thế.

Vì vậy, các nhà sản xuất CPU đã đi đường tắt. Chúng sử dụng một tập lệnh cho phép không gian địa chỉ 64 bit đầy đủ, nhưng các CPU hiện tại chỉ sử dụng 48 bit thấp hơn. Giải pháp thay thế đã lãng phí các bóng bán dẫn vào việc xử lý một không gian địa chỉ lớn hơn mà sẽ không cần thiết trong nhiều năm.

Vì vậy, một khi chúng ta gần đến giới hạn 48 bit, vấn đề chỉ là giải phóng các CPU xử lý không gian địa chỉ đầy đủ, nhưng nó sẽ không yêu cầu bất kỳ thay đổi nào đối với tập lệnh và sẽ không phá vỡ khả năng tương thích.


118
640kb là đủ cho bất kỳ ai.

7
Bạn vẫn đang chạy một hệ thống 8088, bdares?
Joe,

23
@bdares: Tương tự tệ. Tập lệnh của 8088/8086 Arch có giới hạn 640k được tích hợp trong nó. Chỉ có ISA mới (386) mới có thể phá vỡ rào cản. Mặt khác, x86_64 hỗ trợ tất cả 64 bit trong ISA. Nó chỉ là phần cứng hiện tại thế hệ mà không thể tận dụng tất cả chúng ...
R .. GitHub DỪNG GIÚP ICE

16
@R. Trên thực tế, giới hạn trong CPU là một megabyte. Máy tính IBM đã chỉ định một phần của phần đó cho các thiết bị ngoại vi được ánh xạ bộ nhớ, BIOS, v.v. Một số thiết kế 8088/8086 khác (Zenith Z100, nếu bộ nhớ phục vụ) được chỉ định ít hơn cho các thiết bị ngoại vi và tương tự, tương ứng nhiều hơn cho các chương trình ứng dụng.
Jerry Coffin lúc

25
lwn.net/SubscriberLink/655437/9a48cd3e7a8cbe8a <- ba năm sau câu trả lời này, chúng tôi đã đạt đến những giới hạn này :) Máy HP sẽ có bộ nhớ 320TB và họ không thể cung cấp nó dưới dạng không gian địa chỉ phẳng vì 48 giới hạn địa chỉ-bit.
agam

18

Bất kỳ câu trả lời nào đề cập đến kích thước bus và bộ nhớ vật lý đều hơi nhầm lẫn, vì câu hỏi của OP là về không gian địa chỉ ảo chứ không phải không gian địa chỉ vật lý . Ví dụ, giới hạn được cho là tương tự trên một số 386 là giới hạn về bộ nhớ vật lý mà chúng có thể sử dụng, không phải không gian địa chỉ ảo, luôn là 32 bit đầy đủ. Về nguyên tắc, bạn có thể sử dụng đầy đủ 64 bit không gian địa chỉ ảo ngay cả khi chỉ có vài MB bộ nhớ vật lý; tất nhiên bạn có thể làm như vậy bằng cách hoán đổi hoặc cho các tác vụ chuyên biệt mà bạn muốn ánh xạ cùng một trang ở hầu hết các địa chỉ (ví dụ: một số hoạt động dữ liệu thưa thớt nhất định).

Tôi nghĩ câu trả lời thực sự là AMD chỉ đang rẻ tiền và hy vọng bây giờ không ai quan tâm, nhưng tôi không có tài liệu tham khảo để trích dẫn.


14
"Rẻ tiền" Tôi đoán ý bạn là không thêm các chân cắm sẽ không bao giờ được sử dụng, không chiếm không gian chip cho các bóng bán dẫn sẽ không được sử dụng và sử dụng không gian giải phóng để thực hiện các lệnh hiện có nhanh hơn? Nếu đó là giá rẻ, tôi tham gia!
Olof Forshell

80386 cho phép 2 * 4096 bộ chọn, mỗi bộ chứa lên đến 4GB bộ nhớ (tổng 32TB). 80286 cho phép 2 * 4096 bộ chọn, mỗi bộ chứa lên đến 64KB (1GB).
Olof Forshell

Các hack được phân đoạn phi tuyến tính không được tính là không gian địa chỉ trong sách của tôi. Không có cách nào để phần mềm di động có thể sử dụng chúng.
R .. GitHub DỪNG TRỢ GIÚP NGAY LẬP TỨC

@R .. - Tôi nghĩ định nghĩa của phần mềm di động là nó có thể . :-) Ví dụ: C ++ cấm so sánh các con trỏ thành các mảng khác nhau để chúng có thể nằm trong các phân đoạn 4GB riêng biệt.
Bo Persson,

Nếu trình biên dịch của bạn thực sự tạo ra các con trỏ khổng lồ và tải một thanh ghi phân đoạn cho mỗi tham chiếu bộ nhớ thì có. Nhưng trên thực tế, điều đó chậm kinh khủng, và thay vào đó mọi người đều sử dụng các mô hình bộ nhớ nhỏ và __far(hoặc tệ hơn là FAR/ far!) Con trỏ ...
R .. GitHub DỪNG TRỢ GIÚP ICE

10

Đọc phần giới hạn của bài viết wikipedia :

Một PC không thể chứa 4 petabyte bộ nhớ (do kích thước của chip nhớ hiện tại nếu không có gì khác) nhưng AMD đã hình dung ra các máy chủ lớn, các cụm bộ nhớ chia sẻ và các cách sử dụng khác của không gian địa chỉ vật lý có thể tiếp cận điều này trong tương lai gần và 52 địa chỉ vật lý bit cung cấp không gian rộng rãi để mở rộng trong khi không phải chịu chi phí triển khai địa chỉ vật lý 64 bit

Đó là, không có ích gì khi triển khai địa chỉ 64 bit đầy đủ vào thời điểm này, bởi vì chúng tôi không thể xây dựng một hệ thống có thể sử dụng đầy đủ không gian địa chỉ như vậy - vì vậy chúng tôi chọn thứ gì đó thiết thực cho các hệ thống ngày nay (và tương lai).


4 đến từ đâu trong 4 petabyte? Nếu chúng ta đang nói về 64 dòng địa chỉ, chúng ta sẽ kết thúc với hình vuông của không gian địa chỉ được tạo ra bởi 32 dòng địa chỉ, tương đương 4 gigabyte. Hình vuông đó và chúng ta nên có 16, không phải 4 petabyte. Tui bỏ lỡ điều gì vậy?
Olof Forshell

1
Nó xuất phát từ giới hạn vật lý hiện tại (52 bit) - điểm mà chúng ta không thể đặt đủ RAM trong PC để hỗ trợ phạm vi giới hạn này, chưa nói đến những gì sẽ cần thiết cho không gian địa chỉ 64 bit đầy đủ.
Damien_The_Un Believer

9

Chiều rộng hoạt động / thanh ghi gốc bên trong không cần phải được phản ánh trong chiều rộng bus địa chỉ bên ngoài.

Giả sử bạn có bộ xử lý 64 bit chỉ cần truy cập 1 megabyte RAM. Một bus địa chỉ 20 bit là tất cả những gì được yêu cầu. Tại sao phải bận tâm đến chi phí và độ phức tạp phần cứng của tất cả các chân phụ mà bạn sẽ không sử dụng?

Motorola 68000 là như thế này; 32 bit bên trong, nhưng với một bus địa chỉ 23 bit (và một bus dữ liệu 16 bit). CPU có thể truy cập 16 megabyte RAM và để tải kiểu dữ liệu gốc (32 bit) cần hai lần truy cập bộ nhớ (mỗi lần mang 16 bit dữ liệu).


1
nhưng 68000 được coi là cpu "16/32 bit", không phải cpu 32 bit "đầy đủ" nên người ta có thể nói nó vẫn có chân trong quá khứ 16bit; Tôi đã chọn 68020 làm ví dụ, vì phiên bản 68EC020 giá rẻ của nó chỉ có 24 bit cho các địa chỉ, mặc dù 68020 là một cpu 32 bit "đầy đủ" ... +1 được coi là dòng vi xử lý tuyệt vời này!
ShinTakezou,

@ShinTakezou: thành thật mà nói, 80386SX là CPU 16 bit (vì nó có không gian địa chỉ giống như 80286) hay là 32 bit (vì nó có kiến ​​trúc bên trong của 80386DX)? Một người có thể nói như bạn làm nhưng một người khác (cái này) nói "nội bộ là thứ quan trọng" - và bạn có thể trích dẫn tôi về điều đó.
Olof Forshell,

@Olof Tôi nghĩ rằng, trong bối cảnh của "bộ nhớ" (là thế giới bên ngoài), bên ngoài là những gì đếm, vì vậy 68000 là một CPU 16 bit (cần 2 "bước" để đọc dữ liệu 32 bit): D
ShinTakezou

@ShinTakezou: ngữ cảnh bộ nhớ, thậm chí cả bộ nhớ đệm, luôn nằm ngoài chính cpu mặc dù chúng được kết hợp cực kỳ chặt chẽ trong các bộ xử lý hiện đại. Về mặt nội bộ, 8088 ngang bằng với 8086 mặc dù nó có tám đường bus dữ liệu so với 16 của 8086. Tôi không thấy những gì bạn thấy rõ ràng là 8088 nên được phân loại cùng nhóm với Z80, 8080, 8085, v.v. Câu hỏi về chiều rộng của bus dữ liệu có vẻ nhỏ trong bối cảnh đó
Olof Forshell

Tôi không phải là một chuyên gia về những vấn đề như vậy, vì vậy tôi không có gì rõ ràng đối với tôi. Tôi chỉ muốn nhận thấy sự cần thiết phải cắt giảm sắc nét hơn với quá khứ, nơi mà người ta có thể nghĩ rằng 68000 vẫn là một bộ xử lý "thời xưa", vì vậy rằng nó có vẻ "tự nhiên" khi không gian địa chỉ của nó bị giới hạn dưới 32 bit; trong khi 68020 có thể 32 bit, do đó sự tồn tại của 68EC020 với giới hạn của nó cho thấy rõ ràng rằng đó là một lựa chọn không phải do "giới hạn của điều đó ( hoặc điều này) thời gian "nhưng để xem xét khác (như làm cho nó rẻ hơn nếu không có lợi thế thực sự trong việc có 64 chân), đó ít nhiều là lập luận của câu trả lời này.
ShinTakezou

7

Có một lý do nghiêm trọng hơn là chỉ tiết kiệm bóng bán dẫn trong đường dẫn địa chỉ CPU: nếu bạn tăng kích thước của không gian địa chỉ, bạn cần tăng kích thước trang, tăng kích thước bảng trang hoặc có cấu trúc bảng trang sâu hơn (điều đó là nhiều cấp hơn của bảng dịch). Tất cả những điều này làm tăng chi phí bỏ lỡ TLB, làm ảnh hưởng đến hiệu suất.


1
Intel đang đề xuất một sơ đồ phân trang 5 cấp để mở rộng từ 48 bit hiện tại lên 57 bit. (Giống 9 bit mỗi cấp / 4k trang như bảng trang x86-64 hiện tại). Việc sử dụng 10 hoặc 11 bit cho mỗi cấp sẽ yêu cầu thay đổi phần cứng page-walk, vì vậy đây có thể không phải là thiết kế tối ưu cho bộ nhớ lớn, nhưng đó là một phần mở rộng hợp lý cho một CPU hai chế độ cũng cần hỗ trợ hiệu suất tối đa cho 4 bảng cấp ở định dạng hiện tại.
Peter Cordes

Tất nhiên, với 2 triệu hoặc 1G trang khổng lồ, chỉ có 4 hoặc 3 cấp độ của bảng trang từ cấp cao nhất đến mục nhập bảng trang lớn thay vì con trỏ thư mục trang.
Peter Cordes

6

Theo quan điểm của tôi, đây là kết quả từ kích thước trang. Mỗi trang tối đa chứa 4096/8 = 512 mục của bảng trang. Và 2 ^ 9 = 512. Vậy 9 * 4 + 12 = 48.


4

Để trả lời câu hỏi ban đầu: Không cần thêm nhiều hơn 48 Bit PA.

Máy chủ cần dung lượng bộ nhớ tối đa, vì vậy chúng ta hãy cố gắng tìm hiểu sâu hơn.

1) Cấu hình máy chủ lớn nhất (thường được sử dụng) là hệ thống 8 Socket. Một hệ thống 8S không là gì ngoài 8 CPU của Máy chủ được kết nối với nhau bằng một kết nối liên kết nhất quán tốc độ cao (hay đơn giản là một "bus" tốc độ cao) để tạo thành một nút duy nhất. Có những cụm lớn hơn ở đó nhưng chúng rất ít và ở giữa chúng, chúng ta đang nói về các cấu hình thường được sử dụng ở đây. Lưu ý rằng trong cách sử dụng thực tế, hệ thống 2 Socket là một trong những máy chủ được sử dụng phổ biến nhất và 8S thường được coi là rất cao cấp.

2) Các loại bộ nhớ chính được máy chủ sử dụng là bộ nhớ DRAM thông thường có thể định địa chỉ byte (ví dụ: bộ nhớ DDR3 / DDR4), Bộ nhớ được ánh xạ IO - MMIO (chẳng hạn như bộ nhớ được sử dụng bởi thẻ bổ trợ), cũng như Không gian cấu hình được sử dụng để cấu hình các thiết bị có trong hệ thống. Loại bộ nhớ đầu tiên là loại bộ nhớ thường lớn nhất (và do đó cần số lượng bit địa chỉ lớn nhất). Một số máy chủ cao cấp sử dụng một lượng lớn MMIO cũng tùy thuộc vào cấu hình thực tế của hệ thống.

3) Giả sử mỗi CPU máy chủ có thể chứa 16 DDR4 DIMM trong mỗi khe. Với kích thước tối đa DDR4 DIMM là 256GB. (Tùy thuộc vào phiên bản máy chủ, số lượng DIMM có thể có trên mỗi ổ cắm thực tế ít hơn 16 DIMM, nhưng hãy tiếp tục đọc vì lợi ích của ví dụ).

Vì vậy, mỗi socket về mặt lý thuyết có thể có 16 * 256GB = 4096GB = 4 TB. Đối với hệ thống 8S ví dụ của chúng tôi, kích thước DRAM có thể tối đa là 4 * 8 = 32 TB. Điều này có nghĩa là số bit tối đa cần thiết để giải quyết không gian DRAM này là 45 (= log2 32TB / log2 2).

Chúng tôi sẽ không đi vào chi tiết các loại bộ nhớ khác (MMIO, MMCFG, v.v.), nhưng vấn đề ở đây là loại bộ nhớ "đòi hỏi cao" nhất đối với hệ thống 8 Socket với các loại DIMM DDR4 lớn nhất hiện nay (256 GB DIMM) chỉ sử dụng 45 bit.

Đối với hệ điều hành hỗ trợ 48 bit (WS16 chẳng hạn), có (48-45 =) 3 bit còn lại. Điều đó có nghĩa là nếu chúng tôi chỉ sử dụng 45 bit thấp hơn cho 32TB DRAM, chúng tôi vẫn có 2 ^ 3 lần bộ nhớ địa chỉ có thể được sử dụng cho MMIO / MMCFG với tổng số 256 TB không gian địa chỉ.

Vì vậy, tóm lại: 1) 48 bit Địa chỉ vật lý là rất nhiều bit để hỗ trợ các hệ thống lớn nhất hiện nay được "tải đầy đủ" với lượng lớn DDR4 và nhiều thiết bị IO khác yêu cầu không gian MMIO. Chính xác là 256TB.

Lưu ý rằng không gian địa chỉ 256TB này (= 48bits địa chỉ vật lý) KHÔNG bao gồm bất kỳ ổ đĩa nào như ổ SATA vì chúng KHÔNG phải là một phần của bản đồ địa chỉ, chúng chỉ bao gồm bộ nhớ có thể định địa chỉ byte và được hiển thị với Hệ điều hành.

2) Phần cứng CPU có thể chọn triển khai 46, 48 hoặc> 48 bit tùy thuộc vào thế hệ máy chủ. Nhưng một yếu tố quan trọng khác là hệ điều hành nhận dạng được bao nhiêu bit. Ngày nay, WS16 hỗ trợ địa chỉ Vật lý 48 bit (= 256 TB).

Điều này có ý nghĩa gì đối với người dùng, mặc dù một máy chủ có CPU lớn, cực kỳ hiện đại có thể hỗ trợ> 48 bit địa chỉ, nếu bạn chạy một hệ điều hành chỉ hỗ trợ 48 bit PA, thì bạn chỉ có thể tận dụng 256 TB. .

3) Nhìn chung, có hai yếu tố chính để tận dụng số lượng bit địa chỉ cao hơn (= dung lượng bộ nhớ nhiều hơn).

a) CPU HW của bạn hỗ trợ bao nhiêu bit? (Điều này có thể được xác định bằng lệnh CPUID trong CPU Intel).

b) Bạn đang chạy phiên bản hệ điều hành nào và có bao nhiêu bit PA mà nó nhận ra / hỗ trợ.

Tối thiểu của (a, b) cuối cùng sẽ xác định lượng không gian có thể địa chỉ mà hệ thống của bạn có thể tận dụng.

Tôi đã viết câu trả lời này mà không xem xét chi tiết các câu trả lời khác. Ngoài ra, tôi chưa đi sâu vào chi tiết các sắc thái của MMIO, MMCFG và toàn bộ việc xây dựng bản đồ địa chỉ. Nhưng tôi hy vọng điều này sẽ giúp ích.

Cảm ơn, Anand K Enamandram, Kiến trúc sư nền tảng máy chủ Intel Corporation


Câu hỏi này hỏi về kích thước không gian địa chỉ ảo 48 bit (yêu cầu địa chỉ ảo phải chuẩn). Bạn muốn nhiều bit ảo hơn bit vật lý, do đó, nhân nửa cao có thể ánh xạ tất cả bộ nhớ vật lý vào một không gian địa chỉ duy nhất (đó là không gian riêng hoặc không gian người dùng). Như bạn nói, HW chỉ cần triển khai tối đa số bit PA mà bộ điều khiển DRAM + MMIO có thể sử dụng và có thể sử dụng bất kỳ số nào lên đến giới hạn 52 bit ở định dạng bảng trang x86-64. ( Tại sao ở 64 bit, địa chỉ ảo lại ngắn 4 bit (dài 48 bit) so với địa chỉ vật lý (dài 52 bit)? )
Peter Cordes

1
Định dạng bảng trang 4 cấp cũng áp đặt giới hạn VA 48 bit, cho đến khi HW + SW hỗ trợ bảng trang PML5 cho VA 57 bit. Dù sao, đây là một câu trả lời hữu ích, nhưng nó dường như được đăng dưới câu hỏi sai. Tôi không chắc liệu có nơi nào tốt hơn cho nó hay không, vì vậy tôi đoán chúng ta có thể để nó ở đây, hy vọng với một chỉnh sửa để thêm tiêu đề để nói điều gì đó về PA so với VA.
Peter Cordes

2

Nhiều người có quan niệm sai lầm này. Nhưng tôi hứa với bạn nếu bạn đọc kỹ điều này, sau khi đọc xong mọi quan niệm sai lầm của bạn sẽ được sáng tỏ.

Để nói rằng một bộ xử lý 32 bit hoặc 64 bit không có nghĩa là nó phải có bus địa chỉ 32 bit hoặc bus địa chỉ 64 bit tương ứng! ... Tôi lặp lại điều đó KHÔNG ĐƯỢC !!

Bộ xử lý 32 bit có nghĩa là nó có ALU 32 bit (Đơn vị số học và logic) ... có nghĩa là nó có thể hoạt động trên toán hạng nhị phân 32 bit (hay nói đơn giản là một số nhị phân có 32 chữ số) và tương tự bộ xử lý 64 bit có thể hoạt động trên hệ nhị phân 64 bit toán hạng. Vì vậy, thời tiết một bộ xử lý 32 bit hoặc 64 bit KHÔNG biểu thị lượng bộ nhớ tối đa có thể được cài đặt. Chúng chỉ cho biết toán hạng có thể lớn đến mức nào ... (để tương tự, bạn có thể nghĩ về một máy tính 10 chữ số có thể tính toán kết quả lên đến 10 chữ số ... nó không thể cho chúng ta 11 chữ số hoặc bất kỳ kết quả nào lớn hơn ... mặc dù nó là trong số thập phân nhưng tôi đang nói với sự tương tự này cho đơn giản) ... nhưng những gì bạn đang nói là không gian địa chỉ là kích thước tối đa có thể giao tiếp trực tiếp của bộ nhớ (RAM). RAM ' Kích thước tối đa có thể của s được xác định bởi kích thước của bus địa chỉ và nó không phải là kích thước của bus dữ liệu hoặc thậm chí ALU mà kích thước của bộ xử lý được xác định (32/64 bit). Có nếu bộ xử lý có "Bus địa chỉ" 32 bit thì nó có thể định địa chỉ 2 ^ 32 byte = 4GB RAM (hoặc đối với 64 bit, nó sẽ là 2 ^ 64) ... nhưng nói bộ xử lý 32 bit hoặc 64 bit thì có không có gì liên quan đến không gian địa chỉ này (không gian địa chỉ = khoảng cách nó có thể truy cập vào bộ nhớ hoặc kích thước tối đa của RAM) và nó chỉ phụ thuộc vào kích thước của ALU của nó. Tất nhiên bus dữ liệu và bus địa chỉ có thể có cùng kích thước và khi đó có vẻ như bộ xử lý 32 bit có nghĩa là nó sẽ truy cập bộ nhớ 2 ^ 32 byte hoặc 4 GB ... nhưng đó chỉ là sự trùng hợp và nó sẽ không giống nhau cho tất cả.... ví dụ intel 8086 là một bộ xử lý 16 bit (vì nó có ALU 16 bit) vì vậy như bạn nói nó phải truy cập đến 2 ^ 16 byte = 64 KB bộ nhớ nhưng nó không đúng. Nó có thể truy cập tối đa 1 MB bộ nhớ vì có bus địa chỉ 20 bit .... Bạn có thể google nếu bạn còn nghi ngờ :)

Tôi nghĩ rằng tôi đã nói rõ quan điểm của mình. Bây giờ đến với câu hỏi của bạn ... vì bộ xử lý 64 bit không có nghĩa là nó phải có bus địa chỉ 64 bit nên không có gì sai khi có bus địa chỉ 48 bit trong bộ xử lý 64 bit ... họ đã giữ không gian địa chỉ nhỏ hơn để làm cho việc thiết kế và chế tạo rẻ hơn .... vì sẽ không ai sử dụng bộ nhớ lớn như vậy (2 ^ 64 byte) ... trong đó ngày nay 2 ^ 48 byte là quá đủ.


Tôi nghĩ bạn đã nói rất rõ ràng quan điểm của mình, có một điều tôi không hiểu trong những gì bạn đã nói về CPU 8086 16 bit: làm thế nào mà một CPU 16 bit có thể xử lý địa chỉ 20 bit? Nó có xử lý nó thông qua một hoạt động 2 bước không? Ngay cả khi bus địa chỉ có chiều rộng 20 bit, một khi nó đến CPU, chiều rộng thanh ghi rõ ràng có thể chỉ chiếm 16 bit ... Họ làm điều đó như thế nào?
lập trình viên vào

2
Hmm ... hoạt động 2 bước. Thanh ghi phân đoạn chỉ chứa 16 bit trên. Sau đó, nó được nhân với 10H để tạo thành 20 bit và sau đó phần bù được thêm vào.
hafiz031

1

Không đúng khi chỉ 48 bit bậc thấp của 64 bit VA được sử dụng, ít nhất là với Intel 64. 16 bit trên được sử dụng, đại loại như vậy.

Phần 3.3.7.1 Định địa chỉ chuẩn trong Sách hướng dẫn dành cho nhà phát triển phần mềm kiến ​​trúc Intel® 64 và IA-32 cho biết:

một địa chỉ chuẩn phải có các bit từ 63 đến 48 được đặt thành số không hoặc số một (tùy thuộc vào việc bit 47 là số 0 hay số một)

Vì vậy, các bit 47 đến 63 tạo thành một siêu bit, tất cả là 1 hoặc tất cả 0. Nếu một địa chỉ không ở dạng chuẩn, thì việc triển khai sẽ bị lỗi.

Trên AArch64, điều này là khác nhau. Theo Tổng quan về Bộ hướng dẫn ARMv8 , đó là VA 49 bit.

Hệ thống dịch bộ nhớ AArch64 hỗ trợ địa chỉ ảo 49 bit (48 bit cho mỗi bảng dịch). Địa chỉ ảo được mở rộng ký hiệu từ 49 bit và được lưu trữ trong một con trỏ 64 bit. Theo tùy chọn, dưới sự kiểm soát của một thanh ghi hệ thống, 8 bit quan trọng nhất của con trỏ 64 bit có thể giữ một “thẻ” sẽ bị bỏ qua khi được sử dụng làm địa chỉ tải / cửa hàng hoặc mục tiêu của một nhánh gián tiếp


1
Chỉ 48 thấp hơn là đáng kể, nhưng phần cứng kiểm tra xem nó có được mở rộng ký hiệu chính xác đến 64 bit hay không. IDK tại sao họ không chỉ định phần mở rộng bằng không; có thể họ muốn thuận tiện hơn khi kiểm tra địa chỉ nửa cao so với nửa thấp (bằng cách chỉ kiểm tra bit dấu). Hoặc có thể để tránh làm cho ranh giới 2 ^ 48 trở nên đặc biệt và do đó các địa chỉ gần đầu có thể phù hợp một cách thuận tiện trong các hằng số mở rộng dấu hiệu 32 bit. Tôi nghĩ sau này có nhiều khả năng hơn.
Peter Cordes

Dù sao, việc kiểm tra HW hiện tại cho chuẩn ngăn phần mềm sử dụng các bit bị bỏ qua cho các con trỏ được gắn thẻ sẽ bị hỏng trên HW trong tương lai, vì vậy, đó là một phần của cơ chế giúp bạn có thể mở rộng phần cứng trong tương lai nếu / khi cần. (Mà có thể là sớm hơn họ mong đợi, nhờ vào bộ nhớ non-volatile được nối trực tiếp vào không gian địa chỉ vật lý và ảo.)
Peter Cordes

procfs trên Linux trên Core i5 của tôi nói rằng nó được ánh xạ tới 7ffd5ea41000-7ffd5ea62000. Phạm vi địa chỉ này có ý nghĩa theo quy tắc 'chuẩn' ở trên. Bit 48-63 là 0 làm cho nó trở thành một địa chỉ chuẩn chính xác. Điều hơi lạ là một số địa chỉ trong nguồn Linux. Trong include / asm / pgtable_64_types, nó cho biết #define __VMALLOC_BASE _AC (0xff92000000000000, UL). Đây KHÔNG phải là một địa chỉ chuẩn. Một địa chỉ như vậy sẽ bắt đầu bằng 0xffff8. Dunno tại sao.
Olsonist

Vâng, IIRC Linux sử dụng nửa thấp của phạm vi chuẩn cho không gian người dùng và (chủ yếu) sử dụng nửa cao cho ánh xạ chỉ nhân. Nhưng một số bộ nhớ nhân được xuất sang không gian người dùng, như [vsyscall]trang. (Đó có thể là xuất nội dung như PID hiện tại để đó getpid()hoàn toàn là không gian người dùng. Ngoài ra, gettimeofday()có thể chỉ cần sử dụng rdtsc trong không gian người dùng + các yếu tố tỷ lệ được xuất bởi nhân. Mặc dù tôi nghĩ rằng một số trong số [vdso]đó nằm ở gần đầu nửa dưới.)
Peter Cordes

IDK làm gì __VMALLOC_BASE. Có lẽ nó không được sử dụng trực tiếp.
Peter Cordes

0

Một CPU được coi là "N-bit" chủ yếu dựa trên kích thước bus dữ liệu và phần lớn các thực thể của nó (kiến trúc bên trong) : Thanh ghi, Bộ tích lũy, Bộ số học-lôgic (ALU), Bộ lệnh, v.v. Ví dụ: CPU Motorola 6800 (hoặc Intel 8050) cũ tốt là CPU 8 bit. Nó có bus dữ liệu 8 bit, kiến ​​trúc bên trong 8 bit và bus địa chỉ 16 bit.


  • Mặc dù CPU N-bit có thể có một số thực thể khác với kích thước N. Ví dụ, các impovments trong 6809 so với 6800 (cả hai đều là CPU 8 bit với bus dữ liệu 8 bit). Trong số những cải tiến đáng kể được giới thiệu trong 6809 là việc sử dụng hai bộ tích lũy 8 bit (A và B, có thể được kết hợp thành một thanh ghi 16 bit duy nhất, D), hai thanh ghi chỉ mục 16 bit (X, Y) và hai Con trỏ ngăn xếp 16 bit.

Đã có câu trả lời cho vấn đề này với Motorola 68000/68020 làm ví dụ. Câu hỏi này thực sự là về x86-64 cụ thể, không phải CPU 8/16-bit cũ. Trong trường hợp của x86-64, một trong những yếu tố chính là các địa chỉ ảo rộng hơn sẽ cần một bảng trang sâu hơn và yếu tố đó không tồn tại đối với các chip cũ mà bạn đang nói đến.
Peter Cordes

chiều rộng bus dữ liệu không phải khớp với chiều rộng thanh ghi hoặc ALU. Ví dụ: Pentium P5 có bus dữ liệu 64 bit (tải / lưu trữ 64 bit được căn chỉnh được đảm bảo là nguyên tử), nhưng thanh ghi / ALU chỉ có 32 bit (ngoại trừ FPU tích hợp và trong Pentium MMX sau này là SIMD ALUs.)
Peter Cordes

OP viết: "Kỳ vọng của tôi là nếu đó là bộ xử lý 64-bit, không gian địa chỉ cũng phải là 2 ^ 64." ........ Bạn viết: "Câu hỏi này thực sự là về x86-64 cụ thể, không phải CPU 8/16-bit cũ". ........ Tôi nghĩ bạn đã bỏ lỡ bản chất của câu hỏi OP. Câu hỏi OP là kết quả của giả định sai rằng CPU 64-bit phải có bus địa chỉ 64-bit. Về ALU, tôi đã viết một phần lớn về các thực thể của nó; Không phải tất cả chúng.
Amit G.

Ngừng gửi thư rác cho tôi bằng cách đăng lại bình luận này. Đúng, tất nhiên OP sai vì lý do bạn mô tả, nhưng tôi đã chỉ ra rằng câu trả lời của bạn có vẻ như nó mắc lỗi tương tự. Bạn nói " và do đó một phần lớn của nó là các thực thể: Thanh ghi và Bộ tích lũy, Số học-Logic-Đơn vị (ALU) ... ", có vẻ như bạn đang nói rằng những thứ đó khớp với chiều rộng bus dữ liệu. Cụm từ "một phần lớn" ngụ ý rằng bạn đang nói những phần nào, không phải là đôi khi nó chỉ đúng với những phần đó.
Peter Cordes
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.