Ini adalah kurva belajar yang hebat yang tampaknya membantu saya menumbuhkan lebih banyak ide teoretis dan konseptual seputar teori/hukum tentang misteri yang mendasari sistem operasi dan kernel. Saya telah menduga, saya memiliki ide yang baik tentang bagaimana OSS bekerja. Namun, membuat OS saya sendiri benar -benar jauh lebih pasti dibandingkan dengan hanya membaca tentang. Menurut pendapat saya sendiri dan jujur. Ini adalah cara bagi saya untuk memiliki pemahaman yang lebih baik tentang perangkat lunak yang ingin saya mainkan pada mode kernel dan mode pengguna.
Sebelum kita mulai, meskipun kernel dan sistem operasi adalah 32bit. Saya akan menjelaskan konsep dalam 64 bit juga, jelas salah satu dari mereka menjadi mode panjang.
Mode
Interupsi
Deskriptor
Paging
Bacalah lebih lanjut tentang mode terlindungi di Intel® 64 dan IA-32 Architectures Software Developer's Manual Volume 3A: Panduan Pemrograman Sistem, Bagian 1; Bab 3 *
Apa yang interupsi
Anda dapat menganggap interupsi sebagai sinyal atau data yang dikirim oleh perangkat seperti keyboard, solid state drive, driver keras, atau mouse dan perangkat lunak yang memberi tahu CPU bahwa suatu peristiwa terjadi dan perlu segera menghentikan apa yang saat ini dilakukan, untuk melanjutkan ke apa yang mengirimkan interupsi.
Misalnya saat Anda memindahkan/mengklik mouse, pengontrol mouse akan mengirim interupsi ke pengontrol interupsi untuk CPU, perhatian CPU akan segera pergi ke interupsi mouse dan akan melanjutkan untuk menjalankan rutin (gerakan mouse atau mengklik). Setelah interupsi mouse, CPU akan terus melakukan apa pun sebelum interupsi atau mengelola interupsi lain jika telah menjadi sinyal.
+------------------------+ +------------+
| TYPES OF INTERRUPTS |------------| Exceptions |
+------------------------+ +------------+
/
/
/
+------------+ +------------+
| HARDWARE | | SOFTWARE |
| INTERRUPTS | | INTERRUPTS |
+------------+ +------------+
Garis IRQ, atau IRQ berbasis pin: Ini biasanya dialihkan secara statis pada chipset. Kabel atau jalur dijalankan dari perangkat pada chipset ke pengontrol IRQ yang membuat serial permintaan interupsi yang dikirim oleh perangkat, mengirimkannya ke CPU satu per satu untuk mencegah balapan. Dalam banyak kasus, pengontrol IRQ akan mengirim beberapa IRQ ke CPU sekaligus, berdasarkan prioritas perangkat. Contoh pengontrol IRQ yang sangat terkenal adalah rantai pengontrol Intel 8259, yang ada pada semua chipset kompatibel yang kompatibel dengan IBM-PC, merantai dua pengontrol bersama-sama, masing-masing menyediakan 8 pin input untuk total 16 pin pensinyalan IRQ yang dapat digunakan pada warisan IBM-PC.
Interupsi Berbasis Pesan: Ini ditandai dengan menulis nilai ke lokasi memori yang disediakan untuk informasi tentang perangkat interupsi, interupsi itu sendiri, dan informasi vektor. Perangkat diberi lokasi yang ditulisnya baik oleh firmware atau oleh perangkat lunak kernel. Kemudian, IRQ dihasilkan oleh perangkat menggunakan protokol arbitrase khusus untuk bus perangkat. Contoh bus yang menyediakan fungsi interupsi berbasis pesan adalah bus PCI. Oleh wiki.osdev - https://wiki.osdev.org/interrupts
Entri - Entri mendefinisikan wilayah dalam memori tempat memulai, bersama dengan batas wilayah dan hak akses yang terkait dengan entri. Privilege akses seperti dalam prosesor jitu jika OS berjalan di sistem (cincin 0) atau aplikasi (cincin 3). Ini mencegah aplikasi atau USERMode memiliki akses ke register/operan dan mnemonik tertentu. Seperti register CR dan CLI/STI masing -masing.
Batas - Ukuran deskriptor segmen
Pemilih Segmen - Mereka adalah register yang memegang indeks deskriptor
Untuk lebih eksplisit, indeks bukan pemilih
Hal -hal yang dimiliki Segmen Daftar:
Akses Tabel deskriptor juga memiliki hak istimewa, ini disebut RPL (Tingkat Permintaan Privilege) untuk setiap register tetapi untuk cs disebut CPL (level Privilege saat ini). Keduanya melayani tujuan yang berbeda, yang dapat Anda temukan di manual Intel atau AMD.
Tabel untuk digunakan untuk melihat ke dalam. Satu tabel adalah GDT yang lain adalah LDT.
Aturan informal untuk secara konseptual membayangkan penggunaan pemilih: jadi aturan informal adalah:
selector = index + table_to_use + privilege table_to_use + index = descriptor = semua informasi tentang segmen memori yang akan digunakan
di mana tanda plus bukan operasi aritmatika
Bidang Bit Segmen Daftar Pemilih:
15 3 2 0
+--------------------------------------------------+----+--------+
| Index | TI | RPL |
+--------------------------------------------------+----+--------+
TI = Table Indicator: 0 = GDT, 1 = LDT
The TI specify if the Descriptor were dealing with is a GDT or LDT
IF(TI == 0) THEN
... THE DESCRIPTOR IS A GDT
ELSEIF(TI == 1) THEN
... THE DESCRIPTOR IS A LDT
GDT adalah 1: 1 dengan alamat logis, contoh GDT yang bekerja dengan pemilih:
<---- Selector ----> +----- Segment Selector Register
+-------+----+-----+ v
| Index | TI | RPL | = DS
+-------+----+-----+ GDT LDT
| | +---------------------+ +---------------------+
| +------------>| Null Descriptor | | Null Descriptor |
| +---------------------+ +---------------------+
| | Descriptor 1 | | Descriptor 1 |
| +---------------------+ +---------------------+
| | | | |
| ... ... ... ... ... ... ... ...
| | |
| +---------------------+
+------------------->| Descriptor K |
+---------------------+
| |
... ... ... ...
RPL (Request Privilege Level) describes the privilege for accessing the descriptor
Kami menyimpan semua basis GDT (alamat) dan batas (ukuran GDT kami) di GDTR. GDTR menunjuk ke semua entri GDT kami dalam memori, mulai dari pangkalan. Setelah itu, kemudian dimuat dengan lgdt Mnemonic:
typedef union _gdt_descriptor
{
struct
{
uint64_t limit_low : 16 ;
uint64_t base_low : 16 ;
uint64_t base_middle : 8 ;
uint64_t access : 8 ;
uint64_t granularity : 8 ;
uint64_t base_high : 8 ;
};
} __attribute__((packed)) gdt_entry_t ;
gdt_entry_t gdt_entrys[ 256 ];
/* The GDTR (GDT Register) */
struct gdtr
{
uint16_t limit;
uint32_t base;
} __attribute__((packed)) gdtr;
...
gdtr.base = &gdt_entrys;
gdtr.limit = ( sizeof (gdt_descr) * 256 ) - 1 )
Bacalah lebih lanjut tentang itu di manual programmer arsitektur AMD64, Volume 2, Bagian 4.7 (hal. 84 - 90 {+})
Referensi untuk ini dan seterusnya. https://notes.shichao.io/utlk/ch2/#paging-in-hardware Ini adalah yang paling menyenangkan yang saya miliki, saya sangat bersemangat begitu saya memahaminya.
X86 OS WEGACY-PAGING Virtual Address dengan halaman 4KB:
x86 os cr4.pae paging alamat virtual dengan halaman 4KB:
x86_64 (IA-32E) OS CR4.LME/CR4.PAE Paging Alamat virtual dengan halaman 4KB:
• Bendera WP dan PG dalam register kontrol CR0 (bit 16 dan bit 31, masing -masing).
• The PSE, PAE, PGE, PCIDE, SMEP, SMAP, dan Bendera PKE di Control Register CR4 (Bit 4, Bit 5, Bit 7, Bit 17, Bit 20, Bit 21, dan Bit 22, masing -masing).
• Bendera LME dan NXE di IA32_efer MSR (bit 8 dan bit 11, masing -masing). • Bendera AC dalam register Eflag (bit 18). Oleh Bab 4 dari Intel® 64 dan IA-32 Arsitektur Manual Pengembang Volume 3A: Panduan Pemrograman Sistem, Bagian 1; Bab 4
• Bendera LME dan NXE di IA32_efer MSR (bit 8 dan bit 11, masing -masing). • Bendera AC dalam register Eflag (bit 18). Bab 4 dari Intel® 64 dan IA-32 Arsitektur Manual Pengembang Perangkat Lunak Volume 3A: Panduan Pemrograman Sistem, Bagian 1; Bab 4
Jika Cr4.pae dan/atau Cr4.lMe diatur ke 1, maka PSE sepenuhnya diabaikan.
Tidak ada terminal yang ditambahkan
cd smkrnl; make run
Untuk percikan inspirasi/dukungan pada upaya berkelanjutan saya pada proyek ini dan untuk membantu saya memahami konsep -konsep tertentu dalam pengembangan kernel/OS. =)