Tại sao các số gọi hệ thống Linux trong x86 và x86_64 khác nhau?


35

Tôi biết rằng giao diện cuộc gọi hệ thống được triển khai ở mức độ thấp và do đó phụ thuộc vào kiến ​​trúc / nền tảng, chứ không phải mã "chung".

Tuy nhiên, tôi không thể thấy rõ lý do tại sao các cuộc gọi hệ thống trong hạt nhân Linux 32 bit x86 có các số không được giữ giống nhau trong kiến ​​trúc tương tự Linux 64 bit x86_64? Động lực / lý do đằng sau quyết định này là gì?

Dự đoán đầu tiên của tôi là một lý do nền tảng là để giữ cho các ứng dụng 32 bit có thể chạy được trên hệ thống x86_64, do đó thông qua phần bù hợp lý cho số cuộc gọi hệ thống, hệ thống sẽ biết rằng không gian người dùng là 32 bit hoặc 64 bit tương ứng. Tuy nhiên, đây không phải là tình huống. Ít nhất đối với tôi, đọc () là số gọi hệ thống 0 trong x86_64 không thể phù hợp với suy nghĩ này.

Một dự đoán khác là việc thay đổi số cuộc gọi hệ thống có thể có nền tảng bảo mật / cứng, điều mà tôi không thể tự xác nhận.

Không biết gì về các thách thức khi triển khai các phần mã phụ thuộc vào kiến ​​trúc, tôi vẫn tự hỏi làm thế nào để thay đổi số cuộc gọi hệ thống , khi dường như không cần (vì ngay cả một thanh ghi 16 bit sẽ lưu trữ nhiều hơn số ~ 346 hiện tại để thể hiện tất cả các cuộc gọi), sẽ giúp đạt được bất cứ điều gì, ngoài khả năng tương thích (mặc dù sử dụng các cuộc gọi hệ thống thông qua thư viện, libc, giảm nhẹ nó).


3
Tôi nghĩ rằng bạn đang hỏi sai câu hỏi. Câu hỏi đúng là tại sao giữ cho chúng giống nhau: Trả lời tương thích. Vì vậy, nếu x86 và x86_64 không tương thích, thì không có lực nào ngăn chúng thay đổi. Bây giờ tất cả các lực lượng từ 20 năm qua muốn thay đổi, sẽ chiếm ưu thế (chúng ta có cơ hội để thay đổi chúng). [Lưu ý đây chỉ là ý kiến ​​và không dựa trên suy nghĩ bên trong của các nhà thiết kế hệ thống mới.]
ctrl-alt-delor

Câu trả lời:


34

Về lý do đằng sau việc đánh số cụ thể, không khớp với bất kỳ kiến ​​trúc nào khác [ngoại trừ "x32", đây thực sự chỉ là một phần của kiến ​​trúc x86_64]: Trong những ngày đầu hỗ trợ x86_64 trong nhân linux, trước khi có bất kỳ kiến ​​trúc nào các hạn chế tương thích ngược nghiêm trọng, tất cả các cuộc gọi hệ thống đã được đánh số lại để tối ưu hóa nó ở mức độ sử dụng bộ đệm .

Tôi không biết đủ về phát triển kernel để biết cơ sở cụ thể cho các lựa chọn này, nhưng rõ ràng có một số logic đằng sau sự lựa chọn để đánh số lại mọi thứ với những con số cụ thể này thay vì chỉ sao chép danh sách từ một kiến ​​trúc hiện có và loại bỏ những kiến ​​trúc không sử dụng. Có vẻ như thứ tự có thể được dựa trên mức độ phổ biến của chúng được gọi - ví dụ đọc / ghi / mở / đóng ở phía trước. Lối ra và ngã ba có vẻ "cơ bản", nhưng mỗi cái chỉ được gọi một lần cho mỗi quy trình.

Cũng có thể có điều gì đó xảy ra về việc giữ các cuộc gọi hệ thống thường được sử dụng cùng nhau trong cùng một dòng bộ đệm (các giá trị này chỉ là số nguyên, nhưng có một bảng trong nhân với các con trỏ hàm cho mỗi một, vì vậy mỗi nhóm 8 lệnh gọi hệ thống chiếm một dòng bộ đệm 64 byte cho bảng đó)


1
fork may seem "fundamental", but [...] called only once per process.À, cái gì? Tôi hiểu rằng bạn có thể sẽ gọi thoát một lần, nhưng bạn có thể rẽ vào bên trong cha mẹ và con của một fork()cuộc gọi
mèo

5
@cat nếu bạn xem forknhư được hạch toán cho quy trình con (tức là xem nó như cuộc gọi tạo quy trình), chứ không phải là quy trình cha thì câu lệnh của Random832 là chính xác.
icarus

4
@cat OK, bạn có thể gọi fork () hai hoặc ba lần, có thể một vài lần nữa. Nhưng bạn có thể gọi read () hàng triệu hoặc thậm chí hàng tỷ lần.
Michael Hampton

1
Vâng, đó là những gì tôi muốn nói. Số lượng cuộc gọi rẽ nhánh và số lượng quá trình trong suốt vòng đời của hệ thống sẽ giống hệt nhau, bỏ qua các chi tiết như init, clone [có thể tạo quy trình hoặc luồng], v.v.
Random832

15

Xem câu trả lời cho câu hỏi "Tại sao các số gọi hệ thống khác nhau trong amd64 linux?" trên Stack Overflow.

Tóm lại: vì mục đích tương thích, danh sách cuộc gọi hệ thống ổn định và chỉ có thể phát triển. Khi kiến ​​trúc x86 64 xuất hiện, ABI (đối số truyền, giá trị trả về) khác nhau, do đó, các nhà phát triển kernel đã có cơ hội mang đến những thay đổi đã được chờ đợi từ lâu.


Tuyệt vời đoán của tôi là chính xác.
ctrl-alt-delor

2
Câu trả lời khác mà bạn liên kết đến là suy đoán: nó nói rằng "những người Linux rất có thể đã quyết định ..." (nhấn mạnh thêm). Tôi nghĩ rằng nó sẽ có ích nếu câu trả lời của bạn ở đây cung cấp một số dấu hiệu cho thấy nó rõ ràng dựa trên suy đoán chứ không phải bằng chứng. Ngẫu nhiên, một bình luận gần đây được đăng dưới câu trả lời được liên kết cung cấp bằng chứng cho thấy lý do thực sự không phải là việc dọn dẹp chung chung (như câu trả lời đó suy đoán), mà cụ thể là về "sử dụng bộ nhớ cache", như được giải thích trong câu trả lời khác ở đây .
DW

-3

Nói tóm lại, bởi vì ai đó nghĩ rằng " N+1những cách làm không tương thích một cách vô cớ thì tốt hơn Nnhững cách". Đối với các vòm lịch sử, các số tòa nhà thường được chọn để phù hợp với một số unix độc quyền kế thừa. Nhưng đối với x86_64, các nhà phát triển kernel có thể tự do chọn bất kỳ cách đánh số nào họ thích. Thay vì đưa ra lựa chọn đơn giản và sử dụng lại cách đánh số hiện có, họ đã lựa chọn phát minh ra một tiêu chuẩn mới. Sau đó, họ đã làm điều đó một lần nữa cho aarch64 và một loạt những người khác. Đây là một mẫu lặp đi lặp lại trong phát triển nhân Linux.


3
Sự thay đổi không phải là vô cớ. Có những lý do kỹ thuật vững chắc. Nếu nó không dành cho các yêu cầu tương thích ngược, thì những thay đổi tương tự cũng sẽ được áp dụng cho các kiến ​​trúc hiện có.
Jörg W Mittag

Sự khác biệt trong đánh số là 100% vô cớ. Không có lợi thế kỹ thuật cho bất kỳ đánh số cụ thể.
R ..

2
Như câu trả lời khác này giải thích, các tòa nhà chọc trời được nhóm lại sao cho các tòa nhà thường được sử dụng cùng nhau chia sẻ cùng một dòng thời gian trong bảng tòa nhà. Và các số tòa nhà được chọn sao cho chúng là các chỉ số đơn giản vào bảng đó. Về mặt lý thuyết, chúng ta có thể sử dụng một lớp gián tiếp để tách rời vị trí của một tòa nhà cao tầng trong bảng tòa nhà từ số tòa nhà, nhưng điều đó có thể sẽ ăn một phần lợi ích hiệu suất mà chúng ta có được từ việc đặt các tòa nhà nóng trong cùng một đường dẫn.
Jörg W Mittag

@ JörgWMittag: Và đó rõ ràng là tối ưu hóa sớm và không phải là một cải tiến có thể đo lường được. Chỉ cần nhìn vào bao nhiêu tòa nhà chọc trời mất và bao nhiêu dòng bộ nhớ cache mà họ đuổi. Lưu tối đa một dòng bộ đệm từ thứ tự của bảng sẽ không tạo ra sự khác biệt.
R ..

2
@R .. "Tôi đã chọn cách đánh số trong chức năng của thông tin lược tả kernel tpcc với DBMS phổ biến và đầu ra strace của một số ứng dụng mạng và máy tính để bàn." chắc chắn âm thanh như có số đo. Tuy nhiên, tác giả không cung cấp số liệu hoặc giải thích thỏa đáng về phương pháp luận.
dùng45891
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.