Pertanyaan Bagaimana OSX menjalankan Binari 64 bit saat menjalankan pada 32bit Kernel?


Saya baru-baru ini tahu bahwa Mac OS X sebenarnya DAPAT menjalankan aplikasi 64bit (x64) bahkan jika kernel x86 dimuat. Itu mengejutkan bagi saya untuk pertama kalinya.

Tapi kemudian saya menyadari bahwa itu benar-benar aneh jika sistem dan berjalan di bawah x64 kompatibel CPU tidak dapat menjalankan aplikasi x64, tidak peduli apa kernel yang mengelola proses. Apakah itu sangat sulit? Hanya memuat aplikasi sialan ke dalam memori dan mengatur penunjuk operasi CPU ke byte pertama, mudah sekali!

Satu-satunya penghalang untuk melakukan itu, seperti yang saya bayangkan, adalah semacam "header yang bisa dieksekusi". Sayangnya, saya sangat tidak nyaman dengan arsitektur Windows dan struktur biner, jadi saya perlu penjelasan lebih lanjut di sini.

De facto UNIX-like OS biner header standar ELF memiliki itu saudara ELF64, yang (sebagai dokumen sini menjelaskan) tidak memiliki banyak perbedaan dengan ELF32, tetapi meskipun 32bit kernel tidak dapat menjalankan kode x64. Ya, program ini mungkin terkait dengan pustaka x64 dan mari kita bayangkan kita hanya menyalin dan menempelnya langsung di folder / usr / lib64. Tapi saya cukup yakin itu tidak membantu, mengapa?

Dan akhirnya, apa yang istimewa tentang kernel Mac OS X sehingga tidak khawatir tentang set instruksi program yang digunakan? Apakah Mac OS X memiliki beberapa universal dan cocok untuk kedua header executables kernels, sehingga hanya dapat memuat aplikasi ke dalam memori dan berkata kepada CPU "mengeksekusi benar dari sini, saya tidak keberatan apa yang berdiri untuk itu"?

P.S .: Saya benar-benar berpikir banyak tentang di mana menempatkan pertanyaan ini: di stackoverflow.com atau superuser.com, dan memutuskan untuk ditempatkan di sini, karena topiknya kemungkinan lebih banyak hal khusus OS.


4
2017-09-27 20:08


asal


Apa yang membuat Anda berpikir OSX akan menjalankan biner 64-bit saat berjalan pada kernel Darwin 32-bit? Apa yang Anda lihat? - James T Snell
Karena saya cukup yakin bahwa saya menjalankan kernel x64 maka satu-satunya perangkat lunak yang saya instal adalah x64 dan OS menjalankannya dengan sangat baik. Namun beberapa waktu yang lalu saya mengetik 'uname -a' di Terminal saya dan terkejut. Juga, Wikipedia menegaskan ini - en.wikipedia.org/wiki/X86-64#Mac_OS_X - pechenie
Wikipedia dan Anda berdua mungkin salah. Menjalankan OS 64-bit tidak berarti semua binari Anda 32bit. Itu berarti kernel dan arsitektur perangkat keras Anda dapat mendukung binari 64 bit. Apa yang Anda lakukan uname -a kembali? - James T Snell
Juga, saya tidak mengerti judul pertanyaan Anda. Bisakah Anda mengucapkannya kembali? - James T Snell
Ini bukan kesalahan, Anda dapat mencobanya jika Anda bisa. Saya menjalankan kernel x86, bukan x64, jadi masih bisa menjalankan perangkat lunak x64. Saya sudah beralih ke arsitektur x64_86 sekarang, tetapi output dari uname -a di bawah kernel x86 kemungkinan adalah sesuatu seperti itu: Darwin MacMini.local 11.1.0 Darwin Kernel Version 11.1.0: Tue Jul 26 16:07:11 PDT 2011; root:xnu-1699.22.81~1/RELEASE_i386 i386 - pechenie


Jawaban:


Pertanyaan sebenarnya adalah mengapa beberapa sistem operasi lain tidak dapat menjalankan biner 64-bit pada kernel 32-bit. Tidak ada alasan mendasar mengapa itu tidak mungkin. Arsitektur prosesor yang mendasari mendukung baik set instruksi 64-bit (amd64 alias x86-64) dan set instruksi 32-bit (i386), dan tidak ada pembatasan pada dua yang digunakan bersama-sama (khususnya, tidak ada "Mode 64-bit" yang terpisah dari "mode 32-bit"; ada satu mode panjang, yang memungkinkan instruksi dari kedua set i386 dan "native" amd64).

Menjalankan aplikasi 64-bit pada kernel 32-bit memang membutuhkan sedikit lebih banyak pekerjaan di dalam kernel, karena ia harus mengelola pointer 64-bit ke ruang pengguna bersama dengan pointer 32-bit ke ruang kernel. Sebagian besar jika tidak semua pointer berjalan di kernel dikenal sebagai ruang kernel atau dikenal sebagai ruang pengguna, jadi tidak masalah jika ukurannya berbeda. Kesulitan utama adalah di atas kemungkinan memiliki tipe pointer universal yang memiliki rentang nilai terpisah untuk memori proses, memori kernel dan memori yang digunakan oleh berbagai bagian perangkat keras (termasuk RAM), tetapi ini tidak mungkin dalam kernel 32-bit terbaru pada perangkat keras kelas PC pula (jika Anda memiliki RAM 4GB atau lebih, atau ingin memetakan RAM 2GB ditambah 2GB ruang proses ditambah memori kernel dan lebih banyak lagi, Anda harus dapat memetakan lebih dari 32 bit alamat tetap ).

Menurut Artikel Wikipedia yang Anda kutip, OSX memiliki kemampuan untuk menjalankan proses amd64 pada prosesor amd64 sebelum ia memiliki kernel 64-bit. Solaris juga acuh tak acuh mencampur executable i386 dan amd64 pada prosesor amd64, terlepas dari apakah kernel 32-bit atau 64-bit (keduanya tersedia).

Sistem operasi lain dapat menjalankan proses i386 pada kernel (64-bit) amd64, tetapi tidak proses amd64 pada kernel 32-bit, misalnya Linux, FreeBSD, NetBSD dan Windows. Namun sistem operasi lain memperlakukan amd64 dan i386 sebagai arsitektur yang benar-benar berbeda, misalnya OpenBSD.


2
2017-09-27 21:59



Penunjuk AIUI tidak menjadi masalah di OS X karena mereka tidak lulus antara kernel dan userspace. Bahkan dengan proses 32-bit berjalan di bawah kernel 32-bit, proses dapat memiliki hingga 4GB ruang memori virtual didefinisikan, dan kernel juga dapat memiliki hingga 4GB, dan keduanya tidak tumpang tindih. Jika Anda melewati pointer dari userspace ke kernel, itu akan menjadi tidak berarti karena ada sesuatu yang sama sekali berbeda pada alamat dalam ruang kernel. - Gordon Davisson
Jika Anda melihat kode sumber Anda dapat melihat bagaimana hal itu dilakukan. Pada OS X 32-bit, kernel tidak dipetakan ke dalam ruang alamat pengguna sehingga keduanya memiliki ruang alamat 32-bit yang terpisah sepenuhnya. Data apa pun yang dilewatkan akan disalin atau dipetakan ulang. Hukumannya adalah cache TLB. - russbishop
pertanyaannya adalah bagaimana CPU dapat menyimpan konteks saat mode 32-bit tidak dapat mengakses top 64-bit serta 8 register tinggi? - phuclv
@ LưuVĩnhPhúc Anda membutuhkan sedikit kode 64-bit, hanya untuk menyimpan dan mengembalikan register. Sejauh yang saya tahu itu mungkin pada x86-64 (dan begitulah cara Solaris melakukannya). Ini memang akan menjadi masalah di lengan di mana Anda tidak dapat mencampur instruksi 64-bit dan 32-bit tanpa perubahan hak istimewa. - Gilles


Saya tidak cukup familiar dengan arsitektur x86_64 untuk memberikan rinciannya, tetapi pada dasarnya yang terjadi adalah bahwa CPU dialihkan antara mode 64-bit dan kompatibilitas (32-bit) sebagai bagian dari sakelar konteks antara kernel dan sebuah userspace program. Ini cukup banyak hal yang sama yang akan dilakukan untuk menjalankan program 32-bit di bawah kernel 64-bit, hanya terjadi secara terbalik.

BTW, OS X tidak menggunakan format binari ELF, ia menggunakan Jantan binari. Format Mach-O memungkinkan multiarsitektur ("universal") binari, sehingga program (dan dalam hal ini kernel) dapat diberikan dalam 32- dan 64-bit (dan PPC dan PPC64 dan ...), dan OS dapat pilih versi mana yang akan dimuat (dan karenanya mode mana untuk menjalankannya) pada waktu buka. Anda dapat menggunakan file perintah pada biner untuk melihat format apa (s) itu di. Sebagai contoh, inilah aplikasi Catur dikirimkan dengan OS X v10.5:

$ file Applications/Chess.app/Contents/MacOS/Chess 
Applications/Chess.app/Contents/MacOS/Chess: Mach-O universal binary with 4 architectures
Applications/Chess.app/Contents/MacOS/Chess (for architecture ppc): Mach-O executable ppc
Applications/Chess.app/Contents/MacOS/Chess (for architecture ppc64):   Mach-O 64-bit executable ppc64
Applications/Chess.app/Contents/MacOS/Chess (for architecture i386):    Mach-O executable i386
Applications/Chess.app/Contents/MacOS/Chess (for architecture x86_64):  Mach-O 64-bit executable x86_64

Dan sebuah catatan bagi mereka yang meragukan bahwa ini mungkin: OS X mendukung program 64-bit yang dimulai pada v10.4 (dengan dukungan API terbatas), tetapi tidak menyertakan kernel 64-bit sampai v10.6 (dan bahkan kemudian, kernel berjalan dalam mode 32-bit secara default pada kebanyakan model). Lihat Panduan transisi 64-bit Apple untuk detailnya. Saya posting ini dari MacBook Pro menjalankan 10.6 dengan kernel 32-bit (64-bit tidak didukung untuk model khusus ini), tetapi menurut Activity Monitor hanya proses tidak berjalan dalam mode 64-bit adalah kernel_task.


4
2017-09-27 21:54





Dukungan Mac menjalankan aplikasi 64-bit di atas kernel 32-bit karena rencana multi-tahap untuk melakukan hal itu:

  1. Aplikasi Mac dikirimkan sebagai "biner gemuk" dalam "bundel" yang memungkinkan keempat combo 64/32-bit dan Intel / PPC untuk menjadi bagian dari satu pemasangan, yang dapat sesederhana satu drag-and-drop. OS menjalankan yang sesuai.
  2. Mac menggunakan PAE untuk mengakses lebih dari 4GB RAM ketika menjalankan kernel 32-bit. Windows tidak mengizinkan PAE pada versi non-Server karena masalah kompatibilitas dengan driver, yang mana mereka memiliki lebih banyak, termasuk yang pihak ketiga.
  3. Tiger menambahkan ABI 64-bit (Application Binary Interface) untuk menjalankan kode 64-bit di atas kernel 32-bit, dan versi 64-bit dari API level rendah (Application Programming Interface) untuk "console" (tidak GUI) aplikasi.
  4. Leopard menambahkan Kakao 64-bit untuk aplikasi GUI (tetapi bukan Karbon 64-bit).
  5. Snow Leopard menambahkan kernel 64-bit, yang merupakan default pada model-model high-end tertentu saja.
  6. Lion membutuhkan CPU 64-bit, tetapi masih menyertakan kernel 32-bit. Mac lama dengan CPU 64-bit tetapi GPU yang hanya memiliki driver 32-bit harus menjalankan kernel 32-bit, misalnya.

Jadi OS X mendukung aplikasi 64-bit sesegera mungkin, dan terus menjalankan kernel 32-bit selama mungkin karena situasi driver. (Bit-ness dari kernel hanya menjadi faktor ketika mencoba mengelola RAM dalam jumlah besar - tabel halaman mengambil memori juga - dan beralih ke kernel 64-bit menawarkan beberapa manfaat kinerja.) Tapi Apple tentu tidak malu menjatuhkan barang.

Pertanyaan sesungguhnya adalah mengapa Windows dan Linux tidak melakukan hal yang sama. Untuk Windows, pertimbangkan bahwa usaha pertama mereka di Win64 adalah dengan Itanium, yang benar-benar berbeda. Tetapi jawaban akhirnya mungkin mendidih ke apa yang biasanya terjadi selama beberapa dekade terakhir: kompatibilitas dengan sekelompok program pihak ketiga itu tidak melakukan hal-hal dengan cara yang benar:

Implementasi 64-bit OS X sangat berbeda dari yang ada pada   Windows, yang memperlakukan versi 32-bit dan 64-bitnya sebagai dua berbeda   sistem operasi yang disimpan pada media instalasi yang berbeda. Ini sudah selesai   sebagian besar untuk menjaga kompatibilitas Windows dengan aplikasi yang lebih lama -   memindahkan atau mengganti nama hal-hal seperti folder System32 akan rusak   program yang diharapkan ada di sana - dan sebagai hasilnya keduanya   dipisahkan ke titik yang bahkan tidak ada jalur peningkatan antara   Windows 32-bit dan Windows 64-bit. Karena ini, dan karena   Aplikasi dan driver Windows biasanya memiliki 32-bit dan   Versi 64-bit, transisi Windows ke 64-bit telah sedikit   rockier dan sedikit lebih terlihat oleh pengguna.

Ada banyak info latar belakang tentang transisi 64-bit pada keduanya Sisi Mac dan Sisi Windows. (Tautan itu adalah yang terakhir dari setiap rangkaian artikel; pastikan untuk kembali ke awal setiap artikel.)

Saya tidak tahu apa ceritanya dengan Linux, tetapi bayangkan Linus memiliki pendapat yang kuat tentangnya.


3
2017-09-28 01:55



Dari sisi Linux: kernel mendukung arsitektur 32-bit dan 64-bit jauh sebelum amd64 ada. Menjalankan proses 64-bit pada kernel 32-bit akan membutuhkan beberapa re-engineering, setidaknya di bagian arsitektur tergantung dari kode. Cukup dilakukan untuk menjalankan binari i386 pada kernel amd64, tetapi bukan sisi lain (yang lebih rumit), karena tidak ada kasus penggunaan yang benar-benar memotivasi untuk arah tersebut (jika Anda ingin menjalankan proses 64-bit, tidak ada alasan untuk tidak menjalankan 64-bit kernel). - Gilles
Terima kasih banyak untuk penjelasan Anda, saya tidak bisa upvote belum (tidak cukup reputasi), dan saya tidak bisa menerima dua jawaban juga, tetapi Anda dan Gilles membuatnya sedikit lebih jelas bagi saya! - pechenie


Saya telah menyadari bahwa itu benar-benar aneh jika sistem dan berjalan di bawah x64 kompatibel CPU tidak dapat menjalankan aplikasi x64, tidak peduli apa kernel mengelola proses. Apakah itu sangat sulit? Hanya memuat aplikasi sialan ke dalam memori dan mengatur penunjuk operasi CPU ke byte pertama, mudah sekali!

Anda kehilangan bagian penting. Aplikasi membuat panggilan API ke fungsi dan layanan yang disediakan oleh sistem operasi. Jika aplikasi 64-bit mengirimkan pointer 64-bit ke sistem operasi 32-bit, semuanya akan meledak.

Saya menduga bahwa untuk membuat segala sesuatu bekerja dengan baik, OS harus membebani fungsi dan menyediakan versi 64bit dan 32bit dari setiap fungsi. Untuk setiap kernel, fungsi "off" (fungsi 64bit pada kernel 32bit, fungsi 32bit pada kernel 64bit) hanya akan menjadi rintisan yang menerjemahkan panggilan menjadi 32-bit aman dan kemudian memanggil kembali fungsi asli.


0
2017-09-28 02:03