Anda di halaman 1dari 8

Sebuah sistem komputer terdiri dari perangkat keras dan perangkat lunak yang bekerja sama

untuk menjalankan program-program aplikasi. Implementasi khusus dari sistem berubah seiring
berjalannya waktu, tapi konsep dasarnya tidak. Semua sistem komputer memiliki kesamaan
komponen perangkat keras dan perangkat lunak yang melakukan fungsi serupa. Buku ini ditulis
untuk programmer yang ingin keahlian mereka lebih baik dengan memahami
bagaimana komponen ini bekerja dan bagaimana cara melakukan kecocokan dan kinerja
dari program mereka.
Anda siap untuk perjalanan yang menyenangkan. Jika Anda mendedikasikan diri untuk
belajar konsep-konsep dalam buku ini, maka anda akan menjadi seorang yang langka kekuatan
programer dengan mendapat pencerahan oleh pemahaman tentang sistem komputer yang
mendasar dan dampaknya terhadap program aplikasi Anda.
Anda akan belajar keterampilan praktis seperti bagaimana menghindari numeric yang
membingungkan disebabkan oleh cara komputer merepresentasikan angka. Anda akan belajar
caranya untuk mengoptimalkan kode C Anda dengan menggunakan trik pintar yang
memanfaatkan desain modern prosesor dan sistem memori. Anda akan belajar bagaimana
compiler mengimplementasikan prosedur panggilan dan bagaimana menggunakan pengetahuan
ini untuk menghindari lubang keamanan penyangga dari luapan kerentanan yang mengganggu
jaringan dan perangkat lunak internet.
Kamu akan belajar bagaimana mengenali dan menghindari kesalahan buruk selama
menghubungkan suatu hal yang membingungkan yang dialami pemrogram rata-rata.
Anda akan belajar bagaimana menulis shell Unix Anda sendiri memiliki paket alokasi
penyimpanan dinamis, dan bahkan server Web Anda sendiri. Kamu akan Pelajari janji dan
perangkap concurrency, topik yang semakin penting sebagai beberapa core prosesor terintegrasi
ke dalam chip tunggal.
Dalam teks klasik mereka pada bahasa pemrograman C , Kernighan dan Ritchie mengenalkan
pembaca kepada C dengan menggunakan program Hello world yang ditunjukkan pada Gambar
1.1. Meskipun Hello world adalah program yang sangat sederhana, setiap bagian utama sistem
harus bekerja di konser agar bisa berjalan sampai selesai. Dalam arti, tujuan buku ini adalah
untuk membantu Anda memahami apa yang terjadi dan mengapa, saat Anda menjalankan
program hello world pada sistem anda.Kami memulai studi tentang sistem dengan menelusuri
masa program hello world, Sejak saat itu diciptakan oleh seorang programmer, sampai berjalan
pada sebuah sistem, mencetak pesan sederhana, dan berakhir. Seiring kita mengikuti masa
program, kita akan lakukan secara singkat dengan memperkenalkan konsep utama, terminologi,
dan komponen yang masuk ke dalamnya memproses. Bab selanjutnya akan memperluas gagasan
ini.
1.1 Informasi Apakah Bits + Konteks
Program hello world kami memulai kehidupan sebagai program sumber (atau sumber file) yang
Dibuat programmer dengan editor dan menyimpan dalam teks hello.c. source programnya adalah
urutan bit, masing-masing dengan nilai 0 atau 1, terorganisir dalam potongan 8 bit yang disebut
byte. Setiap byte mewakili beberapa karakter teks dalam program.
Sebagian besar sistem modern mewakili teks dengan menggunakan standar ASCII yang
mewakili setiap karakter dengan sebuah keunikan ukuran byte nilai integer. Sebagai contoh,
Gambar 1.2 menunjukkan representasi dari program ASCII.
Program hello.c disimpan dalam sebuah file sebagai urutan byte. Setiap byte memiliki
nilai integer yang sesuai dengan beberapa karakter. Misalnya, byte pertama
memiliki nilai integer 35, yang sesuai dengan karakter #. Byte kedua
memiliki nilai integer 105, yang sesuai dengan karakter i, dan seterusnya. Melihat
bahwa setiap baris teks diakhiri dengan karakter newline tak terlihat \n, yaitu
diwakili oleh nilai integer 10. File seperti hello.c yang terdiri secara eksklusif
dari karakter ASCII dikenal sebagai text files. Semua files lainnya dikenal sebagai binary file.
Presentasi dari hello.c menggambarkan secara mendasar : semua informasi
dalam sistem - termasuk disk files, program yang tersimpan dalam memori, data pengguna
tersimpan di dalam memori, dan data yang ditransfer melintasi jaringan - digambarkan sebagai
sekumpulan bit.
Satu-satunya hal yang membedakan objek data berbeda adalah konteksnya
Yang kita lihat. Misalnya, dalam konteks yang berbeda, urutan byte yang sama
mungkin mewakili integer, foating point number, character string, atau petunjuk mesin.
Asprogramer, kita perlu memahami representasi dari angka-angka karena mereka tidak sama
dengan bilangan bulat dan bilangan real. Mereka adalah perkiraan terbatas yang dapat
berperilaku dengan cara yang tak terduga. Ide dasarnya akan dieksplorasi secara rinci dalam Bab
2.
Asal usul bahasa pemrograman C
C dikembangkan dari tahun 1969 sampai 1973 oleh Dennis Ritchie dari Bell Laboratories.
Amerika Nasional Standards Institute (ANSI) menilai standar ANSI C pada tahun 1989, dan
standarisasi ini kemudian menjadi tanggung jawab Organisasi Standar Internasional (ISO).
Standar the C bahasa dan seperangkat fungsi perpustakaan yang dikenal sebagai perpustakaan
standar C. Kernighan dan Ritchie menjelaskan
ANSI C dalam buku klasik mereka, yang dikenal sebagai K & R. Di dalamnya Ritchie berkata
C adalah aneh,cacat, dan sebuah kesuksesan yang luar biasa , Jadi kenapa kesuksesan?
C terkait erat dengan sistem operasi unix. C dikembangkan sejak awal sebagai bahasa
pemrograman sistem untuk Unix Sebagian besar kernel Unix, dan semua alat
pendukungnya dan perpustakaan, ditulis dalam bahasa C. Karena Unix menjadi populer
di universitas pada akhir 1970-an dan awal 1980-an, banyak orang terpapar C dan
menemukan bahwa mereka menyukainya. Sejak Unix ditulis hampir seluruhnya di C,
bisa dengan mudah di porting ke mesin baru, yang menciptakan khalayak yang lebih luas
lagi baik C dan Unix.
C adalah kecil, bahasa sederhana. Desainnya dikontrol oleh satu orang, bukan daripada
komite, dan hasilnya adalah desain yang bersih dan konsisten dengan sedikit bagasi.
Buku K&R menggambarkan bahasa lengkap dan perpustakaan standar, dengan banyak
contoh dan latihan, hanya dalam 261 halaman. Kesederhanaan C membuatnya relatif
mudah dipelajari dan dipasarkan ke komputer yang berbeda.
C dirancang untuk tujuan praktis. C dirancang untuk mengimplementasikan sistem
operasi Unix. Belakangan, orang lain menemukan bahwa mereka bisa menulis program
yang mereka inginkan, tanpa bahasa yang menghalangi.
C adalah bahasa pilihan untuk pemrograman sistem, dan ada basis terinstal besar
program aplikasi juga. Namun, itu tidak sempurna untuk semua programmer dan semua situasi.
C pointer adalah sumber umum kebingungan dan kesalahan pemrograman. C juga tidak memiliki
dukungan eksplisit untuk abstraksi yang berguna seperti kelas, objek, dan pengecualian. Bahasa
yang lebih baru seperti C ++ dan Java alamat isu-isu ini untuk program aplikasi.

1.2 Program Apakah Yang Diterjemahkan oleh Program lain ke Bentuk Yang
Berbeda
Program hello world memulai kehidupan sebagai program C tingkat tinggi karena dapat dibaca
dan dipahami oleh manusia dalam bentuk itu. Namun, untuk menjalankan hello.c pada sistem,
pernyataan C individu harus diterjemahkan oleh program lain ke urutan instruksi bahasa mesin
bertingkat rendah. Instruksi ini kemudian dikemas dalam bentuk yang disebut executable object
files dan disimpan sebagai biner disk file. Program objek juga disebut sebagai metode yang dapat
diverifikasi.
Pada sistem Unix, terjemahan dari file sumber ke file objek dilakukan oleh compiler driver:
Di sini, kompiler Gcc membaca sumber hello.c dan menerjemahkannya menjadi
sebuah objek yang dapat dieksekusi file hello. Terjemahan dilakukan dalam urutan
dari empat fasa yang ditunjukkan pada Gambar 1.3. Program yang melakukan empat fase
(preprocessor, compiler, assembler, dan linker) dikenal secara kolektif sebagai
Compilation system.
Fase Preprocessing. preprocessor (cpp) memodifikasi program C asli sesuai arahan yang
diawali dengan karakter #. Misalnya, #include<stdio.h> adalah perintah di line pertama
yang menjelaskan kepada preprocessor untuk membaca isi dari sistem header stdio.h dan
memasukkannya secara langsung ke dalam teks program , Hasilnya di program C
lainnya,biasanya dengan perintah i.suffix
Fase Compilation . kompilator (cc1)menerjemahkan teks hello.i ke dalam teks hello.s,
yang berisi program bahasa assembly. Setiap pernyataan dalam program bahasa assembly
persis menggambarkan satu level rendah instruksi bahasa mesin dalam bentuk teks
standar. Bahasa assembly adalah berguna karena menyediakan bahasa output yang umum
untuk kompiler yang berbeda untuk bahasa tingkat tinggi yang berbeda. Misalnya,
kompiler C dan Fortran kompiler keduanya menghasilkan output dalam bahasa assembly
yang sama.
Fase Assembly, assembler (as) menerjemahkan hello.s menjadi instruksi bahasa mesin,
paket mereka dalam bentuk yang dikenal sebagai program relocatable object, dan
menyimpan hasilnya di objek hello.o.file hello.o ini adalah sebuah file biner yang bytenya
menyandikan instruksi bahasa mesin daripada karakter. Jika kita melihat hello.o dengan
editor teks, itu akan muncul menjadi omong kosong.
Linking phase. Perhatikan bahwa program hello memanggil fungsi printf, yang adalah
bagian dari library C standar yang disediakan oleh setiap compiler C. fungsi printf berada
pada file object precompliled terpisah yang disebut printf.o, yang pasti bisa digabungkan
dengan program hello.o kami.Linker (id)menangani pengagabungan ini. Hasilnya file
hello, yang adalah executable object fle siap di load ke memori dan dieksekusi oleh
sistem.
Proyek GNU
GCC adalah salah satu dari banyak alat yang berguna yang dikembangkan oleh proyek GNU
(singkatan dari GNUs bukan Unix). Proyek GNU adalah sebuah amal bebas-pajak yang dimulai
oleh Richard Stallman pada tahun 1984, dengan tujuan ambisius
mengembangkan sistem seperti Unix yang lengkap yang kode sumbernya tidak terbebani oleh
batasan bagaimana caranya itu bisa dimodifikasi atau didistribusikan. Proyek GNU telah
mengembangkan lingkungan dengan semua yang utama komponen dari sistem operasi Unix,
kecuali kernel, yang dikembangkan secara terpisah oleh proyek Linux Lingkungan GNU
mencakup editor EmAcs, compiler Gcc, debugger GDb, assembler, linker, utilitas untuk
memanipulasi binari, dan komponen lainnya. Kompiler Gcc memiliki tumbuh untuk mendukung
berbagai bahasa, dengan kemampuan menghasilkan kode untuk banyak hal yang berbeda
mesin. Bahasa yang didukung meliputi C, C ++, Fortran, Java, Pascal, Objective-C, dan Ada.
Proyek GNU merupakan prestasi yang luar biasa, namun seringkali terlewatkan. Buka modern
pergerakan sumber (umumnya terkait dengan Linux) berutang asal intelektualnya ke proyek
GNU Gagasan tentang perangkat lunak bebas (bebas seperti dalam bebas berbicara, not
bebas bir. Selanjutnya, Linux berutang banyak popularitas pada alat GNU, yang menyediakan
lingkungan untuk kernel Linux.

1.3 Bayaran ini untuk Memahami Bagaimana Kompilasi Sistem Kerja


Untuk program sederhana seperti hello.c, kita bisa mengandalkan sistem kompilasi untuk
menghasilkan kode mesin yang benar dan efisien. Namun, ada beberapa hal penting
Alasan mengapa programmer perlu memahami bagaimana sistem kompilasi bekerja:
Mengoptimalkan kinerja program.Kompiler modern adalah alat yang canggih yang
biasanya menghasilkan kode yang bagus. Sebagai programmer, kita tidak perlu tahu
kedalaman pekerjaan compiler untuk menulis kode yang mudah. Namun, Untuk membuat
keputusan coding yang baik dalam program C kami, kami memerlukan a pemahaman
dasar kode mesin dan bagaimana compiler menerjemahkan berbagai pernyataan C ke
dalam kode mesin. Misalnya, adalah pernyataan switchselalu lebih efesien dari pada
urutan pernyataan if-else? Berapa banyak overhead dikeluarkan oleh pemanggilan
fungsi? Apakah loop terpisah lebih efektif daripada sebuah loop? Apakah referensi
pointer lebih efektif daripada indeks array? Mengapa apakah loop kita berjalan jauh lebih
cepat jika kita menjumlahkan ke variabel lokal dan bukan sebuah Argumen yang
dilewatkan dengan referensi? Bagaimana bisa fungsi berjalan lebih cepat saat kita cukup
atur ulang tanda kurung dalam ekspresi aritmatika?
Pada Bab 3, kami akan memperkenalkan dua bahasa mesin terkait: IA32, the 32-bit kode
penghasilkan besarnya di bawah piramida Linux, Windows, dan baru-baru ini sistem
operasi Macintosh, dan x8-64, sebuah 64-bit ekstensi ditemukan di mikroprosesor yang
lebih baru. Kami menggambarkan bagaimana kompiler menerjemahkan konstruksi C
yang berbeda ke dalam bahasa-bahasa ini. Dalam Bab 5, Anda akan melakukannya
belajar bagaimana menyempurnakan kinerja program C Anda dengan membuat yang
sederhana transformasi ke kode C yang membantu compiler melakukan tugasnya dengan
lebih baik. Di Bab 6, Anda akan belajar tentang sifat hierarkis dari sistem memori,
bagaimana kompiler C menyimpan array data di memori, dan bagaimana program C
Anda bisa memanfaatkan pengetahuan ini untuk berjalan lebih efektif.
Memahami kesalahan waktu link. Dalam pengalaman kami, beberapa yang paling
membingungkan kesalahan pemrograman terkait dengan pengoperasian linker, terutama
ketika Anda mencoba untuk membangun sistem perangkat lunak yang besar. Misalnya,
apa fungsinya? itu berarti ketika linker melaporkan bahwa ia tidak dapat menyelesaikan
referensi? Apakah yang perbedaan antara variabel statis dan variabel global? Apa yang
terjadi jika Anda mendefinisikan dua variabel global dalam file C yang berbeda dengan
nama yang sama? Apakah perbedaan antara perpustakaan statis dan perpustakaan
dinamis? Mengapa demikian? materi apa urutan kami daftar perpustakaan pada baris
perintah? Dan yang paling menakutkan, mengapa beberapa error terkait linker tidak
muncul sampai run time? Kamu akan belajar jawaban atas pertanyaan semacam ini di
Bab 7.

Menghindari lubang keamanan. Selama bertahun-tahun, buffer melebihi kerentanan


menyumbang sebagian besar lubang keamanan di server jaringan dan internet.
Kerentanan ada karena sedikit programmer mengerti kebutuhannya untuk secara hati-hati
membatasi jumlah dan bentuk data yang mereka terima dari yang tidak dipercaya sumber.
Langkah awal dalam belajar pemrograman yang aman adalah memahami urutan cara data
dan informasi kontrol disimpan pada program tumpukan. Kami menutupi tumpukan
disiplin dan penyangga di atas kerentanan di Bab 3 sebagai bagian dari studi bahasa
assembly kita. Kita juga akan belajar Metode yang bisa digunakan oleh programmer,
compiler, dan sistem operasi untuk mengurangi ancaman serangan.

1.4 Prosesor Baca dan Menafsirkan Instruksi Tersimpan Dalam Memori


Pada titik ini, program sumber kami telah diterjemahkan oleh kompilasi
sistem menjadi objek yang dapat dieksekusi disebut hello yang tersimpan di disk. Untuk me-run
file yang dapat dieksekusi pada sistem Unix, kita mengetik namanya ke program aplikasi
dikenal sebagai shell:

Shell adalah baris perintah yang mencetak secara cepat, menunggu anda untuk mengetikkan
baris perintah , dan kemudian melakukan perintah. Jika kata pertama dari perintah
line tidak sesuai dengan perintah shell built-in, maka shell mengasumsikan itu
itu adalah nama dari sebuah file executable yang harus dimuat dan dijalankan. Jadi dalam kasus
ini, beban shell dan menjalankan program hello dan kemudian menunggu untuk
menghentikannya. Program hello mencetak pesannya ke layar bertingkat dan kemudian berakhir.
Kemudian shell mencetak secara cepat dan menunggu baris perintah masukan berikutnya.

1.4.1 Organisasi Hardware Dari Sebuah Sistem


Untuk memahami apa yang terjadi pada program hello kita saat kita menjalankannya, kita
membutuhkannya untuk memahami organisasi perangkat keras dari sistem yang khas, yang
ditunjukkan di dalamGambar 1.4. Gambar khusus ini dimodelkan menurut keluarga Intel
Pentium
sistem, tapi semua sistem memiliki tampilan dan nuansa yang sama. Jangan khawatir tentang
Kompleksitas dari gambar ini sekarang. Kami akan mendapatkan berbagai detailnya secara
bertahap sepanjang perjalanan buku.
Bus
Menjalankan seluruh sistem adalah kumpulan saluran listrik yang disebut bus
yang membawa byte informasi bolak-balik antara komponen. Bus biasanya dirancang untuk
mentransfer potongan byte berurutan yang dikenal sebagai kata-kata. Itu jumlah byte dalam satu
kata (ukuran kata) adalah parameter sistem dasar itu bervariasi antar sistem Kebanyakan mesin
saat ini memiliki ukuran kata dari 4 byte (32 bit) atau 8 byte (64 bit). Demi diskusi kita disini,
kita akan mengambil sebuah kata ukuran 4 byte, dan kita akan mengasumsikan bahwa bus hanya
mentransfer satu kata pada satu waktu.
Perangkat I / O
Perangkat input / output (I / O) adalah koneksi sistem ke dunia luar. Kami
Contoh sistem memiliki empat perangkat I / O: keyboard dan mouse untuk input pengguna, a
display untuk output pengguna, dan disk drive (atau hanya disk) untuk penyimpanan lama
data dan program Awalnya, program the executable berada pada disk.
Masing-masing / OdeviceisconnectedtotheI / Obusbyeitheracontroller oranadapter.
Perbedaan antara keduanya terutama adalah salah satu kemasannya. Controller adalah chip
set pada perangkat itu sendiri atau pada papan sirkuit utama sistem (sering disebut
motherboard). Adaptor adalah kartu yang dihubungkan ke slot pada motherboard.
Apapun, tujuan masing-masing adalah untuk mentransfer informasi bolak-balik antara
bus I / O dan perangkat I / O.
Bab 6 lebih banyak mengatakan tentang bagaimana perangkat I / O seperti disk bekerja. Di
Bab 10, Anda akan mengetahui bagaimana menggunakan antarmuka I / O Unix untuk mengakses
perangkat program aplikasi anda Kami fokus pada kelas perangkat yang sangat menarik
dikenal sebagai jaringan, tapi teknik-teknik ini juga bisa digunakan untuk jenis perangkat
lainnya.
Memori utama
Memori utama adalah perangkat penyimpanan sementara yang menampung kedua program dan
data yang dimanipulasi sementara prosesor menjalankan program. Secara fisik,
ciri utama dari ingatan tentang riwayat demam kasar (DRAM)
keripik. Logikanya, memori diorganisasikan sebagai array linear byte, masing-masing dengan
miliknya sendiri
alamat unik (indeks array) mulai dari nol. Secara umum, masing-masing mesin
instruksi yang merupakan program dapat terdiri dari sejumlah variabel byte.
Ukuran item data yang sesuai dengan variabel program C bervariasi menurut
ketik.Misalkan, pada sebuah IA32 mesin yang menjalankan linux, data tipe pendek
membutuhkan dua byte, tipe int, float,dan panjang empat byte dan tipe dounle 8 bytes
Bab 6 lebih banyak dikatakan tentang bagaimana teknologi memori seperti DRAM
chip bekerja, dan bagaimana mereka digabungkan untuk membentuk memori utama.
Prosesor
Unit pemrosesan pusat (CPU), atau hanya prosesor, adalah mesin yang menafsirkan
(mengeksekusi)yang tersimpan dalam memori utama. Pada intinya adalah kata-kata
perangkat penyimpanan (atau register) disebut program counter (PC). Pada suatu saat,
titik PC di (berisi alamat) beberapa instruksi bahasa mesin di memori utama.
Dari saat power tersebut diaplikasikan ke sistem, sampai saat itu daya dimatikan, prosesor
berulang kali menjalankan instruksi yang ditunjukkan oleh
Program counter dan kemudian update PC untuk menunjuk ke instruksi berikutnya.Sebuah
prosesor tampaknya beroperasi sesuai dengan eksekusi instruksi yang sangat sederhana
model, ditetapkan oleh arsitektur set instruksi. Dalam instruksi model ini dijalankan secara ketat,
dan melaksanakan instruksi tunggal melibatkan melakukan serangkaian langkah. Prosesor
membaca instruksi dari memori yang ditunjukkan oleh program counter (PC), menafsirkan bit
dalam instruksi, melakukan beberapa sederhana operasi didikte oleh instruksi, dan kemudian
update PC untuk menunjuk ke yang berikutnya instruksi, yang mungkin atau mungkin tidak
bersebelahan dalam ingatan dengan instruksi itu baru saja dieksekusi
Hanya ada beberapa operasi sederhana ini, dan semuanya berputar
memori utama, register file, dan unit aritmetika (ALU). Pendaftaran file adalah perangkat
penyimpanan kecil yang terdiri dari kumpulan register ukuran kata, dengan nama tersendiri.
ALU menghitung nilai data dan alamat baru.
Berikut adalah beberapa contoh operasi sederhana yang mungkin dilakukan CPU
atas permintaan sebuah instruksi:

Anda mungkin juga menyukai