Saya tidak tahu cara kerja prosesor, jadi saya menulis simulator perangkat lunak


Beberapa bulan yang lalu, saya tiba-tiba dikejutkan oleh pemikiran bahwa saya tidak tahu tentang prinsip-prinsip perangkat keras komputer. Saya masih tidak tahu cara kerja komputer modern .

Saya membaca buku "Tapi bagaimana dia tahu?" Clark Scott dengan deskripsi terperinci tentang komputer 8-bit yang sederhana: dimulai dengan gerbang logika, RAM, transistor prosesor, berakhir dengan perangkat aritmatika-logika dan operasi input-output. Dan saya ingin mengimplementasikan semua ini dalam kode.

Meskipun saya tidak begitu tertarik dengan fisika sirkuit mikro, buku ini hanya meluncur di sepanjang gelombang dan dengan indah menjelaskan sirkuit listrik dan bagaimana bit bergerak di sekitar sistem - pembaca tidak perlu tahu teknik elektro. Tetapi deskripsi tekstual tidak cukup bagi saya. Saya harus melihat segala sesuatu dalam tindakan dan belajar dari kesalahan saya yang tak terhindarkan. Jadi saya mulai mengimplementasikan sirkuit dalam kode. Jalan setapak itu berduri, tetapi memberi pelajaran.

Hasil pekerjaan saya dapat ditemukan di repositori komputer sederhana: kalkulator sederhana. Dia sederhana dan dia menghitung.






Program sampel

Kode prosesor diimplementasikan sebagai sekelompok gerbang logika yang menyala dan mati , tetapi berfungsi. Saya menjalankan tes unit , dan kita semua tahu bahwa tes unit adalah bukti yang tidak dapat disangkal bahwa program ini bekerja.

Kode memproses input keyboard dan menampilkan teks pada tampilan menggunakan mesin terbang yang dibuat dengan susah payah untuk font profesional, yang saya sebut Daniel Code Pro . Satu-satunya cheat: untuk mengambil input keyboard dan output hasilnya, saya harus menghubungkan saluran melalui GLFW , tetapi sebaliknya itu adalah simulasi perangkat lunak sepenuhnya dari rangkaian listrik.

Saya bahkan menulis assembler kasar yang membuka mata saya untuk banyak hal, untuk sedikitnya. Dia tidak sempurna. Bahkan, bahkan sedikit jelek, tetapi dia menunjukkan kepada saya masalah yang sudah dipecahkan orang lain bertahun-tahun yang lalu.

Tetapi mengapa Anda melakukan ini?


β€œAnak berusia tiga belas tahun sedang membangun prosesor di Minecraft. Hubungi saya ketika Anda dapat membuat CPU nyata dari relay telegraf. "

Model mental perangkat CPU saya terjebak pada tingkat buku teks sains komputer untuk pemula. Prosesor untuk emulator Gameboy, yang saya tulis pada 2013, sebenarnya tidak terlihat seperti CPU modern. Bahkan jika emulator hanyalah mesin negara (state machine), itu tidak menggambarkan keadaan di tingkat gerbang logika. Hampir semuanya dapat diimplementasikan hanya dengan menggunakan switch dan mempertahankan status register.

Saya ingin lebih memahami bagaimana semuanya berjalan, karena saya tidak tahu, misalnya, apa itu cache L1 / L2 dan pipelining, dan saya tidak begitu yakin bahwa saya memahami artikel tentang kerentanan Meltdown dan Spectre. Seseorang mengatakan bahwa mereka mengoptimalkan kode sedemikian rupa untuk menggunakan cache prosesor, tetapi saya tidak tahu bagaimana memeriksanya, kecuali untuk mengambil kata. Saya tidak yakin apa arti semua instruksi x86. Saya tidak mengerti bagaimana orang mengirim tugas ke GPU atau TPU. Dan secara umum, apa itu TPU? Saya tidak tahu cara menggunakan instruksi SIMD.

Semua ini dibangun di atas dasar yang perlu dipelajari terlebih dahulu. Itu berarti kembali ke dasar dan melakukan sesuatu yang sederhana. Buku Clark Scott yang disebutkan di atas menggambarkan komputer sederhana. Itu sebabnya saya mulai dengan itu.

Kemuliaan bagi Scott! Dia bekerja!


Komputer Scott adalah prosesor 8-bit yang terhubung ke 256 byte RAM, semua terhubung melalui bus sistem 8-bit. Ini memiliki 4 register tujuan umum dan 17 instruksi mesin . Seseorang membuat simulator visual untuk web : ini sangat bagus. Sangat menakutkan untuk memikirkan berapa lama waktu yang dibutuhkan untuk melacak semua keadaan sirkuit!


Sirkuit dengan semua komponen prosesor Scott. Hak Cipta 2009-2016. Siegbert Filbinger dan John Clark Scott

Buku ini menemani Anda di sepanjang rute dari gerbang logika sederhana ke bit dalam memori dan register, dan kemudian terus melapisi komponen sampai Anda mendapatkan sesuatu yang mirip dengan diagram di atas. Saya sangat merekomendasikan membaca buku, bahkan jika Anda sudah terbiasa dengan konsepnya. Hanya bukan versi Kindle, karena grafik kadang-kadang sulit untuk memperbesar dan membongkar "pembaca" di layar. Menurut pendapat saya, ini adalah masalah Kindle yang sudah berlangsung lama.

Komputer saya berbeda dari versi Scott, kecuali bahwa saya memperbaruinya menjadi 16 bit untuk meningkatkan jumlah memori yang tersedia, karena menyimpan hanya mesin terbang untuk tabel ASCII memakan sebagian besar mesin 8-bit Scott, menyisakan sangat sedikit ruang untuk kode yang berguna.

Proses pengembangan saya


Secara umum, pengembangan berjalan sesuai dengan skema ini: membaca teks, mempelajari diagram, dan kemudian mencoba mengimplementasikannya dalam bahasa pemrograman tujuan umum dan jelas tidak menggunakan alat khusus untuk merancang sirkuit terintegrasi. Saya menulis simulator on Go hanya karena saya sedikit terbiasa dengan bahasa ini. Orang yang skeptis mungkin berkata: "Bodoh! Tidak bisakah Anda mempelajari VHDL atau Verilog , atau LogSim , atau yang lainnya. Tetapi pada saat itu saya sudah menulis bit, byte dan gerbang logika dan jatuh terlalu dalam. Mungkin lain kali saya akan mempelajari bahasa-bahasa ini dan memahami berapa banyak waktu yang saya buang, tetapi ini adalah masalah saya.

Dalam sirkuit besar, sekelompok nilai Boolean hanya ditransmisikan di komputer, sehingga bahasa apa pun yang ramah dengan aljabar Boolean cocok.

Menerapkan skema pada nilai-nilai Boolean ini membantu kami (programmer) mendapatkan makna, dan yang paling penting, memutuskan urutan byte yang akan digunakan sistem, dan memastikan bahwa semua komponen mengirimkan data di bus dalam urutan yang benar.

Sangat sulit untuk diimplementasikan. Demi bias, saya memilih representasi dengan urutan byte terbalik, tetapi ketika menguji ALU saya tidak bisa mengerti mengapa angka yang salah keluar. Kucing saya banyak mendengar, banyak ekspresi yang tidak patut.

Perkembangan tidak berjalan cepat: mungkin butuh satu atau dua bulan waktu luang saya. Tetapi ketika hanya prosesor yang berhasil menyelesaikan operasi 2+2=5Saya berada di surga ketujuh dengan kebahagiaan.

Semuanya berjalan seperti biasa sampai tiba pada I / O. Buku ini mengusulkan desain sistem dengan keyboard sederhana dan antarmuka tampilan untuk memasukkan data ke dalam mesin dan mengeluarkan hasilnya. Yah, kita sudah melangkah sejauh ini , tidak masuk akal untuk berhenti di tengah jalan. Saya menetapkan tujuan untuk menerapkan pengetikan pada keyboard dan menampilkan huruf pada tampilan.

Periferal


Perangkat periferal menggunakan templat adaptor sebagai antarmuka perangkat keras antara CPU dan dunia luar. Mungkin mudah untuk menebak bahwa templat ini dipinjam dari desain perangkat lunak.


Bagaimana adaptor I / O terhubung ke jendela GLFW

Dengan pemisahan ini, ternyata cukup sederhana untuk menghubungkan keyboard dan tampilan ke jendela yang menjalankan GLFW. Bahkan, saya baru saja menarik sebagian besar kode dari emulator saya dan memodifikasinya sedikit untuk membuat saluran Go berfungsi sebagai sinyal I / O.

Kami memulai komputer




Ini mungkin bagian yang paling sulit, setidaknya yang paling rumit. Sulit untuk menulis di assembler dengan set instruksi yang terbatas, dan di assembler kasar saya bahkan lebih buruk, karena Anda tidak bisa membodohi orang lain kecuali diri Anda sendiri.

Masalah terbesar adalah juggling dengan empat register, melacak mereka dengan menarik data dari register dan menyimpannya sementara di memori. Dalam prosesnya, saya ingat bahwa prosesor Gameboy memiliki register penunjuk tumpukan untuk kenyamanan memuat dan memuat register. Sayangnya, komputer ini tidak memiliki kemewahan seperti itu, jadi Anda harus terus-menerus mentransfer data secara manual ke dan dari memori.

Saya memutuskan untuk menghabiskan waktu hanya pada satu CALL Pseudo- CALL untuk memanggil fungsi dan kemudian kembali ke titik. Tanpa ini, panggilan hanya tersedia satu tingkat di kedalaman.

Selain itu, karena mesin tidak mendukung interupsi, saya harus menerapkan kode polling keadaan keyboard yang mengerikan. Buku ini membahas langkah-langkah yang diperlukan untuk mengimplementasikan interupsi, tetapi ini sangat menyulitkan sirkuit.

Tapi berhenti merengek, saya masih menulis empat program , dan kebanyakan dari mereka menggunakan beberapa jenis kode umum untuk rendering font, input keyboard, dll. Ini bukan sistem operasi, tetapi memberikan pemahaman tentang apa yang dilakukan OS sederhana.

Itu tidak mudah. Bagian tersulit dari program penulis teks adalah dengan benar mencari tahu kapan harus melompat ke baris baru atau apa yang terjadi ketika Anda menekan Enter.

 main-getInput: CALL ROUTINE-io-pollKeyboard CALL ROUTINE-io-drawFontCharacter JMP main-getInput 
Siklus utama program penulis teks

Saya tidak repot-repot menerapkan tombol Backspace dan tombol pengubah. Tetapi saya menyadari betapa banyak pekerjaan yang dibutuhkan oleh editor teks dan betapa membosankannya itu.

Kesimpulan


Itu adalah proyek yang menyenangkan dan sangat berguna bagi saya. Di tengah pemrograman bahasa assembly, saya hampir lupa tentang gerbang logika di bawah ini. Saya naik ke tingkat atas abstraksi.

Meskipun prosesor ini sangat sederhana dan jauh dari CPU di laptop saya, tampaknya bagi saya proyek ini banyak mengajarkan saya, khususnya:

  • Bagaimana bit bergerak melintasi bus antara semua komponen.
  • Bagaimana cara kerja ALU sederhana ?
  • Seperti apa loop Fetch-Decode-Execute yang sederhana ini .
  • Bahwa mesin tanpa register penunjuk tumpukan dan konsep tumpukan - menyebalkan.
  • Mobil itu tanpa gangguan juga menyebalkan.
  • Apa assembler dan apa fungsinya.
  • Bagaimana periferal berinteraksi dengan prosesor sederhana.
  • Cara kerja font sederhana dan cara menampilkannya di layar.
  • Seperti apa sistem operasi sederhana itu.

Jadi apa selanjutnya? Buku itu mengatakan bahwa tidak ada yang memproduksi komputer seperti itu sejak tahun 1952. Ini berarti bahwa saya harus mempelajari materi selama 67 tahun terakhir. Aku akan butuh beberapa saat. Saya dapat melihat bahwa manual x86 cukup panjang 4.800 halaman untuk pembacaan yang menyenangkan dan mudah sebelum tidur.

Mungkin saya akan sedikit dimanjakan dengan sistem operasi, bahasa C, saya akan membunuh malam hari dengan kit build PiDP-11 dan besi solder, dan kemudian meninggalkan hal ini. Saya tidak tahu, kita akan lihat.

Serius, saya berpikir untuk mengeksplorasi arsitektur RISC, mungkin RISC-V. Mungkin yang terbaik untuk memulai dengan prosesor RISC awal untuk memahami asal mereka. Prosesor modern memiliki lebih banyak fitur: cache dan banyak lagi, saya ingin memahaminya. Ada banyak yang harus dipelajari.

Apakah pengetahuan ini berguna dalam pekerjaan utama saya? Mungkin bermanfaat, meski tidak mungkin. Bagaimanapun, saya menyukainya, jadi itu tidak masalah. Terima kasih sudah membaca!

Source: https://habr.com/ru/post/id453158/


All Articles