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 sampelKode 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 ScottBuku 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
Saya 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 GLFWDengan 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 teksSaya 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!