Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Driver mode kernel tertentu, seperti driver serial dan paralel, tidak perlu menjadi residen memori kecuali perangkat yang mereka kelola terbuka. Namun, selama ada koneksi atau port aktif, beberapa bagian dari kode driver yang mengelola port tersebut harus tetap ada untuk mengoperasikan perangkat. Saat port atau koneksi tidak digunakan, kode driver tidak diperlukan. Sebaliknya, driver untuk disk yang berisi kode sistem, kode aplikasi, atau file halaman sistem harus selalu menjadi memory-resident karena driver terus mentransfer data antara perangkatnya dan sistem.
Driver untuk perangkat yang digunakan secara spokal (seperti modem) dapat membebaskan ruang sistem saat perangkat yang dikelolanya tidak aktif. Jika Anda menempatkan di satu bagian kode yang harus tetap ada untuk melayani perangkat aktif, dan jika driver Anda mengunci kode di memori saat perangkat sedang digunakan, Anda dapat menunjuk bagian ini sebagai dapat dipage. Ketika driver dibuka, sistem operasi memasukkan bagian yang dapat dipaginasi ke dalam memori dan driver menguncinya hingga tidak diperlukan lagi.
Kode driver audio CD sistem menggunakan teknik ini. Kode untuk driver dikelompokkan ke dalam bagian yang dapat di-pageable sesuai dengan produsen perangkat CD. Merek tertentu mungkin tidak pernah ada pada sistem tertentu. Selain itu, bahkan jika CD-ROM ada pada sistem, mungkin jarang diakses, sehingga pengelompokan kode ke dalam bagian yang dapat di-pageable berdasarkan jenis CD memastikan bahwa kode untuk perangkat yang tidak ada di komputer tertentu tidak pernah dimuat. Namun, ketika perangkat diakses, sistem memuat kode untuk perangkat CD yang sesuai. Then the driver calls the MmLockPagableCodeSection routine, as described later in this article, to lock its code into memory while its device is being used.
Untuk mengisolasi kode yang dapat dipindahkan ke halaman ke dalam bagian yang diberi nama, tandai dengan direktif kompilator berikut:
#pragma alloc_text(PAGE*Xxx***, *RoutineName***)
The name of a pageable code section must start with the four letters "PAGE" and can be followed by up to four characters (represented here as Xxx) to uniquely identify the section. Empat huruf pertama dari nama bagian (yaitu, "HALAMAN") harus dikapitalisasi. The RoutineName identifies an entry point to be included in the pageable section.
Nama terpendek yang valid untuk bagian kode yang dapat di-pageable dalam file driver hanyalah PAGE. Misalnya, arahan pragma dalam contoh kode berikut mengidentifikasi RdrCreateConnection sebagai titik masuk di bagian kode yang dapat di-pageable bernama PAGE.
#ifdef ALLOC_PRAGMA
#pragma alloc_text(PAGE, RdrCreateConnection)
#endif
MmLockPagableCodeSection locks in the whole contents of the section that contains the routine referenced in the call. In other words, this call makes every routine associated with the same PAGEXxx identifier resident and locked in memory. In other words, this call makes every routine associated with the same PAGEXxx identifier resident and locked in memory.
MmLockPagableCodeSection returns a handle to be used when unlocking the section (by calling the MmUnlockPagableImageSection routine) or when the driver must lock the section from additional locations in its code.
Driver juga dapat memperlakukan data yang jarang digunakan sebagai bisa dipindahkan ke memori yang dapat dipaging sehingga data tersebut juga dapat dipindahkan sampai perangkat yang didukungnya aktif. Misalnya, driver mixer sistem menggunakan data yang dapat di-page. Perangkat mixer tidak memiliki I/O asinkron yang terkait dengannya, sehingga driver ini dapat membuat datanya dapat dipaging.
Nama bagian data yang dapat di-pageable harus dimulai dengan empat huruf "PAGE" dan dapat diikuti hingga empat karakter untuk mengidentifikasi bagian secara unik. Empat huruf pertama dari nama bagian (yaitu, "HALAMAN") harus dikapitalisasi.
Hindari menetapkan nama yang identik ke bagian kode dan data. Untuk membuat kode sumber lebih mudah dibaca, pengembang driver biasanya menetapkan nama HALAMAN ke bagian kode yang dapat di-page karena nama ini pendek dan mungkin muncul di banyak direktif pragma alloc_text. Nama yang lebih panjang kemudian ditetapkan ke bagian data yang dapat di-paging (misalnya, PAGEDATA untuk data_seg, PAGEBSS untuk bss_seg, dan sebagainya) yang mungkin diperlukan oleh driver.
Misalnya, dua arahan pragma pertama dalam contoh kode berikut menentukan dua bagian data yang dapat di-pageable, PAGEDATA dan PAGEBSS. PAGEDATA dinyatakan menggunakan arahan pragma data_seg dan berisi data yang diinisialisasi. PAGEBSS dinyatakan menggunakan direktif pragma bss_seg dan memuat data yang belum diinisialisasi.
#pragma data_seg("PAGEDATA")
#pragma bss_seg("PAGEBSS")
INT Variable1 = 1;
INT Variable2;
CHAR Array1[64*1024] = { 0 };
CHAR Array2[64*1024];
#pragma data_seg()
#pragma bss_seg()
Dalam contoh kode ini, Variable1 dan Array1 secara eksplisit diinisialisasi dan oleh karena itu ditempatkan di bagian PAGEDATA.
Variable2 dan Array2 secara implisit diinisialisasi nol dan ditempatkan di bagian PAGEBSS.
Menginisialisasi variabel global secara implisit menjadi nol mengurangi ukuran file yang dapat dieksekusi pada disk dan lebih disukai daripada inisialisasi eksplisit menjadi nol. Inisialisasi nol eksplisit harus dihindari kecuali jika diperlukan untuk menempatkan variabel di bagian data tertentu.
To make a data section memory-resident and lock it in memory, a driver calls MmLockPagableDataSection, passing a data item that appears in the pageable data section. MmLockPagableDataSection returns a handle to be used in subsequent locking or unlocking requests.
To restore a locked section's pageable status, call MmUnlockPagableImageSection, passing the handle value returned by MmLockPagableCodeSection or MmLockPagableDataSection, as appropriate. A driver's Unload routine must call MmUnlockPagableImageSection to release each handle it obtains for lockable code and data sections.
Mengunci bagian adalah operasi yang mahal karena manajer memori harus mencari daftar modul yang dimuat sebelum mengunci halaman ke dalam memori. If a driver locks a section from many locations in its code, it should use the more efficient MmLockPagableSectionByHandle after its initial call to MmLockPagableXxxSection.
The handle passed to MmLockPagableSectionByHandle is the handle returned by the earlier call to MmLockPagableCodeSection or MmLockPagableDataSection.
The memory manager maintains a count for each section handle and increments this count every time that a driver calls MmLockPagableXxx for that section. A call to MmUnlockPagableImageSection decrements the count. Meskipun penghitung untuk pegangan bagian apa pun bukan nol, bagian tersebut tetap terkunci dalam memori.
Pegangan pada bagian tersebut adalah valid selama pengandar tersebut dimuat. Therefore, a driver should call MmLockPagableXxxSection only one time. If the driver requires more locking calls, it should use MmLockPagableSectionByHandle.
Jika bagian dipindah ke disk saat prosedur penguncian dipanggil, manajer memori memuat bagian tersebut dan mengatur jumlah referensinya menjadi satu. If the section is paged out when the lock routine is called, the memory manager pages in the section and sets its reference count to one.
Menggunakan teknik ini meminimalkan efek driver pada sumber daya sistem. Ketika driver berfungsi, driver dapat mengunci ke dalam memori kode dan data yang harus tetap residen. Ketika tidak ada permintaan I/O yang tertunda untuk perangkatnya, (yaitu, ketika perangkat ditutup atau jika perangkat tidak pernah dibuka), pengendali dapat membuka kunci kode atau data yang sama, sehingga dapat dipindahkan keluar halaman.
Namun, setelah driver menghubungkan interupsi, kode driver apa pun yang dapat dipanggil selama pemrosesan interupsi harus selalu berada dalam residen memori. Meskipun beberapa driver perangkat dapat diatur menjadi halaman memori atau dikunci dalam memori sesuai permintaan, beberapa set inti kode dan data driver tersebut harus secara permanen tetap berada di ruang sistem.
Pertimbangkan panduan implementasi berikut untuk mengunci kode atau bagian data.
The primary use of the Mm(Un)LockXxx routines is to enable normally nonpaged code or data to be made pageable and brought in as nonpaged code or data. Driver seperti driver serial dan driver paralel adalah contoh yang baik: jika tidak ada handel terbuka ke perangkat yang dikelola driver seperti itu, bagian kode tidak diperlukan dan dapat tetap di-paged out. Pengalih dan server juga merupakan contoh driver yang baik yang dapat menggunakan teknik ini. Ketika tidak ada koneksi aktif, kedua komponen ini dapat dikeluarkan dari memori.
Seluruh bagian yang dapat di-pageable dikunci ke dalam memori.
Satu bagian untuk kode dan satu untuk data per driver efisien. Banyak bagian bernama yang dapat di-pageable umumnya tidak efisien.
Pisahkan bagian yang sepenuhnya dapat dihalaman dan bagian yang dihalaman tetapi dikunci sesuai permintaan.
Rutinitas ini dapat menyebabkan aktivitas I/O berat ketika manajer memori memuat bagian . If a driver must lock a section from several locations in its code, it should use MmLockPagableSectionByHandle. If a driver must lock a section from several locations in its code, it should use MmLockPagableSectionByHandle.