Apa yang menghentikan program perakitan agar tidak menabrak sistem operasi? [Tutup]

18

Pertama-tama, saya seorang pemula, jadi jika pertanyaan ini terdengar konyol, tunjukkan asumsi yang salah.

Dari apa yang saya mengerti, tugas sistem operasi adalah mengelola perangkat keras dan perangkat lunak yang berjalan pada OS. Juga, dari apa yang saya mengerti, program perakitan memungkinkan seseorang untuk mengontrol perangkat keras hampir secara langsung. Dalam program perakitan, seseorang dapat membaca dan menulis data ke dalam register, dan membaca dan menulis data ke dalam RAM.

Mengingat kebebasan untuk mengacaukan register dan RAM ini, apakah program perakitan tidak akan memengaruhi sistem operasi? Misalkan OS menggunakan register A untuk menyimpan informasi penting, dan misalkan saya menjalankan program rakitan pada OS itu. Jika program berhasil menulis sampah ke register A, OS pasti akan terpengaruh.

Pertanyaan:

  1. Apakah mungkin mengacaukan register A dengan cara yang dijelaskan di atas?

  2. Jika tidak, apa yang menghentikan program perakitan dari memodifikasi register yang digunakan oleh OS?

Aliran
sumber
13
programmer pintar ...
Tony Stewart Sunnyskyguy EE75
Ada banyak arsitektur komputer sekarang dan di masa lalu, serta banyak sistem operasi dikembangkan. Arsitektur / OS apa yang Anda maksudkan sebenarnya? Pada beberapa arsitektur (lama) tidak ada kemungkinan untuk menghentikan program dari apa yang dilakukan setelah memulai, itu benar. Tetapi perangkat keras / OS modern telah membangun alat perangkat keras yang hanya memberikan sebagian memori untuk program dalam mode "normal" (bukan superuser), dan tidak dapat mengakses memori di luar batas ini. Register bebas untuk digunakan, karena OS tidak menyimpan informasi yang berguna dalam register, hanya dalam memori / pada disk.
cyclone125
2
Dalam mikroprosesor, program Anda berjalan dalam "mode pengguna", sistem operasi berjalan dalam "mode sistem." Jika program mode pengguna dieksekusi instruksi berhenti, misalnya, mesin tidak akan berhenti. Halt akan terjebak dan sistem operasi dipanggil. Mengenai RAM, OS akan mengatur lingkungan untuk program mode pengguna sehingga, melalui perangkat keras manajemen memori, apa yang dilihat oleh program pengguna sebagai alamat RAM X tidak akan benar-benar menjadi alamat RAM X.
George White
1
@flux Saya telah memperbarui komentar saya. Jawabannya adalah: tidak ada "umum" jawaban atas pertanyaan Anda, karena ada / adalah arsitektur komputer yang berbeda / OS. Bisa dengan cara yang berbeda.
cyclone125
2
... Dulu saya dulu menulis dalam kode mesin mentah. Yee ha !!! :-)
Russell McMahon

Jawaban:

33

Pada akhirnya, semua program yang kode mesin, terlepas dari apakah bahasa sumber itu assembler atau bahasa tingkat tinggi.

Yang penting adalah bahwa ada mekanisme perangkat keras yang membatasi apa yang dapat dilakukan oleh proses tertentu, termasuk "mengacaukan" register yang dapat mempengaruhi program lain atau sistem operasi itu sendiri.

Ini dimulai dengan perbedaan sederhana antara mode operasi "pengguna" dan "pengawas", dan sejak itu berkembang menjadi arsitektur keamanan dengan beberapa "cincin" hak istimewa.


Berikut adalah contoh yang sangat umum untuk membuatnya sedikit lebih konkret:

  • Dalam "mode pengguna", suatu proses tidak dapat akses memori yang belum ditugaskan untuk ID prosesnya. Memori yang ditetapkan untuk proses lain dan sistem operasi itu sendiri diblokir. Ini termasuk nilai-nilai register yang digunakan oleh proses-proses lainnya. Ini diberlakukan oleh perangkat keras MMU.

  • Oleh karena itu, dalam "mode pengguna", suatu proses tidak dapat mengakses register kontrol MMU.

  • Dan jelas, dalam "mode pengguna", suatu proses tidak dapat mengubah mode menjadi "mode pengawas" kecuali melalui mekanisme yang sangat jelas yang melibatkan pemanggilan fungsi sistem operasi.

Sistem operasi mendapatkan kontrol jika proses mencoba untuk memecahkan setiap aturan ini. Setelah itu terjadi, OS hanya dapat menghentikan proses menyinggung, tidak pernah melaksanakan lagi instruksi nya.

Dave Tweed
sumber
2
Jika saya mengerti benar, apa yang Anda katakan adalah: Beberapa prosesor memiliki "modus pengguna" dan "modus supervisor". OS berjalan dalam mode "pengawas", dan menempatkan prosesor menjadi "mode pengguna" untuk menjalankan program perakitan fiksi saya. Dalam "mode pengguna", ada register dan alamat RAM bahwa program perakitan tidak akses dapat karena disengaja desain hardware.
Flux
3
Pada dasarnya, jawaban ini menjelaskan arsitektur modern "mirip-i386" dengan mode MMU dan Protected. Tapi sejujurnya ada banyak arsitektur lama (i8080, MOS 6502 dll.) Serta modern yang lebih sederhana (AVR, ARM Cortex-M dll.) Yang tidak memiliki fitur-fitur ini dan jika beberapa jenis OS digunakan (mis. Lama CP / M, FreeRTOS modern, ChibiOS dll.) Tidak ada yang dapat menghentikan program dari apa yang dilakukannya.
cyclone125
2
@Flux i386 The (dan di atas) arsitektur memberikan rincian untuk belajar. Arsitektur x86 tidak hanya memiliki alamat memori yang dapat dilindungi, tetapi juga I / O alamat, juga. (Ada petunjuk yang berbeda digunakan untuk akses memori vs I / O akses.) Ada tiga alamat memori di i386 +. Alamat berdasarkan segmen / pemilih menggunakan register pemilih yang mereferensikan entri tabel (GDT atau LDT) untuk memetakan pasangan menjadi alamat linear 32-bit tunggal. Paging tabel kemudian menerjemahkan 32-bit linear address ke alamat fisik 36-bit (P-II.) Perlindungan ada di kedua langkah penerjemahan.
jonk
4
@fluks ringkasan Anda sudah benar. Program dalam sistem memori terproteksi dengan OS multitasking yang sesuai seharusnya tidak dapat merusak sistem dengan aliran instruksi apa pun. Bahkan yang tidak valid - yang berakhir pada penangan khusus.
pjc50
Meskipun ada beberapa cincin (setidaknya dalam x86), itu sangat, sangat jarang untuk lebih dari dua yang benar-benar digunakan.
hutan
10

Banyak sistem operasi multitasking menggunakan struktur data yang disebut Blok Kontrol Proses (PCB) untuk menangani masalah register yang ditimpa. Ketika Anda menjalankan kode Anda, OS menciptakan proses baru untuk melacaknya. PCB berisi informasi tentang proses dan ruang Anda yang dialokasikan untuk menampung konten register. Katakanlah proses A saat ini sedang berjalan pada prosesor dan kode Anda sedang dalam proses B. Apa yang terjadi ketika Anda menjalankan kode Anda berjalan seperti ini:

  1. Data status proses A (isi register, penghitung program, dll.) Disalin ke dalam PCB-nya.

  2. Data status proses B disalin dari PCB ke register CPU

  3. Proses B berjalan pada prosesor sampai selesai atau didahului

  4. Data status proses B disalin kembali ke dalam PCB-nya

  5. Data status proses A disalin kembali ke CPU dan terus berjalan

Jika sistem operasi berjalan sebagai proses A, maka Anda dapat melihat bagaimana menyimpan registernya sebelum program Anda berjalan kemudian menyalinnya kembali ke CPU setelah program Anda berakhir mencegah program pengguna dari mengacaukan apa yang terjadi dalam proses lain.

Untuk menghindari proses pengguna menulis data OS dalam memori, sebagian besar platform menggunakan segmentasi memori. Pada dasarnya, menggunakan memori virtual, ruang alamat yang dilihat proses dapat dipetakan ke berbagai alamat fisik sewenang-wenang. Selama ruang memori fisik proses tidak tumpang tindih, tidak mungkin bagi satu proses untuk menimpa data orang lain.

Tentu saja, berbagai OS melakukan berbagai hal secara berbeda, jadi ini tidak berlaku dalam setiap kasus. Juga, pada sebagian besar platform, proses OS berjalan dalam mode yang berbeda dari proses pengguna dan ada beberapa seluk-beluk di sana.

pertama
sumber
4

Tergantung pada platform apa yang Anda bicarakan.

  • Pada prosesor yang lebih mendasar, prosesor hanya menjalankan instruksi apa pun yang diminta oleh program untuk dieksekusi.

  • Pada prosesor yang lebih canggih, ada (setidaknya) dua mode. Dalam satu modus, prosesor melakukan apa saja program mengatakan itu untuk melakukan. Dalam modus lain, prosesor itu sendiri menolak untuk mengeksekusi instruksi tertentu.

Apa berhenti program menabrak seluruh sistem? Dengan jenis pertama prosesor, jawabannya adalah "tidak". Dengan prosesor dasar, satu program nakal memang bisa menghancurkan seluruh sistem. Semua komputer rumah 8-bit awal, dan banyak dari yang 16-bit, termasuk dalam kategori ini.

Pada PC modern, prosesor memiliki "perlindungan" hardware. Pada dasarnya OS berjalan dalam mode khusus yang memungkinkannya melakukan apa saja, sedangkan program normal berjalan dalam mode di mana prosesor hanya akan mengizinkan tindakan tertentu (berdasarkan pada pengaturan apa yang telah dikonfigurasi OS pada prosesor). Hal-hal seperti hanya mengakses register tertentu, atau hanya mengakses rentang memori tertentu.

Jelas, membiarkan satu program jahat menabrak seluruh sistem itu buruk. (Ada juga implikasi keamanan yang parah dalam membiarkan program jahat mengakses data apa pun yang diinginkannya.) Untuk menghindarinya, Anda memerlukan dua hal:

  1. Sebuah prosesor yang sebenarnya memiliki perangkat keras perlindungan (yaitu, dapat dikonfigurasi untuk menolak menjalankan instruksi tertentu).

  2. OS yang benar-benar menggunakan fasilitas ini untuk melindungi diri. (Tidak ada gunanya memiliki chip dengan sirkuit perlindungan jika OS tidak pernah menggunakannya!)

Hampir semua OS desktop modern yang dapat Anda beri nama (Windows, Linux, Mac OS, BSD ...) itu adalah OS mode terlindungi yang berjalan pada prosesor dengan perangkat keras perlindungan. Jika Anda melakukan pengembangan tertanam pada beberapa mikrokontroler 8-bit, itu mungkin tidak memiliki perangkat keras perlindungan. (Atau OS, dalam hal ini ...)

Matematika Matematika
sumber
1

Q. Apa berhenti program perakitan dari menabrak sistem operasi?

A. Tidak ada.

Namun, banyak programmer yang sangat pintar telah berusaha sangat keras selama bertahun-tahun untuk membuatnya semakin sulit. Sayangnya, untuk setiap programmer yang pandai, ada banyak, banyak lainnya yang di antara mereka lebih kreatif, lebih ambisius, dan kadang-kadang hanya lebih beruntung daripada yang pintar. Setiap kali seorang programmer yang pandai mengatakan bahwa tidak ada yang harus, mau atau bisa melakukan sesuatu, seseorang di luar sana akan menemukan cara untuk melakukannya. Microsoft Windows (sebagai contoh) telah ada selama hampir 35 tahun dan kami masih memiliki BSoD (Blue Screens of Death), yang hanya instruksi yang membuat sistem operasi crash.

Mari kita mulai dengan sedikit terminologi. Segala sesuatu yang berjalan di komputer melakukannya dalam kode mesin. Bit yang membaca penekanan tombol atau gerakan mouse pointer, sedikit yang berubah warna pixel pada layar atau membaca byte dari file dan bit yang menghitung apakah peluru Anda memukul orang jahat atau bit yang menentukan jika aplikasi kartu kredit Anda akan diterima semua dijalankan sebagai urutan instruksi kode mesin. Beberapa pekerjaan sangat umum dan dilakukan sangat sering sehingga masuk akal untuk mengumpulkan instruksi yang diperlukan untuk melakukannya dan meminta semua orang menggunakan perakitan itu. Banyak pekerjaan ini yang memungkinkan atau membantu orang lain untuk menggunakan komputer cenderung disebut sistem operasi tetapi tidak ada yang secara inheren berbeda antara mereka dan program lain. Mereka semua hanya urutan instruksi kode mesin.

Apa yang membuat sistem operasi lebih rumit (dan karena itu rentan terhadap crash) adalah mereka harus memperhitungkan hal-hal yang biasanya tidak perlu Anda pikirkan. Ambil paling sederhana pekerjaan sebagai contoh. Saya ingin menulis pesan di akhir file. Dalam bahasa tingkat tinggi Anda akan menulis sesuatu seperti:

  with open("myFile.txt", "w+") as f:
      # do some really clever things
      f.write("Goodbye cruel world!")

Mari kita abaikan semua perincian tentang bagaimana status fisik diakses dan diubah atau bagaimana mereka ditafsirkan sebagai bit dan byte atau bagaimana byte tersebut ditransfer ke dan dari memori dan CPU, dan percaya bahwa semua itu ditangani oleh program yang disediakan oleh OS. di balik layar. Mari kita pikirkan tentang bagaimana Anda menambahkan ke akhir file. 1) Cari tahu di mana ujung file, 2) tulis sesuatu di posisi itu. Apa yang mungkin salah? Sebenarnya cukup banyak. Pikirkan apa lagi yang terjadi di komputer saat Anda melakukan hal-hal yang cerdas. Jika apa pun yang dilakukan oleh orang lain (termasuk sistem operasi itu sendiri) perubahan file Anda bekerja pada cara apapun, maka pekerjaan benar-benar sederhana ini tiba-tiba mendapat banyak lagi rumit. File lebih panjang, file lebih pendek. File tidak ada lagi. Disk penuh,

Paul Smith
sumber