Linux sistem çağrı numaraları neden x86 ve x86_64'teki farklıdır?


35

Sistem çağrısı arabiriminin "genel" kodlara değil, mimariye / platforma bağlı olarak düşük düzeyde uygulandığını biliyorum.

Yine de, Linux’taki sistem çağrılarının neden 32-bit x86 çekirdeklerinin benzer mimaride aynı tutulmadığı sayılara sahip olduğunu açıkça göremiyorum Linux 64-bit x86_64? Bu kararın arkasındaki motivasyon / sebep nedir?

İlk tahminim, arka plandaki bir nedenin, 32 bit uygulamaları x86_64 sisteminde çalıştırılabilir halde tutmak olduğu, böylece sistem çağrı numarasına yapılan makul bir dengelemeyle sistemin kullanıcı alanının 32 bit veya 64 bit olduğunu bilmesiydi. sırasıyla. Ancak bu durum böyle değil. En azından bana x86_64'te sistem çağrı numarası 0 olan read () 'in bu düşünce ile aynı hizada olamayacağı görülüyor.

Bir başka tahmin de, sistem çağrı numaralarını değiştirmenin kendimi onaylayamadığım bir güvenlik / sertleşme geçmişine sahip olabileceği yönünde.

Mimariye bağlı kod bölümlerini uygulamanın zorluklarına karşı cahil olduğumdan, hala gerekmediğinde sistem çağrı numaralarının nasıl değiştirildiğini merak ediyorum (16-bitlik bir kayıt bile bile büyük ölçüde şu anda ~ çağrılar), uyumsuzluk dışında başka bir şey elde etmede yardımcı olur (sistem çağrılarını bir kütüphane aracılığıyla kullanmak, libc, hafifletir).


3
Bence yanlış soruyu soruyorsun. Doğru soru neden onları aynı tutuyor: Cevap uyumluluğu. Eğer x86 ve x86_64 uyumlu değilse, değişmelerini engelleyecek güçler yoktur. Şimdi son 20 yıldaki değişim isteyen tüm güçler, baskın çıkacak (onları değiştirme şansımız olacak). [Bunun sadece görüş olduğunu ve yeni sistemin tasarımcılarının iç aklına dayanmadığını not edin.]
ctrl-alt-delor

Yanıtlar:


34

Herhangi bir başka mimariye uymayan belirli numaralandırmanın ardındaki mantığa gelince [gerçekten x86_64 mimarisinin bir parçası olan "x32" hariç]: linux çekirdeğindeki x86_64 desteğinin ilk günlerinde, Ciddi geriye dönük uyumluluk kısıtlamaları, tüm sistem çağrıları , önbellek kullanım düzeyinde optimize edilmesi için yeniden numaralandırıldı .

Bunları seçimler için belirli bir temel bilmek çekirdek gelişimi hakkında yeterli bilgiye, ama görünüşe göre orada yok bazı varolan mimarlıktan Yeninumara bu özel sayılarla her şeyi yerine sadece listeyi kopyalama için seçim arkasındaki mantık ve kullanılmayan olanları kaldırın. Sipariş, ne kadar yaygın olarak adlandırıldığına bağlı olabilir gibi görünüyor - örneğin, okuma / yazma / açma / kapama ön tarafta. Çıkış ve çatal "temel" görünebilir, ancak her işlem için yalnızca bir kez çağrılır.

Aynı önbellek hattında yaygın olarak kullanılan sistem çağrılarını tutmakla ilgili bir şeyler de olabilir (bu değerler sadece tamsayılardır, ancak çekirdekte her biri için işlev işaretçilerine sahip bir tablo vardır, bu nedenle 8 sistem çağrısının her grubu işgal eder. bu tablo için 64 baytlık bir önbellek satırı)


1
fork may seem "fundamental", but [...] called only once per process.Ah ne? Anladığım kadarıyla bir kez çıkmak için bir çağrı bekleyebilirsiniz, ancak bir fork()çağrının ebeveyni ve çocuğu arasına çatal koyabilirsiniz
kedi

5
@ cat'in forkçocuk sürecine (örneğin süreç oluşturma çağrısı olarak bakın), yani üst işlem yerine hesaplandığını görürseniz, Random832'nin ifadesi doğrudur.
icarus

4
@Kat Tamam, çatal () ı iki ya da üç kez çağırabilirsiniz, belki birkaç tane daha. Ancak read () milyonlarca, hatta milyarlarca kez arayabilirsiniz.
Michael Hampton,

1
Evet, demek istediğim buydu. Çatal aramaların sayısı ve sistemin kullanım süresi boyunca işlem sayısı, vb klon [oluşturabilir yöntemi veya mesajları] init gibi bilgiler göz ardı ederek, özdeş olacak
Random832

15

Şu soruya verilen cevaba bakınız: "Sistem çağrı numaraları neden amd64 linux'da farklı?" Yığın Taşması.

Özetlemek gerekirse: uyumluluk uğruna, sistem çağrı listesi kararlıdır ve sadece büyüyebilir. X86 64 mimarisi göründüğünde, ABI (argüman geçişi, geri döndürülen değer) farklıydı, böylece çekirdek geliştiricileri uzun zamandır beklenen değişiklikleri getirme fırsatını yakaladı.


Güzel tahminim doğruydu.
ctrl-alt-delor

2
Bağlandığınız diğer cevap spekülatiftir: "Linux adamları büyük olasılıkla karar verdi ..." diyor (vurgu eklenmiş). Bence buradaki cevabınız kanıtlardan ziyade spekülasyona dayandığına dair bir belirti sağladıysa yardımcı olacağını düşünüyorum. Bu arada, bağlantılı cevap altında yayınlanan daha yakın tarihli bir yorum, asıl nedenin, genel olarak kedinin genel temizliğinin olmadığı (spekülatif cevaplar gibi) olmadığı, ancak burada diğer cevabın da açıklandığı gibi, özellikle "önbellek kullanımı" ile ilgili olduğuna dair kanıtlar sunmaktadır .
DW

-3

Kısacası, çünkü birileri " N+1bunu yapmanın zekice uyumsuz yollarının yollardan daha iyi olduğunu N" düşünüyordu. Tarihsel arşivlerde, sistem numaraları genellikle bazı eski patentli unix'lerle eşleşecek şekilde seçildi. Ancak x86_64 için çekirdek geliştiricileri, istedikleri numaralandırmayı seçmekte özgürdü. Basit bir seçim yapmak ve mevcut bir numaralandırmayı kullanmak yerine, yeni bir standart icat etmeyi seçtiler. Ardından aarch64 ve bir sürü insan için tekrar yaptılar. Bu, Linux çekirdeğinin geliştirilmesinde tekrarlanan bir kalıptır.


3
Değişiklik değersiz değildi . Sağlam teknik sebepler var. Geriye dönük uyumluluk gereklilikleri olmasaydı, mevcut mimarilere de benzer değişiklikler uygulanacaktı.
Jörg W Mittag

Numaralandırmadaki fark% 100 bedavadır. Belirli bir numaralandırmanın teknik bir avantajı yoktur.
R. ..

2
Gibi bu diğer cevap açıklıyor, sistem çağrıları sık birlikte kullanıldıklarında syscalls syscall tablosundaki aynı cacheline paylaşan şekilde gruplandırılır. Sistem çağrı numaraları , bu tablodaki basit indeksler olacak şekilde seçilir. Teorik olarak, sistem çağrısı tablosundaki sistem çağrısı konumunu sistem çağrısı sayısından ayırmak için bir dolaylı katman kullanabiliriz, ancak bu, sistem çağrısı sırasındaki sistem çağrısı satırlarından elde ettiğimiz performans kazanımlarının bir kısmını tüketir.
Jörg W Mittag

@ JörgWMittag: Ve tabii ki bu erken bir optimizasyon ve ölçülebilir bir gelişme değil. Sadece sistemlerin kaç devir sürdüğünü ve kaç önbellek hattını çıkardıklarına bakın. Tablonun sıralanmasından en iyi önbellek satırına kaydetmek fark yaratmayacak.
R. ..

2
@R .. "Numaralandırmayı, popüler DBMS ile tpcc çekirdek profilleme bilgileri işlevinde ve bazı ağ ve masaüstü uygulamalarında strace çıktısı işlevinde seçtim." Ölçümler gibi kesinlikle ses çıkarıyor. Bununla birlikte yazar hiçbir numara vermedi veya metodolojiyi yeterince açıkladı.
user45891
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.