Pertama, ini tidak ada hubungannya dengan RAM, sungguh. Kita berbicara tentang ruang alamat di sini - bahkan jika Anda hanya memiliki 16 MiB memori, Anda masih memiliki ruang alamat 32 bit penuh pada CPU 32-bit.
Ini sudah menjawab pertanyaan pertama Anda, sungguh - pada saat ini dirancang, PC dunia nyata tidak punya tempat di dekat memori 4 GiB penuh; mereka lebih banyak di kisaran memori 1-16 MiB. Ruang alamat, untuk semua maksud dan tujuan, gratis.
Sekarang, mengapa 0xFFFFFFF0 tepatnya? CPU tidak tahu berapa banyak BIOS yang ada. Beberapa BIOS mungkin hanya mengambil beberapa kilobyte, sementara yang lain mungkin mengambil megabita penuh memori - dan saya bahkan tidak masuk ke berbagai RAM opsional. CPU harus tertanam pada beberapa alamat untuk memulai - tidak ada yang bisa mengkonfigurasi CPU. Tapi ini hanya pemetaan ruang alamat - alamat dipetakan langsung ke dalam chip ROM BIOS (ya, ini berarti Anda tidak mendapatkan akses ke RAM 4 GiB penuh pada saat ini jika Anda memiliki banyak - tetapi itu bukan sesuatu yang istimewa, banyak perangkat memerlukan jangkauannya sendiri dalam ruang alamat). Pada CPU 32-bit, alamat ini memberi Anda 16 byte penuh untuk melakukan inisialisasi yang sangat mendasar - yang cukup untuk mengatur segmen Anda dan, jika perlu, mode alamat (ingat,boot nyata "prosedur". Pada titik ini, Anda tidak menggunakan RAM sama sekali - itu semua hanya ROM yang dipetakan. Faktanya, RAM bahkan belum siap untuk digunakan pada saat ini - itulah salah satu tugas BIOS POST! Sekarang, Anda mungkin berpikir - bagaimana mode nyata 16-bit mengakses alamat 0xFFFFFFF0? Tentu, ada segmen, jadi Anda memiliki ruang alamat 20-bit, tapi itu masih belum cukup baik. Nah, ada trik untuk itu - 12 bit tinggi dari alamat ditetapkan sampai Anda melakukan lompatan panjang pertama Anda, memberi Anda akses ke ruang alamat tinggi (sambil menolak akses ke sesuatu yang lebih rendah dari 0xFFF00000 - sampai Anda melakukan lompatan panjang) .
Semua ini adalah hal-hal yang sebagian besar disembunyikan dari programmer (belum lagi pengguna) pada sistem operasi modern. Anda biasanya tidak memiliki akses ke tingkat yang sangat rendah - beberapa hal sudah di luar penyelamatan (Anda tidak dapat beralih mode CPU mau tidak mau), beberapa secara eksklusif ditangani oleh kernel OS.
Jadi pandangan yang lebih baik datang dari pengkodean old-school pada MS DOS. Contoh khas lain dari memori perangkat yang dipetakan langsung ke ruang alamat adalah akses langsung ke memori video. Misalnya, jika Anda ingin menulis teks ke tampilan dengan cepat, Anda menulis langsung ke alamat B800:0000
(plus offset - dalam mode teks 80x25, ini berarti (y * 80 + x) * 2
jika ingatan saya tepat - dua byte per karakter, baris demi baris). Jika Anda ingin menggambar piksel demi piksel, Anda menggunakan mode grafik dan alamat awal A000:0000
(biasanya, 320x200 pada 8 bit per piksel). Melakukan sesuatu yang berkinerja tinggi biasanya berarti menyelam ke dalam manual perangkat, untuk mengetahui cara mengaksesnya secara langsung.
Ini bertahan sampai hari ini - hanya disembunyikan. Pada Windows, Anda dapat melihat alamat memori yang dipetakan ke perangkat di Device manager - cukup buka properti seperti kartu jaringan Anda, buka tab Resources - semua item Memory Range adalah pemetaan dari memori perangkat ke ruang alamat utama Anda. Dan pada 32-bit, Anda akan melihat bahwa sebagian besar perangkat tersebut dipetakan di atas tanda 2 GiB (kemudian 3 GiB) - sekali lagi, untuk meminimalkan konflik dengan memori yang dapat digunakan pengguna, meskipun ini sebenarnya bukan masalah dengan memori virtual ( aplikasi tidak sampai mendekati ruang alamat perangkat keras yang sebenarnya - mereka memiliki sebagian besar memori tervirtualisasi, yang mungkin dipetakan ke RAM, ROM, perangkat atau file halaman, misalnya).
Adapun stack, well, itu akan membantu untuk memahami bahwa secara default, stack tumbuh dari atas. Jadi jika Anda melakukan push
, penunjuk tumpukan baru akan berada di 0xFFFFFEC
- dengan kata lain, Anda tidak mencoba untuk menulis ke alamat BIOS init :) Yang tentu saja berarti bahwa rutinitas BIOS init dapat menggunakan tumpukan dengan aman, sebelum memetakannya kembali suatu tempat yang lebih berguna. Dalam pemrograman old-school, sebelum paging menjadi default de facto, stack biasanya dimulai pada akhir RAM, dan "stack overflow" terjadi ketika Anda mulai menimpa memori aplikasi Anda. Perlindungan memori mengubah banyak hal ini, tetapi secara umum, itu mempertahankan kompatibilitas mundur sebanyak mungkin - perhatikan bagaimana bahkan CPU x86-64 yang paling modern masih dapat mem-boot MS DOS 5 - atau bagaimana Windows masih dapat menjalankan banyak aplikasi DOS yang tidak memiliki ide tentang paging.