Sổ đăng ký “FS” / “GS” nhằm mục đích gì?


102

Vì vậy, tôi biết những gì các thanh ghi sau và công dụng của chúng được cho là:

  • CS = Phân đoạn mã (được sử dụng cho IP)

  • DS = Phân đoạn dữ liệu (được sử dụng cho MOV)

  • ES = Phân đoạn đích (được sử dụng cho MOVS, v.v.)

  • SS = Phân đoạn ngăn xếp (được sử dụng cho SP)

Nhưng những thanh ghi sau đây được sử dụng để làm gì?

  • FS = "Phân đoạn tệp"?

  • GS = ???

Lưu ý: Tôi không hỏi về bất kỳ hệ điều hành cụ thể nào - tôi đang hỏi về những gì chúng được dự định sử dụng cho CPU, nếu có.


24
Theo như tôi biết, F và G trong hai cái này không đại diện cho bất cứ điều gì. Chỉ là có chỗ trên CPU (và trong tập lệnh) cho sáu thanh ghi phân đoạn do người dùng chỉ định và ai đó nhận thấy rằng bên cạnh phân đoạn "S", các chữ cái "C" và "D" (mã và dữ liệu) theo thứ tự, vì vậy "E" là phân đoạn "bổ sung", sau đó "F" và "G" chỉ sắp xếp theo sau.

3
Có thể là, thật khó để biết điều gì đang xảy ra trong đầu người khác trừ khi bạn ở đó vào thời điểm đó (và tôi đang ở bờ bên kia, không ở đâu gần đội thiết kế của Intel).

20
Chỉ cần nghĩ đến việc chúng tôi có thể có bao nhiêu niềm vui với đăng ký BS: -}
Ira Baxter

5
Tôi luôn sử dụng GS là "Phân đoạn đồ họa". :-)
Brian Knoblauch

2
Làm thế nào về "G" egment "S"?
SS Anne

Câu trả lời:


109

Đó là mục đích của chúng và chúng được sử dụng cho Windows và Linux.

Mục đích ban đầu đằng sau các thanh ghi phân đoạn là cho phép một chương trình truy cập vào nhiều phân đoạn bộ nhớ (lớn) khác nhau được dự định là độc lập và là một phần của một kho lưu trữ ảo liên tục. Ý tưởng này được lấy từ hệ điều hành Multics năm 1966, hệ điều hành này coi các tệp tin chỉ là các đoạn bộ nhớ có thể định địa chỉ. Không có BS "Mở tệp, ghi bản ghi, đóng tệp", chỉ "Lưu giá trị này vào phân đoạn dữ liệu ảo đó" với xả trang bẩn.

Hệ điều hành năm 2010 hiện tại của chúng tôi là một bước thụt lùi khổng lồ, đó là lý do tại sao chúng được gọi là "Eunuchs". Bạn chỉ có thể giải quyết vấn đề của bạn phân khúc duy nhất không gian quá trình của, đưa ra một cái gọi là "phẳng (IMHO ngu si đần độn) không gian địa chỉ". Đăng ký phân khúc trên máy x86-32 vẫn có thể được sử dụng cho đăng ký phân khúc thực, nhưng không ai bận tâm (Andy Grove, cựu chủ tịch Intel, đã có một cuộc đấu trí khá nổi tiếng vào thế kỷ trước khi ông tìm ra sau tất cả những gì mà các kỹ sư Intel đã dành năng lượng và tiền của anh ấy để triển khai tính năng này, mà không ai sẽ sử dụng nó. Đi đi, Andy!)

AMD khi đi đến 64 bit đã quyết định rằng họ không quan tâm nếu họ loại bỏ Multics như một sự lựa chọn (đó là cách giải thích từ thiện; điều không thể xác nhận là họ không biết gì về Multics) và do đó, vô hiệu hóa khả năng chung của thanh ghi phân đoạn ở chế độ 64 bit. Vẫn cần các luồng truy cập vào cửa hàng cục bộ của luồng và mỗi luồng cần một con trỏ ... ở đâu đó trong trạng thái luồng có thể truy cập ngay lập tức (ví dụ: trong các thanh ghi) ... để luồng cục bộ lưu trữ. Vì Windows và Linux đều sử dụng FS và GS (cảm ơn Nick đã làm rõ) cho mục đích này trong phiên bản 32 bit, AMD quyết định để các thanh ghi phân đoạn 64 bit (GS và FS) về cơ bản chỉ được sử dụng cho mục đích này (tôi nghĩ bạn có thể làm cho chúng trỏ đến bất kỳ đâu trong không gian quy trình của bạn; không biết mã ứng dụng có thể tải chúng hay không).

IMHO sẽ đẹp hơn về mặt kiến ​​trúc nếu làm cho bản đồ bộ nhớ của mỗi luồng có một địa chỉ ảo tuyệt đối (ví dụ: 0-FFF nói) là bộ lưu trữ cục bộ của luồng (không cần con trỏ thanh ghi [phân đoạn]!); Tôi đã làm điều này trong một hệ điều hành 8 bit vào những năm 1970 và nó cực kỳ tiện dụng, giống như có một đống thanh ghi lớn khác để làm việc.

Vì vậy, các đăng ký phân đoạn bây giờ giống như phụ lục của bạn. Chúng phục vụ mục đích khám nghiệm. Tổn thất chung của chúng ta.

Những người không biết lịch sử sẽ không lặp lại nó; họ phải làm một cái gì đó ngu ngốc.


10
@supercat: Một sơ đồ đơn giản hơn, tuyệt vời hơn sẽ cho phép chúng giải quyết được dung lượng lưu trữ gấp 65536 lần, sẽ là coi các thanh ghi phân đoạn là phần mở rộng đầy đủ 16 bit trên của 16 bit dưới, về bản chất là 286, 386 và Multics đã làm.
Ira Baxter

3
@IraBaxter: Vấn đề với cách tiếp cận đó là các phân đoạn kiểu 80286 có chi phí đủ cao hơn là một kết quả cuối cùng phải lưu trữ nhiều đối tượng trong mỗi phân đoạn và do đó lưu trữ cả phân đoạn và bù đắp trên mọi con trỏ. Ngược lại, nếu một người sẵn sàng làm tròn phân bổ bộ nhớ lên đến bội số của 16 byte, phân đoạn kiểu 8086 cho phép người ta sử dụng một mình phân đoạn làm phương tiện xác định một đối tượng. Việc làm tròn phân bổ lên đến 16 byte có thể hơi khó chịu vào năm 1980, nhưng sẽ đại diện cho một chiến thắng ngày nay nếu nó giảm kích thước của mỗi tham chiếu đối tượng từ 8 byte xuống còn bốn.
supercat

3
Các thanh ghi đó được sử dụng trong các hệ điều hành hiện đại. Chúng chủ yếu dành để chỉ thông tin về các khối điều khiển tác vụ, ít nhất là trong hai hệ điều hành chính hiện có sẵn cho chip x86. Và, vì chúng không còn là "mục đích chung" ngay cả với mục đích ban đầu của chúng, nên bạn không thể sử dụng chúng cho nhiều mục đích. Tốt hơn nên giả vờ trên các hệ thống x86-64 rằng chúng chỉ đơn giản là không tồn tại cho đến khi bạn cần thông tin mà chúng cho phép bạn truy cập trong các khối điều khiển luồng.
Ira Baxter

5
Sự tương tự của phụ lục thực sự tồi tệ dựa trên khoa học lỗi thời; nó liên quan đến hệ thống miễn dịch, vì vậy chắc chắn không phải là "tiền đình". Nó làm mất đi bài đăng thực tế. Ngoài ra, đó là một phản ứng tốt.
code_dredd

5
Cảm ơn vì cách xử lý thú vị, không có rào cản giữa bộ nhớ phân đoạn và bộ nhớ phẳng :) Cũng đã viết mã trên 6809 (có và không có bộ nhớ phân trang), 6502, z80, 68k và 80 [123]? 86, quan điểm của tôi là phân đoạn memory là một chương trình kinh dị và tôi rất vui vì nó đã được đưa vào thùng rác của lịch sử. Việc sử dụng FS và GS để truy cập hiệu quả dữ liệu thread_local là một hệ quả không mong muốn của một lỗi lịch sử.
Richard Hodges

44

Các thanh ghi FSGSlà các thanh ghi phân đoạn. Chúng không có mục đích do bộ xử lý xác định, mà thay vào đó là mục đích của hệ điều hành đang chạy chúng. Trong Windows 64-bit, GSthanh ghi được sử dụng để trỏ đến cấu trúc do hệ điều hành xác định. FSGSthường được sử dụng bởi nhân hệ điều hành để truy cập bộ nhớ dành riêng cho luồng. Trong windows, thanh GSghi được sử dụng để quản lý bộ nhớ dành riêng cho luồng. Nhân linux sử dụng GSđể truy cập bộ nhớ dành riêng cho cpu.


1
Chúng có ý định được sử dụng cho các mục đích do hệ điều hành xác định hay để tạo điều kiện cho mã cần thực hiện một điều gì đó tương tự như *dest++ = lookup[*src++];vậy sẽ khá khó xử nếu đích, tra cứu và src ở ba vị trí không liên quan.
supercat

8
Trên Windows FS thực sự là để lưu trữ chuỗi cụ thể. Xem bản đồ tài liệu của khối được FS chỉ ra tại đây en.wikipedia.org/wiki/Win32_Thread_Information_Block
Nedko

2
Nó không chỉ trên Windows. GS cũng được sử dụng cho TLS trên OS X. GS cũng được sử dụng bởi các hạt nhân 64bit để theo dõi cấu trúc hệ thống trong quá trình chuyển mạch ngữ cảnh. Hệ điều hành sẽ sử dụng SWAPGS để có hiệu lực đó.
ET

11

FS được sử dụng để trỏ đến khối thông tin luồng (TIB) trên các quy trình của windows.

một ví dụ điển hình là ( SEH ) lưu trữ một con trỏ đến một hàm gọi lại trong FS:[0x00].

GS thường được sử dụng như một con trỏ đến bộ lưu trữ cục bộ luồng (TLS). và một ví dụ mà bạn có thể đã thấy trước đây là tính năng bảo vệ ngăn xếp chim hoàng yến (stackguard), trong gcc, bạn có thể thấy một cái gì đó như sau:

mov    eax,gs:0x14
mov    DWORD PTR [ebp-0xc],eax

2
Điều này không thực sự trả lời câu hỏi. Câu hỏi nêu rõ Lưu ý: Tôi không hỏi về bất kỳ hệ điều hành cụ thể nào - Tôi đang hỏi về những gì chúng được dự định sử dụng cho CPU, nếu có.
Michael Petch 25/09/18

9
@MichaelPetch ya tôi biết tôi chỉ muốn thêm này như thông tin tốt cho những người đọc q này / s trong SO
zerocool

2

Theo Hướng dẫn sử dụng của Intel, ở chế độ 64-bit, các thanh ghi này được dùng làm thanh ghi cơ sở bổ sung trong một số tính toán địa chỉ tuyến tính. Tôi đã lấy nó từ phần 3.7.4.1 (trang 86 trong bộ 4 tập). Thông thường khi CPU ở chế độ này, địa chỉ tuyến tính giống với địa chỉ hiệu dụng, vì phân đoạn thường không được sử dụng trong chế độ này.

Vì vậy, trong không gian địa chỉ phẳng này, FS & GS đóng vai trò xử lý không chỉ dữ liệu cục bộ mà còn cả một số cấu trúc dữ liệu hệ điều hành nhất định (trang 2793, mục 3.2.4) do đó các thanh ghi này được dự định sử dụng bởi hệ điều hành, tuy nhiên những nhà thiết kế cụ thể mục đích.

Có một số thủ thuật thú vị khi sử dụng ghi đè ở cả hai chế độ 32 và 64-bit nhưng điều này liên quan đến phần mềm đặc quyền.

Từ quan điểm của "ý định ban đầu", điều đó thật khó nói ngoài việc chúng chỉ là những thanh ghi phụ. Khi CPU ở chế độ địa chỉ thực , điều này giống như bộ xử lý đang chạy với tốc độ cao 8086 và các thanh ghi này phải được một chương trình truy cập rõ ràng. Vì lợi ích của mô phỏng 8086 thực sự, bạn sẽ chạy CPU ở chế độ 8086 ảo và các thanh ghi này sẽ không được sử dụng.


2

TL; DR;

Sổ đăng ký “FS” / “GS” nhằm mục đích gì?

Đơn giản chỉ để truy cập dữ liệu ngoài phân đoạn dữ liệu mặc định (DS). Chính xác như ES.


Đọc lâu:

Vì vậy, tôi biết những gì các thanh ghi sau và công dụng của chúng được cho là:

[...]

Vâng, gần như nhưng DS không phải là 'một số' Phân đoạn dữ liệu, mà là Phân đoạn mặc định. Tất cả hoạt động đều diễn ra theo mặc định (* 1). Đây là tất cả các biến mặc định được định vị - về cơ bản databss. Theo một cách nào đó, đó là một phần lý do tại sao mã x86 khá nhỏ gọn. Tất cả dữ liệu thiết yếu, là những gì thường được truy cập nhất, (cộng với mã và ngăn xếp) đều nằm trong khoảng cách viết nhanh 16 bit.

ES được sử dụng để truy cập mọi thứ khác (* 2), mọi thứ ngoài 64 KiB của DS. Giống như văn bản của trình xử lý văn bản, các ô của bảng tính hoặc dữ liệu hình ảnh của chương trình đồ họa, v.v. Không giống như thường được giả định, dữ liệu này không được truy cập nhiều, vì vậy việc cần tiền tố sẽ ít gây tổn hại hơn so với việc sử dụng các trường địa chỉ dài hơn.

Tương tự, đó chỉ là một khó chịu nhỏ mà DS và ES có thể phải được tải (và tải lại) khi thực hiện các hoạt động chuỗi - điều này ít nhất được bù đắp bởi một trong những bộ lệnh xử lý ký tự tốt nhất vào thời điểm đó.

Điều thực sự khó khăn là khi dữ liệu người dùng vượt quá 64 KiB và các hoạt động phải được bắt đầu. Trong khi một số thao tác được thực hiện đơn giản trên một mục dữ liệu tại một thời điểm (nghĩ A=A*2), hầu hết yêu cầu hai ( A=A*B) hoặc ba mục dữ liệu ( A=B*C). Nếu các mục này nằm trong các phân đoạn khác nhau, ES sẽ được tải lại nhiều lần mỗi lần hoạt động, thêm một số chi phí.

Ban đầu, với các chương trình nhỏ từ thế giới 8 bit (* 3) và các tập dữ liệu nhỏ như nhau, đó không phải là vấn đề lớn, nhưng nó nhanh chóng trở thành một cổ chai hiệu suất lớn - và hơn thế nữa là một nỗi đau thực sự đối với lập trình viên (và trình biên dịch). Với 386 Intel cuối cùng giao cứu trợ bằng cách thêm hai đoạn, vì vậy bất kỳ loạt unary , nhị phân hoặc ternary hoạt động, với các yếu tố lây lan ra trong bộ nhớ, có thể xảy ra mà không tải lại ES tất cả các thời gian.

Đối với lập trình (ít nhất là trong lắp ráp) và thiết kế trình biên dịch, đây là một lợi ích khá lớn. Tất nhiên, có thể có nhiều hơn nữa, nhưng với ba cổ chai về cơ bản đã biến mất, vì vậy không cần phải lạm dụng nó.

Đặt tên khôn ngoan, các chữ cái F / G chỉ đơn giản là các chữ cái liên tục sau E. Ít nhất là từ quan điểm thiết kế CPU, không có gì liên quan.


* 1 - Việc sử dụng ES cho đích chuỗi là một ngoại lệ, vì chỉ cần hai thanh ghi phân đoạn là cần thiết. Nếu không có chúng sẽ không hữu ích nhiều - hoặc luôn cần tiền tố phân đoạn. Điều này có thể giết chết một trong những tính năng đáng ngạc nhiên, việc sử dụng các lệnh chuỗi (không lặp lại) dẫn đến hiệu suất cực cao do mã hóa byte đơn của chúng.

* 2 - Vì vậy, trong nhận thức muộn màng, "Mọi thứ khác Phân đoạn" sẽ là một cách đặt tên tốt hơn so với "Phân đoạn bổ sung".

* 3 - Điều quan trọng cần lưu ý là 8086 chỉ được dùng như một thước đo khoảng cách dừng cho đến khi 8800 được hoàn thiện và chủ yếu dành cho thế giới nhúng để giữ chân 8080/85 khách hàng.


1
Wow, cảm ơn bạn đã giải thích tất cả điều này! Điều này giải thích rất nhiều và rất có ý nghĩa! +1
dùng541686
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.