Itu Dopamin alat jailbreak untuk perangkat A12-A15 yang menjalankan iOS & iPadOS 15.0-15.4.1 adalah satu-satunya jailbreak terbaru yang tersedia untuk perangkat apa pun yang lebih baru dari iPhone X saat ini. Karena itu, tidak mengherankan jika ini adalah pilihan yang populer pelanggar penjara Hari ini.
Namun jika Anda telah menggunakan Dopamin atau mengikuti proyek ini sejak awal, Anda mungkin pernah mendengar kata tertentu yang dilontarkan beberapa kali oleh pemimpin proyek Lars Fröder ( @ opa334dev ) dan pengguna: Spinlock.
Memang benar, ada masalah umum yang mempengaruhi jailbreak Dopamine yang disebut Spinlock Timeout Panic, dan pada akhirnya menyebabkan perangkat pengguna menampilkan layar merah muda dan kemudian melakukan boot ulang dengan cara yang tampaknya tidak beralasan. Permasalahan tersebut telah dijelaskan secara teknis sebagai berikut:
Pemetaan di atas halaman executable dyld_shared_cache tampaknya memicu perilaku kasus tepi di PPL yang terkadang menyebabkan waktu habis pada spinlock halaman memori, yang mengakibatkan kepanikan kernel.
Semakin banyak penyesuaian yang diinstal pada fungsi hook C dan semakin banyak proses yang dimasukkan, semakin sering perilaku ini dipicu.
Tampaknya masalah ini dapat diperbaiki dengan menghubungkan semua halaman yang terhubung, tetapi ruang pengguna tidak dapat mengambil kunci tersebut dan menemukan objek vm_page di memori kernel untuk membalikkan bit kabel secara langsung terbukti sulit.
Karena saya belum pernah secara pribadi mengalami salah satu masalah ini pada perangkat Dopamin saya, sulit untuk menjelaskan bagaimana hal ini terjadi atau kapan hal ini terjadi, namun saya berbicara dengan Fröder untuk bertanya tentang apa yang menurut mereka dapat menyebabkannya untuk mempelajari lebih lanjut tentang bagaimana masalah ini terjadi. mereka berusaha mengatasinya.
Tanggapan Fröder sangat berguna bagi orang-orang non-teknis seperti saya dan mungkin banyak orang lain di komunitas jailbreak dan sejak itu telah dipublikasikan ke halaman masalah GitHub agar dapat dilihat oleh publik. Tanggapan lengkapnya, dikutip di bawah, mengungkapkan pemahaman Fröder tentang masalah Spinlock Timeout Panic:
Berikut adalah upaya penjelasan yang lebih mendalam mengenai masalah ini, berdasarkan pemahaman terbaik saya saat ini. Ingatlah bahwa ini didasarkan pada asumsi yang pada dasarnya tidak mungkin diverifikasi.
Jadi dalam sistem multi-thread, “kunci” digunakan untuk mencegah dua thread saling mengganggu. Dengan itu satu thread dapat memperoleh kunci, melakukan modifikasi, dan membukanya. Saat terkunci, thread lain yang mencoba mendapatkan kunci akan menunggu hingga objek dibuka kembali.
Spinlock pada dasarnya adalah hal yang sama, hanya digunakan untuk hal-hal yang relevan dengan kinerja dan perbedaan utamanya adalah bahwa spinlock dapat habis waktunya jika ada sesuatu yang memerlukan kunci terlalu lama sementara thread lain mencoba untuk mendapatkan kunci tersebut. Jadi ketika memperoleh kunci dan objek sudah terkunci, ia akan menunggu beberapa detik dan jika objek tidak dibuka kuncinya dalam jangka waktu tersebut, maka waktu habis.
Mekanisme ini sendiri bukanlah persoalannya, persoalannya ada hubungannya dengan Penyimpanan halaman. Setiap halaman memori (yang menggambarkan area sebesar 16kB RAM) memiliki spinlock sehingga tidak ada masalah ketika beberapa proses mencoba memperoleh halaman yang sama pada waktu yang sama.
Halaman tertentu dapat dipetakan ke dalam beberapa proses (misalnya jika keduanya memuat perpustakaan yang sama), mereka menggunakan kembali halaman yang sama untuk menghemat memori. Tweak ingin menimpa memori tersebut pada basis per-proses, sehingga mereka harus terlebih dahulu membuat salinan khusus proses dari pemetaan yang ada dan memetakannya di atasnya, sehingga mis. satu halaman dapat dimodifikasi dalam satu proses sambil tetap menyisakan stok di proses lainnya. Masalah ini tampaknya terjadi secara khusus ketika memetakan di atas halaman yang berada di dalam dyld_shared_cache.
Masalahnya sekarang Apple mungkin tidak pernah menguji hooking semacam ini dan ternyata ketika Anda melakukannya dalam banyak proses, hal itu dapat menyebabkan halaman asli (salah satu pemetaan bersama) terhapus, karena tidak digunakan secara aktif. . Menghapus halaman pada dasarnya menghapusnya dari RAM dan ketika diakses lagi, halaman tersebut akan dimuat lagi. Pada sistem stok hal ini tidak akan terjadi karena tidak ada yang terpancing.
Sekarang akar masalahnya tampaknya adalah sesuatu yang mencoba untuk memasukkan kembali halaman yang sebelumnya dibagikan/dapat dieksekusi, hal ini memicu masalah preemption di mana satu thread mengambil spinlock dan ketika memilikinya, ia akan didahului ke konteks berbeda yang juga mengambil spinlock. spinlock yang sama (Preemption pada dasarnya adalah mekanisme yang memungkinkan satu thread digunakan untuk sesuatu yang lain meskipun sedang sibuk, kode harus secara eksplisit menonaktifkan dan mengaktifkannya kembali jika ada bagian kode yang harus selalu dieksekusi sekaligus) . Jadi sepertinya ada satu jalur kode yang hanya dipanggil dari perilaku khusus ini ketika Apple tidak menonaktifkan preemption dengan benar, menyebabkan satu thread mengambil spinlock yang sama dua kali, yang membuatnya habis waktu karena konteks lama tidak dijalankan lagi dan tidak bisa membuka spinlock lagi.
Sedangkan untuk mitigasinya, saya mencoba mengotak-atik variabel terkait spinlock untuk membuat ambang batas yang diperlukan untuk waktu habis lebih tinggi, sayangnya Apple mengacaukan kami karena segala sesuatu yang terkait dengan itu dilindungi KTRR, dan kami tidak memiliki jalan pintas. Saya kira perbaikan yang tepat adalah dengan 'menyambungkan' (menyambungkan halaman untuk mencegah halaman keluar) setiap halaman yang akan dikaitkan sebelum ditimpa untuk memastikan bahwa halaman keluar tidak pernah terjadi dan oleh karena itu jalur kode terlibat dalam masalah tidak terpicu, saya sudah mencoba banyak hal sejauh ini tetapi tampaknya tidak mungkin mendapatkan kabel seperti itu dari ruang pengguna, jadi itu harus dilakukan di dalam kernel. Sayangnya, struktur yang terlibat dalam pemetaan bersama khusus yang menyebabkan masalah ini sangat berbelit-belit dan saya belum menemukan cara untuk mendapatkan objek halaman yang tepat untuk menerapkan pengkabelan.
Masalah Spinlock Timeout Panic telah ada sejak Dopamin pertama kali tersedia dan terus berlanjut hingga saat ini meskipun banyak upaya untuk memperbaiki masalah ini. Oleh karena itu, membuka dialog agar lebih banyak orang dapat melihat dan berkontribusi adalah langkah maju yang tepat, karena akan memudahkan lebih banyak orang untuk bertukar pikiran tentang masalah ini dan kemungkinan solusinya.
Fröder menjelaskan ide mereka selanjutnya dalam upaya menggagalkan masalah ini dalam komentar lanjutannya:
Jadi langkah selanjutnya untuk mencoba dan memperbaikinya adalah menemukan struktur vm_page halaman DSC di memori kernel, sejauh ini semua upaya saya untuk menemukan struktur seperti itu gagal.
Meskipun belum berdampak langsung pada saya, akan menarik untuk melihat apakah Fröder mampu menyelesaikan masalah Spinlock Timeout Panic. Tampaknya ini lebih lazim bagi pengguna yang menginstal lebih banyak tweak jailbreak yang mengaitkan fungsi C. Mungkin saja perangkat pengujian saya tidak memiliki banyak tweak yang diinstal untuk memicu masalah ini, namun saya tahu ada banyak jailbreaker di luar sana yang menginstal banyak sekali jailbreaker. tweak jailbreak – lebih dari yang pernah saya lakukan.
Lihat juga: Cara melakukan jailbreak pada perangkat A12-A15 yang menjalankan iOS & iPadOS 15.0-15.4.1 dengan Dopamin
Pernahkah Anda terkena Spinlock Timeout Panic yang digambarkan sebagai layar merah muda sebelum reboot tiba-tiba saat menggunakan jailbreak Dopamine? Beri tahu kami di bagian komentar di bawah.