Bagian situs
Pilihan Editor:
- Program pengenalan ucapan Rusia terbaik Pengenalan ucapan offline cara menonaktifkan
- Bagaimana cara mengetahui VID, PID flashdisk dan untuk apa nomor identifikasi tersebut?
- Huawei P8Lite - Spesifikasi
- Cara membuka kunci ponsel Xiaomi jika Anda lupa kata sandi
- Apptools: cara mendapatkan uang dengan bermain
- Lenovo Vibe K5 Plus - Spesifikasi Spesifikasi Audio dan Kamera
- Memutuskan untuk beralih dari Windows ke Mac?
- Cara menggunakan Google Foto, ikhtisar fungsi login Google foto
- Sistem pembayaran Payza (ex-Alertpay) Login Payza ke akun pribadi Anda
- Bagaimana cara membuka APK dan cara mengeditnya?
Periklanan
Inti semantik - bagaimana cara menyusunnya dengan benar? Mari kita menulis kernel! Kami membuat kernel kerja paling sederhana dari sistem operasi Kernel semantik halaman. |
Mari kita menulis kernel sederhana yang dapat di-boot menggunakan bootloader GRUB pada sistem x86. Kernel ini akan menampilkan pesan di layar dan menunggu. Bagaimana cara sistem x86 melakukan booting?Sebelum kita mulai menulis kernel, mari kita pahami bagaimana sistem melakukan booting dan mentransfer kendali ke kernel. Kebanyakan register prosesor sudah berisi nilai-nilai tertentu saat startup. Register yang menunjuk ke alamat instruksi (Instruction Pointer, EIP) menyimpan alamat memori dimana instruksi yang dieksekusi oleh prosesor berada. EIP defaultnya adalah 0xFFFFFFFF0. Dengan demikian, prosesor x86 di tingkat perangkat keras mulai bekerja di alamat 0xFFFFFFF0. Faktanya, ini adalah 16 byte terakhir dari 32-bit ruang alamat. Alamat ini disebut vektor reset. Sekarang peta memori chipset memastikan bahwa 0xFFFFFFF0 milik bagian tertentu dari BIOS, bukan RAM. Pada saat ini, BIOS menyalin dirinya ke RAM untuk mendapatkan lebih banyak akses cepat. Alamat 0xFFFFFFFF0 hanya akan berisi instruksi untuk melompat ke alamat di memori tempat salinan BIOS disimpan. Beginilah cara kode BIOS mulai dijalankan. BIOS pertama-tama mencari perangkat yang dapat melakukan booting, dalam urutan yang telah ditentukan sebelumnya. Angka ajaib dicari untuk menentukan apakah perangkat dapat di-boot (byte ke-511 dan ke-512 dari sektor pertama harus sama dengan 0xAA55). Ketika BIOS menemukan perangkat boot, ia menyalin konten sektor pertama perangkat ke dalam RAM, dimulai dari alamat fisik 0x7c00; lalu pergi ke alamat dan mengeksekusi kode yang diunduh. Kode ini disebut pemuat boot. Bootloader memuat kernel di alamat fisik 0x100000. Alamat ini digunakan sebagai alamat awal di semua kernel besar pada sistem x86. Semua prosesor x86 dimulai dalam mode 16-bit sederhana yang disebut modus nyata. Bootloader GRUB mengalihkan mode ke 32-bit mode terlindungi, menyetel bit rendah register CR0 ke 1 . Dengan demikian, kernel dimuat dalam mode terproteksi 32-bit. Perhatikan bahwa dalam kasus kernel Linux, GRUB melihat protokol boot Linux dan memuat kernel ke dalamnya modus nyata. Kernel secara otomatis beralih ke mode terproteksi. Apa yang kita butuhkan?
Mengatur titik masuk di assemblerTidak peduli seberapa besar Anda ingin membatasi diri pada C saja, Anda harus menulis sesuatu dalam assembler. Kami akan menulis file kecil di atasnya yang akan berfungsi sebagai titik awal untuk kernel kami. Yang dilakukan hanyalah memanggil fungsi eksternal yang ditulis dalam C dan menghentikan aliran program. Bagaimana kita bisa memastikan bahwa kode ini adalah titik awalnya? Kami akan menggunakan skrip tautan yang menghubungkan file objek untuk membuat file akhir yang dapat dieksekusi. Dalam skrip ini kami akan secara eksplisit menunjukkan bahwa kami ingin memuat data di alamat 0x100000. Berikut kode assemblernya: ;;kernel.asm bits 32 ;nasm directive - bagian 32 bit .text global start extern kmain ;kmain didefinisikan dalam file c start: cli ;block interupsi mov esp, stack_space ;set stack pointer call kmain hlt ;hentikan bagian CPU .bss resb 8192 ;8KB untuk tumpukan stack_space: Instruksi pertama, bit 32, bukan instruksi perakitan x86. Ini adalah arahan ke assembler NASM yang menentukan pembuatan kode untuk prosesor yang beroperasi dalam mode 32-bit. Dalam kasus kami hal ini tidak perlu, tetapi secara umum berguna. Bagian dengan kode dimulai pada baris kedua. global adalah arahan NASM lain yang membuat simbol Kode sumber global. Dengan cara ini linker mengetahui di mana simbol awal berada - titik masuk kita. kmain adalah fungsi yang akan didefinisikan dalam file kernel.c. extern berarti fungsi tersebut dideklarasikan di tempat lain. Kemudian muncul fungsi start, yang memanggil fungsi kmain dan menghentikan prosesor dengan instruksi hlt. Inilah sebabnya kami menonaktifkan interupsi terlebih dahulu menggunakan instruksi cli. Idealnya, kita perlu mengalokasikan sejumlah memori dan mengarahkannya dengan penunjuk tumpukan (esp). Namun, sepertinya GRUB telah melakukan hal ini untuk kita. Namun, Anda tetap akan mengalokasikan sejumlah ruang di bagian BSS dan memindahkan penunjuk tumpukan ke awal. Kami menggunakan instruksi resb, yang mencadangkan jumlah byte yang ditentukan. Segera sebelum memanggil kmain, penunjuk tumpukan (esp) diatur ke lokasi yang benar dengan instruksi mov. Kernel di CDi kernel.asm kami melakukan panggilan ke fungsi kmain(). Jadi, kode “C” kita harus mulai dieksekusi dengan kmain() : /* * kernel.c */ void kmain(void) ( const char *str = "kernel pertama saya"; char *vidptr = (char*)0xb8000; //video mem dimulai di sini. unsigned int i = 0; unsigned int j = 0; /* loop ini menghapus layar * ada 25 baris masing-masing 80 kolom;< 80 * 25 * 2) { /* blank character */ vidptr[j] = " "; /* attribute-byte - light grey on black screen */ vidptr = 0x07; j = j + 2; } j = 0; /* this loop writes the string to video memory */ while(str[j] != "\0") { /* the character"s ascii */ vidptr[i] = str[j]; /* attribute-byte: give character black bg and light grey fg */ vidptr = 0x07; ++j; i = i + 2; } return; } Yang dilakukan kernel kita hanyalah membersihkan layar dan menampilkan baris “kernel pertama saya”. Pertama kita membuat pointer vidptr yang menunjuk ke alamat 0xb8000. Dalam mode terproteksi, "memori video" dimulai dari alamat ini. Untuk menampilkan teks di layar, kami memesan 25 baris yang terdiri dari 80 karakter ASCII, mulai dari 0xb8000. Setiap karakter ditampilkan bukan dalam 8 bit biasa, tetapi dalam 16 bit. Byte pertama menyimpan karakter itu sendiri, dan byte kedua menyimpan atribut-byte . Ini menggambarkan format karakter, seperti warnanya. Untuk menampilkan karakter hijau s dengan latar belakang hitam, kami menulis karakter ini di byte pertama dan nilai 0x02 di byte kedua. 0 berarti latar belakang hitam, 2 berarti warna teks hijau. Berikut adalah bagan warnanya: 0 - Hitam, 1 - Biru, 2 - Hijau, 3 - Cyan, 4 - Merah, 5 - Magenta, 6 - Coklat, 7 - Abu-abu Muda, 8 - Abu-abu Tua, 9 - Biru Muda, 10/a - Hijau Muda, 11/b - Cyan Muda, 12/c - Merah Muda, 13/h - Magenta Muda, 14/e - Coklat Muda, 15/f - Putih. Di kernel kami, kami akan menggunakan teks abu-abu terang dengan latar belakang hitam, sehingga atribut byte kami akan memiliki nilai 0x07. Pada loop pertama, program mencetak simbol kosong di seluruh zona 80x25. Ini akan menghapus layar. Pada siklus berikutnya, karakter dari string yang diakhiri dengan null "kernel pertama saya" dengan byte atribut yang sama dengan 0x07 ditulis ke "memori video". Ini akan mencetak string ke layar. Bagian penghubungKita perlu merakit kernel.asm menjadi file objek menggunakan NASM; kemudian gunakan GCC untuk mengkompilasi kernel.c ke dalam file objek lain. Mereka kemudian harus dilampirkan ke kernel boot yang dapat dieksekusi. Untuk melakukan ini, kita akan menggunakan skrip pengikatan yang diteruskan ke ld sebagai argumen. /* * link.ld */ OUTPUT_FORMAT(elf32-i386) ENTRY(mulai) BAGIAN ( . = 0x100000; .text: ( *(.text) ) .data: ( *(.data) ) .bss: ( *( .bss) ) ) Pertama kita akan bertanya format output sebagai 32-bit Executable dan Linkable Format (ELF). ELF adalah format file biner standar untuk sistem Unix x86. PINTU MASUK mengambil satu argumen yang menentukan nama simbol yang merupakan titik masuk. BAGIAN- ini adalah bagian terpenting. Ini mendefinisikan markup file yang dapat dieksekusi. Kami menentukan bagaimana bagian-bagian yang berbeda harus dihubungkan dan di mana menempatkannya. Dalam tanda kurung setelah BAGIAN, titik (.) menampilkan penghitung posisi, yang defaultnya adalah 0x0. Itu bisa diubah, itulah yang kami lakukan. Mari kita lihat baris berikut: .text: ( *(.text) ) . Tanda bintang (*) adalah karakter spesial, cocok dengan nama file apa pun. Ekspresi *(.text) berarti semua bagian .text dari semua file input. Dengan demikian, linker menggabungkan semua bagian kode dari file objek ke dalam satu bagian dari file yang dapat dieksekusi di alamat di penghitung posisi (0x100000). Setelah ini, nilai penghitungnya akan sama dengan 0x100000 + ukuran bagian yang dihasilkan. Hal yang sama terjadi pada bagian lain. Grub dan MultibootSekarang semua file siap untuk membuat kernel. Tapi masih ada satu langkah lagi. Ada standar untuk memuat inti x86 menggunakan bootloader yang disebut Spesifikasi multiboot. GRUB hanya akan mem-boot kernel kita jika memenuhi spesifikasi ini. Mengikutinya, kernel harus berisi header dalam 8 kilobyte pertama. Selain itu, header ini harus berisi 3 bidang, yaitu 4 byte:
Kernel.asm kita akan terlihat seperti ini: ;;kernel.asm ;nasm directive - 32 bit bit 32 bagian .text ;spesifikasi multiboot align 4 dd 0x1BADB002 ;magic dd 0x00 ;flags dd - (0x1BADB002 + 0x00) ;checksum. m+f+c harus nol global start extern kmain ;kmain didefinisikan dalam file c start: cli ;block interupsi mov esp, stack_space ;set stack pointer call kmain hlt ;halt the CPU section .bss resb 8192 ;8KB for stack tumpukan_ruang: Membangun intiSekarang kita akan membuat file objek dari kernel.asm dan kernel.c dan menghubungkannya menggunakan skrip kita. Nasm -f elf32 kernel.asm -o kasm.o Baris ini akan menjalankan assembler untuk membuat file objek kasm.o dalam format ELF-32. Gcc -m32 -c kernel.c -o kc.o Opsi “-c” memastikan bahwa tidak ada tautan tersembunyi yang terjadi setelah kompilasi. Ld -m elf_i386 -T link.ld -o kernel kasm.o kc.o Ini akan menjalankan linker dengan skrip kita dan membuat file executable bernama inti. Menyiapkan grub dan memulai kernelGRUB memerlukan nama kernel untuk memenuhi pola kernel- Sekarang letakkan di direktori / boot. Untuk melakukan ini, Anda memerlukan hak pengguna super. Dalam file konfigurasi GRUB grub.cfg, tambahkan yang berikut ini: Judul root myKernel (hd0,0) kernel /boot/kernel-701 ro Jangan lupa untuk menghapus direktif menu tersembunyi jika ada. Restart komputer Anda dan Anda akan melihat daftar kernel termasuk milik Anda. Pilih dan Anda akan melihat: Ini adalah inti Anda! Mari tambahkan sistem input/output. P.S.
Inti semantik adalah nama menakutkan yang dibuat oleh SEO untuk menunjukkan hal yang agak sederhana. Kita hanya perlu memilih pertanyaan kunci yang akan kita gunakan untuk mempromosikan situs kita. Dan pada artikel kali ini saya akan menunjukkan cara menyusun inti semantik dengan benar agar situs Anda cepat mencapai TOP, dan tidak stagnan selama berbulan-bulan. Ada juga “rahasia” di sini. Dan sebelum kita melanjutkan menyusun SY, mari kita cari tahu apa itu SY dan apa yang pada akhirnya harus kita capai. Apa inti semantik dalam kata-kata sederhanaAnehnya, inti semantiknya biasa saja berkas Excel, yang mencantumkan kueri utama yang artikelnya akan Anda (atau copywriter Anda) tulis untuk situs tersebut. Misalnya, seperti inilah inti semantik saya: Saya telah menandai dengan warna hijau pertanyaan-pertanyaan kunci yang artikelnya telah saya tulis. Kuning - artikel yang saya rencanakan untuk ditulis dalam waktu dekat. Dan sel yang tidak berwarna berarti permintaan ini akan datang nanti. Untuk setiap permintaan kunci, saya telah menentukan frekuensi, daya saing, dan menghasilkan judul yang “menarik”. Anda harus mendapatkan kira-kira file yang sama. Sekarang CN saya terdiri dari 150 kata kunci. Artinya, saya diberikan “materi” setidaknya 5 bulan sebelumnya (walaupun saya menulis satu artikel sehari). Di bawah ini kita akan berbicara tentang apa yang harus Anda persiapkan jika Anda tiba-tiba memutuskan untuk memesan kumpulan inti semantik dari spesialis. Di sini saya akan mengatakan secara singkat - mereka akan memberi Anda daftar yang sama, tetapi hanya untuk ribuan "kunci". Namun di SY yang penting bukanlah kuantitas, melainkan kualitas. Dan kami akan fokus pada hal ini. Mengapa kita membutuhkan inti semantik?Tapi sungguh, mengapa kita membutuhkan siksaan ini? Lagi pula, Anda bisa saja menulis artikel berkualitas dan menarik audiens, bukan? Ya, Anda bisa menulis, tetapi Anda tidak akan bisa menarik orang. Kesalahan utama 90% blogger hanyalah menulis artikel berkualitas tinggi. Saya tidak bercanda, mereka memiliki materi yang sangat menarik dan bermanfaat. Tapi mesin pencari tidak mengetahuinya. Mereka bukan paranormal, tapi hanya robot. Oleh karena itu, mereka tidak memberi peringkat artikel Anda di TOP. Ada poin halus lainnya dalam judulnya. Misalnya, Anda memiliki artikel berkualitas tinggi dengan topik “Cara menjalankan bisnis dengan benar di facebook.” Di sana Anda menjelaskan segala sesuatu tentang Facebook dengan sangat detail dan profesional. Termasuk bagaimana cara mempromosikan komunitas di sana. Artikel Anda memiliki kualitas terbaik, bermanfaat dan menarik di Internet tentang topik ini. Tidak ada seorang pun yang berbaring di sampingmu. Tapi itu tetap tidak akan membantu Anda. Mengapa artikel berkualitas tinggi turun dari TOPBayangkan situs Anda dikunjungi bukan oleh robot, tetapi oleh inspektur langsung (penilai) dari Yandex. Dia menyadari bahwa Anda memiliki artikel paling keren. Dan tangan menempatkan Anda di posisi pertama dalam hasil pencarian untuk permintaan “Mempromosikan komunitas di Facebook.” Tahukah Anda apa yang akan terjadi selanjutnya? Lagipula kamu akan segera terbang keluar dari sana. Karena tidak ada yang akan mengklik artikel Anda, bahkan pada awalnya. Orang-orang memasukkan kueri “Mempromosikan komunitas di Facebook”, dan judul utama Anda adalah “Cara menjalankan bisnis dengan benar di facebook.” Asli, segar, lucu, tapi... bukan berdasarkan permintaan. Orang ingin melihat apa yang sebenarnya mereka cari, bukan kreativitas Anda. Dengan demikian, artikel Anda akan mengosongkan tempatnya di hasil pencarian TOP. Dan penilai yang masih hidup, pengagum setia karya Anda, dapat memohon kepada pihak berwenang sebanyak yang dia suka untuk meninggalkan Anda setidaknya di TOP 10. Tapi itu tidak akan membantu. Semua tempat pertama akan ditempati oleh barang-barang kosong, seperti sekam biji bunga matahari, yang disalin satu sama lain oleh anak-anak sekolah kemarin. Namun artikel ini akan memiliki judul “relevan” yang benar - “Mempromosikan komunitas di Facebook dari awal” ( langkah demi langkah, dalam 5 langkah, dari A sampai Z, gratis dll.) Apakah itu menyinggung? Tetap saja. Ya, berperang melawan ketidakadilan. Mari ciptakan inti semantik yang kompeten sehingga artikel Anda mendapat tempat pertama yang layak. Alasan lain untuk mulai menulis SINOPSIS sekarang jugaAda satu hal lagi yang entah kenapa tidak terlalu dipikirkan orang. Anda perlu sering menulis artikel - setidaknya setiap minggu, dan sebaiknya 2-3 kali seminggu - untuk mendapatkan keuntungan lebih banyak lalu lintas dan lebih cepat. Semua orang mengetahui hal ini, tetapi hampir tidak ada yang melakukannya. Dan semua itu karena mereka mengalami “stagnasi kreatif”, “mereka tidak bisa memaksakan diri”, “mereka hanya malas”. Namun nyatanya, keseluruhan masalahnya terletak pada tidak adanya inti semantik tertentu. Saya memasukkan salah satu kunci dasar saya, “smm,” ke dalam kolom pencarian, dan Yandex segera memberi saya selusin petunjuk tentang apa lagi yang mungkin menarik bagi orang-orang yang tertarik dengan “smm.” Yang harus saya lakukan hanyalah menyalin kunci-kunci ini ke dalam buku catatan. Kemudian saya akan memeriksa masing-masingnya dengan cara yang sama, dan mengumpulkan petunjuknya juga. Setelah tahap pertama pengumpulan kata kunci, Anda akan mendapatkan dokumen teks yang berisi 10-30 kunci dasar yang luas, yang akan kita kerjakan lebih lanjut. Langkah #2 — Mengurai kunci dasar di SlovoEBTentu saja, jika Anda menulis artikel untuk permintaan “webinar” atau “smm”, maka keajaiban tidak akan terjadi. Anda tidak akan pernah bisa mencapai TOP untuk permintaan seluas itu. Kita perlu memecah kunci dasar menjadi banyak pertanyaan kecil tentang topik ini. Dan kami akan melakukan ini menggunakan program khusus. Saya menggunakan KeyCollector, tetapi berbayar. Anda dapat menggunakan analog gratis - program SlovoEB. Anda dapat mengunduhnya dari situs resminya. Hal tersulit dalam bekerja dengan program ini adalah pengaturannya dengan benar. Saya tunjukkan cara mengatur dan menggunakan Sloboeb dengan benar. Namun di artikel itu saya fokus pada pemilihan kunci untuk Yandex Direct. Dan di sini mari kita lihat langkah demi langkah fitur penggunaan program ini untuk membuat inti semantik untuk SEO. Pertama, kami membuat proyek baru dan memberi nama dengan kunci luas yang ingin Anda uraikan. Saya biasanya memberi proyek itu nama yang sama dengan kunci dasar saya untuk menghindari kebingungan di kemudian hari. Dan ya, saya akan memperingatkan Anda agar tidak melakukan satu kesalahan lagi. Jangan mencoba mengurai semua kunci dasar sekaligus. Maka akan sangat sulit bagi Anda untuk memfilter kueri kunci “kosong” dari butiran emas. Mari kita parsing kunci satu per satu. Setelah membuat proyek, kami menjalankan operasi dasar. Artinya, kami sebenarnya mengurai kunci melalui Yandex Wordstat. Untuk melakukan ini, klik tombol “Worstat” di antarmuka program, masukkan kunci dasar Anda, dan klik “Mulai koleksi”. Sebagai contoh, mari kita parsing kunci dasar untuk blog saya “iklan kontekstual”. Setelah ini, prosesnya akan dimulai, dan setelah beberapa waktu program akan memberi kita hasilnya - hingga 2000 pertanyaan kunci yang berisi "iklan kontekstual". Selain itu, di samping setiap permintaan akan ada frekuensi "kotor" - berapa kali kunci ini (+ bentuk kata dan ekornya) dicari per bulan melalui Yandex. Namun saya tidak menyarankan menarik kesimpulan apa pun dari angka-angka ini. Langkah #3 - Mengumpulkan frekuensi yang tepat untuk tombol-tombol tersebutFrekuensi kotor tidak akan menunjukkan apa pun kepada kita. Jika Anda fokus pada hal itu, maka jangan kaget ketika kunci Anda untuk 1000 permintaan tidak menghasilkan satu klik pun per bulan. Kita perlu mengidentifikasi frekuensi murni. Dan untuk melakukan ini, pertama-tama kita pilih semua kunci yang ditemukan dengan tanda centang, lalu klik tombol "Yandex Direct" dan mulai prosesnya lagi. Sekarang Slovoeb akan mencari frekuensi permintaan yang tepat per bulan untuk setiap kunci. Sekarang kami memiliki gambaran objektif - berapa kali kueri dimasukkan oleh pengguna Internet selama sebulan terakhir. Saya sekarang mengusulkan untuk mengelompokkan semua pertanyaan kunci berdasarkan frekuensi untuk membuatnya lebih mudah untuk dikerjakan. Untuk melakukan ini, klik ikon “filter” di kolom “Frekuensi”. ", dan tentukan - filter kunci dengan nilai "kurang dari atau sama dengan 10". Sekarang program hanya akan menampilkan permintaan yang frekuensinya kurang dari atau sama dengan nilai “10”. Anda dapat menghapus kueri ini atau menyalinnya ke grup kueri utama lainnya untuk digunakan di masa mendatang. Kurang dari 10 sangat sedikit. Menulis artikel untuk permintaan ini hanya membuang-buang waktu. Sekarang kita perlu memilih pertanyaan-pertanyaan kunci yang akan memberi kita lalu lintas yang lebih atau kurang baik. Dan untuk ini kita perlu mengetahui parameter lain - tingkat daya saing permintaan. Langkah #4 — Memeriksa daya saing permintaanSemua “kunci” di dunia ini terbagi menjadi 3 jenis: frekuensi tinggi (HF), frekuensi menengah (MF), frekuensi rendah (LF). Mereka juga bisa sangat kompetitif (HC), cukup kompetitif (SC) dan rendah kompetitif (LC). Biasanya, permintaan HF juga merupakan VC. Artinya, jika suatu query sering dicari di Internet, maka banyak sekali situs yang ingin mempromosikannya. Namun hal ini tidak selalu terjadi; ada pengecualian yang menyenangkan. Seni menyusun inti semantik justru terletak pada menemukan kueri yang memiliki frekuensi tinggi dan tingkat persaingan rendah. Sangat sulit untuk menentukan tingkat persaingan secara manual. Anda dapat fokus pada indikator seperti jumlah halaman utama di TOP 10, panjang dan kualitas teks. tingkat kepercayaan dan keunggulan situs di hasil pencarian TOP berdasarkan permintaan. Semua ini akan memberi Anda gambaran tentang betapa ketatnya persaingan untuk mendapatkan peringkat untuk kueri khusus ini. Tapi saya sarankan Anda menggunakannya Layanan mutagen. Ini memperhitungkan semua parameter yang saya sebutkan di atas, ditambah selusin parameter lainnya yang mungkin belum pernah Anda atau saya dengar. Setelah analisis, layanan memberikan nilai pasti - tingkat persaingan yang dimiliki permintaan ini. Di sini saya memeriksa kueri “menyiapkan iklan kontekstual di google adwords”. Mutagen menunjukkan kepada kita bahwa kunci ini memiliki daya saing "lebih dari 25" - ini adalah nilai maksimum yang ditunjukkannya. Dan kueri ini hanya memiliki 11 tampilan per bulan. Jadi itu jelas tidak cocok untuk kita. Kami dapat menyalin semua kunci yang kami temukan di Slovoeb dan melakukan pemeriksaan massal di Mutagen. Setelah itu, kita tinggal melihat daftarnya dan mengambil permintaan yang permintaannya banyak dan tingkat persaingannya rendah. Mutagen adalah layanan berbayar. Tapi Anda bisa melakukan 10 pemeriksaan per hari secara gratis. Selain itu, biaya pengujiannya sangat rendah. Selama saya bekerja dengannya, saya belum menghabiskan 300 rubel pun. Berbicara tentang tingkat persaingan. Jika Anda memiliki situs muda, lebih baik memilih kueri dengan tingkat persaingan 3-5. Dan jika Anda sudah berpromosi lebih dari setahun, maka Anda bisa mengambil 10-15. Berbicara tentang frekuensi permintaan. Sekarang kita perlu mengambil langkah terakhir, yang memungkinkan Anda menarik banyak lalu lintas bahkan untuk kueri berfrekuensi rendah. Langkah #5 — Mengumpulkan “ekor” untuk kunci yang dipilihSeperti yang telah dibuktikan dan diuji berkali-kali, situs Anda akan menerima sebagian besar lalu lintas bukan dari kata kunci utama, tetapi dari apa yang disebut “ekor”. Ini adalah saat seseorang memasukkan kueri kunci aneh ke dalam bilah pencarian, dengan frekuensi 1-2 per bulan, tetapi ada banyak kueri seperti itu. Untuk melihat "ekor", cukup buka Yandex dan masukkan kueri kunci pilihan Anda ke dalam bilah pencarian. Berikut kira-kira apa yang akan Anda lihat. Sekarang Anda hanya perlu menuliskan kata-kata tambahan ini di dokumen terpisah dan menggunakannya dalam artikel Anda. Selain itu, tidak perlu selalu menempatkannya di sebelah kunci utama. Jika tidak, mesin pencari akan melihat “optimasi berlebihan” dan artikel Anda akan masuk dalam hasil pencarian. Cukup gunakan mereka di tempat berbeda di artikel Anda, dan Anda juga akan menerima lalu lintas tambahan dari mereka. Saya juga menyarankan Anda mencoba menggunakan sebanyak mungkin bentuk kata dan sinonim untuk kueri kunci utama Anda. Misalnya, kami memiliki permintaan - “Menyiapkan iklan kontekstual”. Berikut cara memformulasikannya kembali:
Anda tidak pernah tahu persis bagaimana orang akan mencari informasi. Tambahkan semua kata tambahan ini ke inti semantik Anda dan gunakan saat menulis teks. Jadi, kami mengumpulkan daftar 100 - 150 pertanyaan kunci. Jika Anda membuat inti semantik untuk pertama kalinya, mungkin diperlukan waktu beberapa minggu. Atau mungkin mematahkan matanya? Mungkin ada peluang untuk mendelegasikan kompilasi FL kepada spesialis yang akan melakukannya dengan lebih baik dan lebih cepat? Ya, memang ada spesialis seperti itu, tetapi Anda tidak selalu perlu menggunakan layanan mereka. Apakah layak memesan SY dari spesialis?Secara umum, kompiler inti semantik hanya akan memberi Anda langkah 1 - 3 dari diagram kami. Terkadang, dengan biaya tambahan yang besar, mereka akan melakukan langkah 4-5 - (mengumpulkan ekor dan memeriksa daya saing permintaan). Setelah itu, mereka akan memberi Anda beberapa ribu pertanyaan kunci yang perlu Anda kerjakan lebih lanjut. Dan pertanyaannya di sini adalah apakah Anda akan menulis artikel sendiri, atau menyewa copywriter untuk ini. Jika Anda ingin fokus pada kualitas daripada kuantitas, Anda perlu menulisnya sendiri. Namun tidak cukup jika Anda hanya mendapatkan daftar kunci saja. Anda harus memilih topik yang Anda pahami dengan cukup baik untuk menulis artikel yang berkualitas. Dan di sini muncul pertanyaan - mengapa kita sebenarnya membutuhkan spesialis di FL? Setuju, menguraikan kunci dasar dan mengumpulkan frekuensi yang tepat (langkah #1-3) sama sekali tidak sulit. Ini benar-benar akan memakan waktu setengah jam. Yang paling sulit adalah memilih permintaan HF yang persaingannya rendah. Dan sekarang, ternyata, Anda memerlukan HF-NC, yang bisa digunakan untuk menulis artikel bagus. Inilah yang akan menghabiskan 99% waktu Anda mengerjakan inti semantik. Dan tidak ada spesialis yang akan melakukan ini untuk Anda. Nah, apakah layak mengeluarkan uang untuk memesan layanan seperti itu? Kapan layanan spesialis FL berguna?Hal lain adalah jika Anda awalnya berencana untuk menarik copywriter. Maka Anda tidak perlu memahami subjek permintaan tersebut. Copywriter Anda juga tidak akan memahaminya. Mereka hanya akan mengambil beberapa artikel tentang topik ini dan menyusun teks "mereka" dari artikel tersebut. Artikel-artikel seperti itu akan menjadi kosong, menyedihkan, hampir tidak berguna. Tapi jumlahnya akan banyak. Jika Anda sendiri, Anda dapat menulis maksimal 2-3 artikel berkualitas per minggu. Dan sepasukan copywriter akan memberi Anda 2-3 teks jelek setiap hari. Pada saat yang sama, mereka akan dioptimalkan untuk permintaan, yang berarti mereka akan menarik sejumlah lalu lintas. Dalam hal ini, ya, dengan tenang pekerjakan spesialis FL. Biarkan mereka juga menyusun spesifikasi teknis untuk copywriter pada saat yang bersamaan. Tapi tahukah Anda, ini juga membutuhkan sejumlah uang. RingkasanMari kita bahas kembali gagasan utama dalam artikel untuk memperkuat informasi.
Saya harap instruksi ini bermanfaat bagi Anda. Simpan ke favorit Anda agar tidak hilang, dan bagikan dengan teman-teman Anda. Jangan lupa download buku saya. Di sana saya tunjukkan cara tercepat dari nol hingga satu juta pertama di Internet (sari dari pengalaman pribadi dalam 10 tahun =) Sampai jumpa lagi! Hormat saya Dmitry Novoselov Halo semua! Artikel hari ini dikhususkan untuk cara merakit inti semantik (SC) dengan benar. Jika Anda terlibat dalam promosi SEO di Google dan Yandex, ingin meningkatkan lalu lintas alami, meningkatkan lalu lintas situs web dan penjualan - materi ini cocok untuk Anda. Untuk mengetahui kebenarannya, kita akan mempelajari topik dari “A sampai Z”: Sebagai kesimpulan, mari kita lihat aturan umum penyusunan SL. Jadi mari kita mulai! Inti semantik: apa itu dan apa pertanyaannya?Inti semantik sebuah situs (juga dikenal sebagai “inti semantik”) adalah sekumpulan kata dan frasa yang benar-benar sesuai dengan struktur dan tema sumber daya. Sederhananya, ini adalah pertanyaan yang digunakan pengguna untuk menemukan situs di Internet. Ini adalah inti semantik yang benar yang memberikan gambaran lengkap kepada mesin pencari dan audiens tentang informasi yang disajikan pada sumber daya. Misalnya, jika sebuah perusahaan menjual kartu pos yang sudah jadi, maka inti semantiknya harus mencakup pertanyaan berikut: “beli kartu pos”, “harga kartu pos”, “kartu pos khusus”, dan sejenisnya. Tapi bukan: “cara membuat kartu pos”, “kartu pos do-it-yourself”, “kartu pos buatan sendiri”. Menarik untuk diketahui: copywriting LSI. Akankah teknik ini menggantikan SEO? Klasifikasi permintaan berdasarkan frekuensi:
Penting untuk dicatat bahwa tidak ada batasan yang jelas yang memisahkan HF dari SY dan LF, karena keduanya berbeda-beda tergantung topiknya. Misalnya, untuk kueri “origami”, indikator RF adalah 600 ribu tayangan per bulan, dan untuk “kosmetik” – 3,5 juta. Jika kita beralih ke anatomi kunci, maka frekuensi tinggi hanya terdiri dari badan, frekuensi menengah dan rendah dilengkapi dengan specifier dan “ekor”. Saat membentuk inti semantik, Anda perlu menggunakan semua jenis frekuensi, tetapi dalam proporsi berbeda: HF minimum, LF maksimum, dan jumlah MF rata-rata. Agar lebih jelas, mari kita analogikan dengan pohon. Bagasi adalah permintaan paling penting yang menjadi sandaran segalanya. Cabang tebal yang terletak lebih dekat ke batang adalah tombol frekuensi menengah, yang juga populer, namun tidak sepopuler HF. Cabang tipis adalah kata berfrekuensi rendah yang juga digunakan untuk mencari produk/jasa yang diinginkan, tetapi jarang. Pemisahan kunci berdasarkan daya saing:
Kriteria ini menunjukkan berapa banyak sumber daya web yang digunakan permintaan ini untuk promosi. Semuanya sederhana di sini: semakin tinggi daya saing kuncinya, semakin sulit untuk menembus dan tetap berada di 10 besar dengan kunci tersebut. Yang memiliki daya saing rendah juga tidak perlu diperhatikan, karena tidak terlalu populer di jaringan. Pilihan yang ideal adalah maju sesuai permintaan IC, yang dengannya Anda secara realistis dapat menempati posisi pertama dalam area bisnis yang stabil. Klasifikasi permintaan menurut kebutuhan pengguna:
Kata kunci yang tersisa, ketika sulit untuk memahami maksud pengguna, diklasifikasikan ke dalam kelompok “Lainnya” (misalnya, kata “kartu pos” saja yang menimbulkan banyak pertanyaan: “Beli? Buat? Gambar?”). Mengapa sebuah website membutuhkan inti semantik?Mengumpulkan inti semantik adalah pekerjaan melelahkan yang membutuhkan banyak waktu, tenaga, dan kesabaran. Tidak mungkin membuat sintaks yang benar yang akan berfungsi hanya dalam dua menit. Pertanyaan yang cukup masuk akal muncul di sini: apakah layak untuk mengeluarkan upaya dalam memilih inti semantik untuk sebuah situs? Jika Anda ingin proyek Internet Anda menjadi populer, terus meningkatkan basis pelanggan Anda dan, karenanya, meningkatkan keuntungan perusahaan, jawabannya tegas: “YA.” Karena mengumpulkan inti semantik membantu:
Bagaimana lagi Anda bisa menggunakan inti semantik? Untuk membuat rencana konten yang tepat. Kunci yang dikumpulkan dengan benar akan menyarankan topik untuk teks dan postingan yang menarik bagi audiens target Anda. Kesimpulan. Hampir MUNGKIN membuat proyek Internet yang menarik, populer dan menguntungkan tanpa SY. Materi tentang topik: Bersiap untuk mengumpulkan inti semantik untuk situs tersebutSebelum membuat inti semantik situs, Anda perlu melakukan langkah-langkah berikut: I. Mempelajari aktivitas perusahaan (“brainstorming”)Di sini penting untuk menuliskan SEMUA layanan dan barang yang ditawarkan organisasi. Misalnya, untuk mengumpulkan inti semantik untuk toko furnitur online, Anda dapat menggunakan kueri berikut: sofa, kursi berlengan, tempat tidur, lorong, lemari + restorasi, perbaikan. Hal utama di sini adalah jangan sampai melewatkan apa pun dan tidak menambahkan hal-hal yang tidak perlu. Hanya informasi yang relevan, mis. Jika perusahaan tidak menjual pouf atau memperbaiki furnitur, permintaan ini tidak diperlukan. Selain brainstorming, Anda dapat menggunakan layanan ini Google Analitik dan Yandex.Metrika (Gbr. 1) atau akun pribadi di Google Search Console dan Yandex Webmaster (Gbr. 2). Mereka akan memberi tahu Anda pertanyaan mana yang paling populer di kalangan audiens target Anda. Bantuan tersebut hanya tersedia untuk lokasi yang sudah beroperasi. Teks untuk membantu:
II. Untuk menganalisis inti semantik situs pesaing:
Lain metode yang efektif perpanjangan inti semantik - gunakan sinonim. Pengguna dapat mencari produk atau layanan yang sama dengan cara yang berbeda, jadi penting untuk menyertakan semua kunci alternatif di TL. Petunjuk di Google dan Yandex akan membantu Anda menemukan sinonim. Nasihat. Jika situs tersebut bersifat informasi, Anda harus terlebih dahulu memilih kueri yang utama untuk sumber daya ini dan promosi yang direncanakan. Dan kemudian - musiman. Misalnya, untuk proyek web tentang tren fesyen dalam pakaian, pertanyaan utamanya adalah: fesyen, wanita, pria, anak-anak. Dan, bisa dikatakan, "musiman" - musim gugur, musim dingin, musim semi, dll. Cara merakit inti semantik: instruksi terperinciSetelah memutuskan daftar kueri untuk situs Anda, Anda dapat mulai mengumpulkan inti semantik. Itu bisa dilakukan: I. GRATIS menggunakan: Wordstat YandexYandex Wordstat adalah layanan online yang sangat populer yang dapat Anda gunakan:
Kelemahan besar: Anda harus “membongkar” kunci secara manual. Namun jika Anda memasang ekstensi Asisten Wordstat Yandex, bekerja dengan inti semantik akan mempercepat secara signifikan (relevan untuk browser Opera). Cara penggunaannya mudah: klik “+” di sebelah kunci yang diinginkan atau klik “tambahkan semua”. Permintaan secara otomatis ditransfer ke daftar ekstensi. Setelah mengumpulkan CN, Anda perlu mentransfernya ke editor tabel dan memprosesnya. Keuntungan penting dari program ini: memeriksa duplikat, mengurutkan (abjad, frekuensi, penambahan), kemampuan untuk menambahkan kunci secara manual. Petunjuk langkah demi langkah tentang cara menggunakan layanan ini diberikan dalam artikel: Yandex. Wordstat: bagaimana cara mengumpulkan pertanyaan kunci? Iklan GooglePerencana kata kunci dari Google, yang memungkinkan Anda memilih inti semantik online secara gratis. Layanan ini menemukan kata kunci berdasarkan permintaan pengguna mesin pencari Google. Untuk bekerja, Anda harus memiliki akun Google. Layanan ini menawarkan:
Untuk mengumpulkan inti semantik, Anda perlu memasukkan kueri, memilih lokasi dan bahasa. Program ini menunjukkan rata-rata jumlah permintaan per bulan dan tingkat persaingan. Terdapat juga informasi tentang tayangan iklan dan tawaran untuk menampilkan iklan di bagian atas halaman. Jika perlu, Anda dapat mengatur filter berdasarkan kompetisi, posisi rata-rata, dan kriteria lainnya. Dimungkinkan juga untuk meminta laporan ( petunjuk langkah demi langkah Program ini menunjukkan cara melakukannya). Untuk mempelajari perkiraan lalu lintas, cukup masukkan kueri atau serangkaian kunci di jendela “Lihat jumlah kueri dan perkiraan”. Informasi tersebut akan membantu menentukan efektivitas rencana strategis untuk anggaran dan tarif tertentu. “Kekurangan” layanan ini antara lain sebagai berikut: tidak ada frekuensi pasti (hanya rata-rata untuk bulan tersebut); tidak menampilkan kunci Yandex terenkripsi dan menyembunyikan beberapa dari Google. Tapi itu menentukan persaingan dan memungkinkan Anda mengekspor kata kunci dalam format Excel. SlowoEBIni adalah versi gratis dari Key Collector, yang memiliki banyak fitur berguna:
Untuk menggunakan layanan ini, cukup masukkan informasi akun Anda di Direct (login dan kata sandi). Jika Anda ingin tahu lebih banyak, baca artikel: Slovoeb (Slovoeb). Dasar-dasar dan petunjuk penggunaan BukvarikProgram yang mudah digunakan dan gratis untuk mengumpulkan inti semantik, yang databasenya mencakup lebih dari 2 miliar kueri. Ini dibedakan berdasarkan operasi operasionalnya, serta fitur-fitur yang berguna:
Satu-satunya kelemahan penting untuk program instalasi– “berat” besar (dalam format yang diarsipkan ≈ 28 GB, dalam format yang belum dibongkar ≈ 100 GB). Tapi ada alternatif - memilih SYS online. II. DIBAYAR menggunakan program: Basis Maxim PastukhovLayanan Rusia yang berisi database lebih dari 1,6 miliar kata kunci dengan data Yandex WordStat dan Direct, serta layanan bahasa Inggris yang berisi lebih dari 600 juta kata. Ia bekerja online dan membantu tidak hanya dalam menciptakan inti semantik, tetapi juga dalam meluncurkan kampanye iklan di Yandex.Direct. Kerugiannya yang paling penting dan penting adalah biayanya yang tinggi. Kolektor KunciMungkin alat paling populer dan nyaman untuk mengumpulkan inti semantik. Kolektor Kunci:
Anda dapat mengevaluasi bagaimana Kay Collector mengumpulkan inti semantik secara gratis di versi demo. Analisis Terburu-buruSebuah layanan yang dengannya Anda dapat mengumpulkan dan mengelompokkan inti semantik. Selain itu, Analisis Terburu-buru:
Alat luar biasa, tetapi berbayar: tidak ada versi demo dan pemeriksaan gratis terbatas. MutagenProgram ini mengumpulkan pertanyaan kunci dari 30 situs pertama di mesin pencari Yandex. Menunjukkan frekuensi per bulan, daya saing setiap permintaan pencarian dan merekomendasikan penggunaan kata-kata dengan indikator hingga 5 (karena konten berkualitas tinggi cukup untuk mempromosikan kata kunci tersebut secara efektif). Artikel yang berguna: 8 jenis teks untuk situs web - tulis dengan benar Program berbayar untuk mengumpulkan inti semantik, tetapi ada batas gratis - 10 cek per hari (tersedia setelah pengisian anggaran pertama, setidaknya sebesar 1 rubel). Terbuka hanya untuk pengguna terdaftar. Alat Kata KunciLayanan andal untuk membuat inti semantik yang:
Program ini tidak memerlukan registrasi. Selain alat yang disajikan, masih banyak layanan lain untuk mengumpulkan inti semantik sebuah situs dengan ulasan video detail dan contoh. Saya memilih ini karena menurut saya ini yang paling efektif, sederhana, dan nyaman. Kesimpulan. Jika memungkinkan, disarankan untuk membeli lisensi untuk menggunakan program berbayar, karena fungsinya jauh lebih luas daripada analog gratis. Namun untuk pengumpulan CN sederhana, layanan “terbuka” juga cukup cocok. Pengelompokan inti semantikInti semantik yang sudah jadi, biasanya, mencakup banyak kata kunci (misalnya, untuk permintaan “furnitur berlapis”, layanan mengembalikan beberapa ribu kata). Apa yang harus dilakukan selanjutnya dengan jumlah kata kunci yang begitu banyak? Kunci yang dikumpulkan diperlukan: I. Membersihkan “sampah”, duplikat dan “boneka”Permintaan dengan frekuensi nol atau kesalahan akan dihapus begitu saja. Untuk menghilangkan kunci dengan “ekor” yang tidak perlu, saya sarankan menggunakan Fungsi Unggul"Menyortir dan Memfilter". Apa yang bisa dianggap sampah? Misalnya, untuk situs komersial, kata-kata seperti "unduh", "gratis", dll. tidak akan berguna. Duplikat juga dapat dihapus secara otomatis di Excel menggunakan opsi "hapus duplikat" (lihat contoh di bawah). Kami menghapus kunci dengan frekuensi nol: Menghapus “ekor” yang tidak perlu: Menyingkirkan duplikat: II. Hapus kueri yang sangat kompetitifJika Anda tidak ingin "jalur" menuju puncak bertahan selama bertahun-tahun, kecualikan kunci VK. Dengan kata kunci seperti itu, tidak cukup hanya sekedar menempati posisi pertama hasil pencarian, namun yang lebih penting dan sulit adalah berusaha bertahan di sana. Contoh cara menentukan kunci VK melalui perencana kata kunci dari Google (Anda hanya dapat meninggalkan NK dan SK melalui filter): AKU AKU AKU. Lakukan ungrouping inti semantikAnda dapat melakukannya dengan dua cara: 1. DIBAYAR:
Selain layanan tersebut, saya juga dapat merekomendasikan Analisis Terburu-buru, yang telah kita temui di atas, dan Hanya Ajaib. Analisis Terburu-buru: Hanya Ajaib: 2. GRATIS:
Langkah 1 Langkah 2 Langkah 3 Langkah 4 Contoh inti semantik yang tidak dikelompokkan:
Cara mengelompokkan inti semantik dan metode apa yang digunakan terserah Anda. Saya yakin cara yang Anda perlukan hanya dapat dilakukan secara manual. Itu panjang, tapi efektif. Setelah mengumpulkan dan mendistribusikan inti semantik menjadi beberapa bagian, Anda dapat mulai menulis teks untuk halaman-halaman tersebut. Baca artikel terkait dengan contoh: Bagaimana cara memasukkan kata kunci ke dalam teks dengan benar? Aturan umum untuk membuat FLUntuk meringkas, penting untuk menambahkan tip yang akan membantu Anda menyusun inti semantik yang benar:
Dan yang paling penting: segala sesuatu di situs (dari kunci hingga struktur) harus dilakukan “untuk orang-orang”! Kesimpulan. Inti semantik yang disusun dengan baik memberikan peluang nyata untuk dengan cepat mempromosikan dan mempertahankan situs di posisi teratas dalam hasil pencarian. Jika Anda ragu dapat menyusun bahasa semantik yang benar, lebih baik memesan inti semantik untuk situs dari para profesional. Hal ini akan menghemat tenaga, waktu dan mendatangkan manfaat lebih. Menarik juga untuk mengetahui: Bagaimana cara menempatkan dan mempercepat pengindeksan artikel? 5 rahasia sukses Itu saja. Semoga materinya bermanfaat bagi Anda dalam pekerjaan Anda. Saya akan berterima kasih jika Anda membagikan pengalaman Anda dan meninggalkan komentar. Terima kasih atas perhatian Anda! Sampai pertemuan online baru! Mengembangkan kernel dianggap bukan tugas yang mudah, tetapi siapa pun dapat menulis kernel sederhana. Untuk merasakan keajaiban peretasan kernel, Anda hanya perlu mengikuti beberapa konvensi dan menguasai bahasa assembler. Pada artikel ini kami akan menunjukkan cara melakukannya. Halo Dunia! Mari kita menulis kernel yang akan melakukan booting melalui GRUB pada sistem yang kompatibel dengan x86. Kernel pertama kita akan menampilkan pesan di layar dan berhenti di situ. Bagaimana mesin x86 melakukan bootingSebelum memikirkan cara menulis kernel, mari kita lihat bagaimana komputer melakukan booting dan mentransfer kendali ke kernel. Kebanyakan register prosesor x86 memiliki nilai tertentu setelah boot. Register penunjuk instruksi (EIP) berisi alamat instruksi yang akan dieksekusi oleh prosesor. Nilai hardcode-nya adalah 0xFFFFFFF0. Artinya, prosesor x86 akan selalu memulai eksekusi dari alamat fisik 0xFFFFFFF0. Ini adalah 16 byte terakhir dari ruang alamat 32-bit. Alamat ini disebut vektor reset. Kartu memori yang terdapat dalam chipset menyatakan bahwa alamat 0xFFFFFFF0 mengacu pada bagian tertentu dari BIOS, dan bukan untuk RAM. Namun, BIOS menyalin dirinya sendiri ke dalam RAM untuk akses yang lebih cepat - proses ini disebut “membayangi”, membuat salinan bayangan. Jadi alamat 0xFFFFFFFF0 hanya akan berisi instruksi untuk melompat ke lokasi di memori tempat BIOS menyalin dirinya sendiri. Jadi, BIOS mulai dijalankan. Pertama, ia mencari perangkat yang dapat melakukan booting dalam urutan yang ditentukan dalam pengaturan. Ia memeriksa media untuk mencari "angka ajaib" yang membedakan disk yang dapat di-boot dari disk biasa: jika byte 511 dan 512 di sektor pertama adalah 0xAA55, maka disk tersebut dapat di-boot. Setelah BIOS menemukan perangkat boot, ia akan menyalin konten sektor pertama ke dalam RAM, dimulai dari alamat 0x7C00, dan kemudian memindahkan eksekusi ke alamat tersebut dan mulai mengeksekusi kode yang baru saja dimuat. Kode ini disebut bootloader. Bootloader memuat kernel pada alamat fisik 0x100000. Inilah yang digunakan oleh kernel x86 paling populer. Semua prosesor yang kompatibel dengan x86 dimulai dalam mode 16-bit primitif yang disebut "mode nyata". Bootloader GRUB mengalihkan prosesor ke mode terproteksi 32-bit dengan menyetel bit bawah register CR0 ke satu. Oleh karena itu, kernel mulai memuat dalam mode terproteksi 32-bit. Perhatikan bahwa GRUB, dalam kasus kernel Linux, memilih protokol boot yang sesuai dan memuat kernel dalam mode nyata. Kernel Linux secara otomatis beralih ke mode terproteksi. Apa yang kita butuhkan
Titik masuk bahasa rakitanTentu saja kita ingin menulis semuanya dalam C, tapi kita tidak bisa sepenuhnya menghindari penggunaan assembler. Kami akan menulis file kecil di assembler x86 yang akan menjadi titik awal untuk kernel kami. Yang dilakukan kode assembly hanyalah memanggil fungsi eksternal yang akan kita tulis dalam C, dan kemudian menghentikan eksekusi program. Bagaimana kita bisa menjadikan kode assembly sebagai titik awal untuk kernel kita? Kami menggunakan skrip tautan yang menghubungkan file objek dan membuat file akhir kernel yang dapat dieksekusi (saya akan menjelaskan lebih lanjut di bawah). Dalam skrip ini, kami akan secara langsung menunjukkan bahwa kami ingin biner kami diunduh di alamat 0x100000. Ini adalah alamat, seperti yang sudah saya tulis, di mana bootloader mengharapkan untuk melihat titik masuk ke dalam kernel. Berikut adalah kode assemblernya. kernel.asmbit 32 bagian .text global start extern kmain start: cli mov esp, stack_space call kmain hlt section .bss resb 8192 stack_space:Instruksi bit 32 pertama bukanlah assembler x86, tetapi arahan NASM yang memerintahkannya untuk menghasilkan kode agar prosesor dapat berjalan dalam mode 32-bit. Hal ini tidak diperlukan dalam contoh kita, namun praktik yang baik adalah menunjukkannya secara eksplisit. Baris kedua memulai bagian teks, juga dikenal sebagai bagian kode. Semua kode kita akan ditempatkan di sini. global adalah arahan NASM lainnya, yang menyatakan simbol dalam kode kita bersifat global. Ini akan memungkinkan linker menemukan simbol awal, yang berfungsi sebagai titik masuk kita. kmain adalah fungsi yang akan didefinisikan dalam file kernel.c kita. extern mendeklarasikan bahwa fungsi tersebut dideklarasikan di tempat lain. Berikutnya adalah fungsi start, yang memanggil kmain dan menghentikan prosesor dengan instruksi hlt. Interupsi dapat membangunkan prosesor setelahnya hlt , jadi kami menonaktifkan interupsi terlebih dahulu dengan instruksi cli (hapus interupsi). Idealnya, kita harus mengalokasikan sejumlah memori untuk tumpukan dan mengarahkan penunjuk tumpukan (esp) ke sana. GRUB sepertinya tetap melakukan ini untuk kita, dan pada titik ini penunjuk tumpukan sudah disetel. Namun, untuk berjaga-jaga, mari kita alokasikan sebagian memori di bagian BSS dan arahkan penunjuk tumpukan ke awal. Kami menggunakan instruksi resb - ini mencadangkan memori yang ditentukan dalam byte. Sebuah tanda kemudian dibiarkan menunjukkan tepi bagian memori yang dicadangkan. Tepat sebelum kmain dipanggil, penunjuk tumpukan (esp) diarahkan ke area ini dengan instruksi mov. Kernel di CDi file kernel.asm kami memanggil fungsi kmain(). Jadi dalam kode C, eksekusi akan dimulai dari sana. kernel.cvoid kmain(void) ( const char *str = "kernel pertama saya"; char *vidptr = (char*)0xb8000; unsigned int i = 0; unsigned int j = 0; while(j< 80 * 25 * 2) { vidptr[j] = " "; vidptr = 0x07; j = j + 2; } j = 0; while(str[j] != "\0") { vidptr[i] = str[j]; vidptr = 0x07; ++j; i = i + 2; } return; }Yang dilakukan kernel kami hanyalah membersihkan layar dan mencetak baris kernel pertama saya. Pertama, kita membuat pointer vidptr yang menunjuk ke alamat 0xb8000. Dalam mode terproteksi, ini adalah awal dari memori video. Memori layar teks hanyalah bagian dari ruang alamat. Bagian memori dialokasikan untuk layar I/O, yang dimulai pada alamat 0xb8000; 25 baris 80 karakter ASCII ditempatkan di dalamnya. Setiap karakter dalam memori teks diwakili oleh 16 bit (2 byte), bukan 8 bit (1 byte) yang biasa kita gunakan. Byte pertama adalah kode ASCII dari karakter tersebut, dan byte kedua adalah byte atribut. Ini adalah definisi format karakter, termasuk warnanya. Untuk menampilkan karakter s hijau di atas hitam, kita perlu memasukkan s pada byte pertama memori video dan nilai 0x02 pada byte kedua. 0 disini berarti background hitam dan 2 berarti warna hijau. Kita akan menggunakan warna abu-abu muda, kodenya 0x07. Pada perulangan while pertama, program mengisi 25 baris yang terdiri dari 80 karakter dengan karakter kosong dengan atribut 0x07. Ini akan menghapus layar. Pada loop while kedua, string yang diakhiri dengan null, kernel pertama saya ditulis ke memori video dan setiap karakter menerima byte atribut 0x07. Ini akan menghasilkan sebuah string. Tata LetakSekarang kita harus mengkompilasi kernel.asm ke dalam file objek menggunakan NASM, dan kemudian menggunakan GCC untuk mengkompilasi kernel.c ke dalam file objek lain. Tugas kita adalah menghubungkan objek-objek ini ke dalam kernel yang dapat dieksekusi yang cocok untuk dimuat. Untuk melakukan ini, kita perlu menulis skrip untuk linker (ld), yang akan kita sampaikan sebagai argumen. tautan.ldOUTPUT_FORMAT(elf32-i386) ENTRY(mulai) BAGIAN ( . = 0x100000; .text: ( *(.text) ) .data: ( *(.data) ) .bss: ( *(.bss) ) )Di sini pertama-tama kita mengatur format (OUTPUT_FORMAT) file yang dapat dieksekusi ke ELF (Executable and Linkable Format) 32-bit, format biner standar untuk sistem berbasis Unix untuk arsitektur x86. ENTRI mengambil satu argumen. Ini menentukan nama simbol yang akan berfungsi sebagai titik masuk file yang dapat dieksekusi. BAGIAN adalah bagian terpenting bagi kami. Di sini kita menentukan tata letak file yang dapat dieksekusi. Kita dapat menentukan bagaimana berbagai bagian akan digabungkan dan di mana setiap bagian akan ditempatkan. Dalam kurung kurawal yang mengikuti ekspresi SECTIONS, titik menunjukkan penghitung lokasi. Ini secara otomatis diinisialisasi ke 0x0 di awal blok SECTIONS, tetapi dapat diubah dengan memberikan nilai baru. Saya menulis sebelumnya bahwa kode kernel harus dimulai pada alamat 0x100000. Inilah sebabnya kami menetapkan penghitung posisi dengan nilai 0x100000. Lihatlah baris.teks: ( *(.teks) ) . Tanda bintang di sini menentukan topeng yang cocok dengan nama file apa pun. Oleh karena itu, ekspresi *(.text) berarti semua bagian input .text di semua file input. Akibatnya, linker akan menggabungkan semua bagian teks dari semua file objek ke dalam bagian teks dari file yang dapat dieksekusi dan menempatkannya di alamat yang ditentukan dalam penghitung posisi. Bagian kode dari executable kami akan dimulai pada alamat 0x100000. Setelah linker menghasilkan bagian teks, nilai penghitung posisi akan menjadi 0x100000 ditambah ukuran bagian teks. Demikian pula bagian data dan bss akan digabungkan dan ditempatkan pada alamat yang ditentukan oleh penghitung posisi. GRUB dan multibootSekarang semua file kita siap untuk membangun kernel. Namun karena kita akan mem-boot kernel menggunakan GRUB, tinggal satu langkah lagi. Ada standar untuk memuat kernel x86 yang berbeda menggunakan bootloader. Ini disebut "spesifikasi multiboot". GRUB hanya akan memuat kernel yang cocok. Menurut spesifikasi ini, kernel mungkin berisi header (Multiboot header) dalam 8 kilobyte pertama. Header ini harus berisi tiga bidang:
File kernel.asm kita sekarang akan terlihat seperti ini. kernel.asmbit 32 bagian .teks ;spesifikasi multiboot selaras 4 dd 0x1BADB002 ;magic dd 0x00 ;flags dd - (0x1BADB002 + 0x00) ;checksum global start extern kmain start: cli mov esp, stack_space panggil kmain hlt section .bss resb 8192 stack_space:Instruksi dd menentukan kata ganda 4-byte. Merakit kernelJadi, semuanya sudah siap untuk membuat file objek dari kernel.asm dan kernel.c dan menghubungkannya menggunakan skrip kita. Kami menulis di konsol: $ nasm -f elf32 kernel.asm -o kasm.o Dengan menggunakan perintah ini, assembler akan membuat file kasm.o dalam format ELF-32 bit. Sekarang giliran GCC: $ gcc -m32 -c kernel.c -o kc.o Parameter -c menunjukkan bahwa file tidak perlu ditautkan setelah kompilasi. Kami akan melakukannya sendiri: $ ld -m elf_i386 -T link.ld -o kernel kasm.o kc.o Perintah ini akan menjalankan linker dengan skrip kita dan menghasilkan kernel yang dapat dieksekusi. PERINGATANPeretasan kernel paling baik dilakukan di lingkungan virtual. Untuk menjalankan kernel di QEMU dan bukan di GRUB, gunakan perintah qemu-system-i386 -kernel kernel . Menyiapkan GRUB dan memulai kernelGRUB mengharuskan nama file kernel mengikuti nama kernel-<версия>. Jadi mari kita ganti nama filenya - saya akan menamai file saya kernel-701. Sekarang kita letakkan kernel di direktori /boot. Ini akan memerlukan hak pengguna super. Anda perlu menambahkan sesuatu seperti ini ke file konfigurasi GRUB grub.cfg: Judul root myKernel (hd0,0) kernel /boot/kernel-701 ro Jangan lupa untuk menghapus direktif menu tersembunyi jika disertakan. GRUB 2Untuk menjalankan kernel yang kami buat di GRUB 2, yang disediakan secara default di distribusi baru, konfigurasi Anda akan terlihat seperti ini: Masuk menu "kernel 701" ( set root="hd0,msdos1" multiboot /boot/kernel-701 ro ) Terima kasih kepada Ruben Laguana atas tambahan ini. Nyalakan ulang komputer Anda dan Anda akan melihat kernel Anda di daftar! Dan ketika Anda memilihnya, Anda akan melihat baris yang sama. Ini adalah inti Anda! Menulis kernel dengan dukungan keyboard dan layarKami telah menyelesaikan pekerjaan pada kernel minimal yang melakukan booting melalui GRUB, berjalan dalam mode terproteksi, dan mencetak satu baris ke layar. Saatnya untuk mengembangkannya dan menambahkan driver keyboard yang akan membaca karakter dari keyboard dan menampilkannya di layar. Kami akan berkomunikasi dengan perangkat I/O melalui port I/O. Pada dasarnya, ini hanyalah alamat pada bus I/O. Ada instruksi prosesor khusus untuk operasi membaca dan menulis. Bekerja dengan port: membaca dan mengeluarkanread_port: mov edx, masuk al, dx ret write_port: mov edx, mov al, keluar dx, al retPort I/O diakses menggunakan instruksi masuk dan keluar yang disertakan dalam set x86. Di read_port, nomor port diteruskan sebagai argumen. Saat kompiler memanggil suatu fungsi, ia akan memasukkan semua argumen ke dalam tumpukan. Argumen disalin ke register edx menggunakan penunjuk tumpukan. Register dx adalah 16 bit terbawah dari register edx. Instruksi in di sini membaca nomor port yang diberikan dx dan memasukkan hasilnya al . Register al adalah 8 bit terbawah dari register eax. Anda mungkin ingat dari perguruan tinggi bahwa nilai yang dikembalikan oleh fungsi dilewatkan melalui register eax. Jadi read_port memungkinkan kita membaca dari port I/O. Fungsi write_port bekerja dengan cara yang sama. Kami mengambil dua argumen: nomor port dan data yang akan ditulis. Instruksi out menulis data ke port. InterupsiSekarang, sebelum kita kembali menulis driver, kita perlu memahami bagaimana prosesor mengetahui bahwa salah satu perangkat telah melakukan suatu operasi. Solusi paling sederhana adalah dengan melakukan polling pada perangkat - terus memeriksa statusnya dalam lingkaran. Hal ini, tentu saja, tidak efektif dan tidak praktis. Jadi di sinilah interupsi berperan. Interupsi adalah sinyal yang dikirim ke prosesor oleh perangkat atau program yang menunjukkan bahwa suatu peristiwa telah terjadi. Dengan menggunakan interupsi, kita dapat menghindari kebutuhan untuk melakukan polling pada perangkat dan hanya akan merespons peristiwa yang kita minati. Sebuah chip yang disebut Programmable Interrupt Controller (PIC) bertanggung jawab atas interupsi dalam arsitektur x86. Ini menangani interupsi dan rute perangkat keras dan mengubahnya menjadi interupsi sistem yang sesuai. Ketika pengguna melakukan sesuatu dengan perangkatnya, pulsa yang disebut Interrupt Request (IRQ) dikirim ke chip PIC. PIC menerjemahkan interupsi yang diterima menjadi interupsi sistem dan mengirimkan pesan ke prosesor bahwa sudah waktunya menghentikan pekerjaannya. Penanganan interupsi selanjutnya adalah tugas kernel. Tanpa PIC, kita harus melakukan polling pada semua perangkat yang ada dalam sistem untuk melihat apakah terjadi peristiwa yang melibatkan salah satu perangkat tersebut. Mari kita lihat cara kerjanya dengan keyboard. Keyboard hang pada port 0x60 dan 0x64. Port 0x60 mengirimkan data (saat tombol ditekan), dan port 0x64 mengirimkan status. Namun, kita perlu mengetahui kapan tepatnya membaca port tersebut. Interupsi berguna di sini. Saat tombol ditekan, keyboard mengirimkan sinyal PIC melalui jalur interupsi IRQ1. PIC menyimpan nilai offset yang disimpan selama inisialisasi. Ia menambahkan nomor baris masukan ke padding ini untuk membentuk vektor interupsi. Prosesor kemudian mencari struktur data yang disebut Interrupt Descriptor Table (IDT) untuk memberikan alamat yang sesuai dengan nomornya kepada pengendali interupsi. Kode pada alamat tersebut kemudian dieksekusi dan menangani interupsi. Tetapkan IDTstruct IDT_entry( unsigned short int offset_lowerbits; unsigned short int selector; unsigned char zero; unsigned char type_attr; unsigned short int offset_higherbits; ); struct IDT_entry IDT; VOID IDT_INIT (VOID) (UNSIGned LONG KEYboard_ADDRESS; UNSIGned LONG IDTRESS; UNSIGNED LONG IDT_PTR; KEYboard_ADDRESS = (UNSIGNED LONG) Keyboard_HANDER; .OFSET_LWERBITS = keyboard_ADDRESS & 0XFFF; ; IDT.type_attr = 0x8e; /* INTERRUPT_GATE */ IDT .offset_address & 0xffff0000 >> 16; tulis_port(0xA0, 0x11); tulis_port(0xA1, 0xff); ((alamat_idt & 0xffff)<< 16); idt_ptr = idt_address >> 16 ; load_idt(idt_ptr); )IDT adalah array struktur IDT_entry. Kita akan membahas pengikatan interupsi keyboard ke handler nanti, tapi sekarang mari kita lihat cara kerja PIC. Sistem x86 modern memiliki dua chip PIC, masing-masing dengan delapan jalur masukan. Kami akan menyebutnya PIC1 dan PIC2. PIC1 menerima IRQ0 hingga IRQ7, dan PIC2 menerima IRQ8 hingga IRQ15. PIC1 menggunakan port 0x20 untuk perintah dan 0x21 untuk data, dan PIC2 menggunakan port 0xA0 untuk perintah dan 0xA1 untuk data. Kedua PIC diinisialisasi dengan kata delapan bit yang disebut kata perintah Inisialisasi (ICW). Dalam mode terproteksi, kedua PIC harus terlebih dahulu mengeluarkan perintah inisialisasi ICW1 (0x11). Ini memberitahu PIC untuk menunggu tiga kata inisialisasi lagi tiba di port data. Perintah berikut akan meneruskan PIC:
Perintah inisialisasi kedua (ICW2) juga dikirim ke input setiap PIC. Ini menetapkan offset , yang merupakan nilai yang kita tambahkan nomor baris untuk mendapatkan nomor interupsi. PIC memungkinkan pin mereka mengalir ke input satu sama lain. Hal ini dilakukan dengan menggunakan ICW3 dan setiap bit mewakili status kaskade untuk IRQ yang sesuai. Sekarang kita tidak akan menggunakan pengalihan berjenjang dan akan menyetelnya ke nol. set ICW4 Opsi tambahan lingkungan. Kita hanya perlu mendefinisikan bit rendah sehingga PIC mengetahui bahwa kita sedang berjalan dalam mode 80x86. Ta-dam! PIC sekarang diinisialisasi. Setiap PIC memiliki register delapan bit internal yang disebut Interrupt Mask Register (IMR). Itu menyimpan bitmap Jalur IRQ yang menuju ke PIC. Jika bit diset, PIC mengabaikan permintaan tersebut. Artinya kita dapat mengaktifkan atau menonaktifkan jalur IRQ tertentu dengan mengatur nilai yang sesuai ke 0 atau 1. Membaca dari port data mengembalikan nilai dalam register IMR, sedangkan menulis mengubah register. Dalam kode kami, setelah menginisialisasi PIC, kami mengatur semua bit menjadi satu, yang menonaktifkan semua jalur IRQ. Nanti kita akan mengaktifkan baris-baris yang sesuai dengan interupsi keyboard. Tapi pertama-tama, matikan saja! Jika jalur IRQ berfungsi, PIC kami dapat menerima sinyal pada IRQ dan mengubahnya menjadi nomor interupsi, menambahkan offset. Kita perlu mengisi IDT sedemikian rupa sehingga nomor interupsi yang keluar dari keyboard sesuai dengan alamat fungsi handler yang akan kita tulis. Nomor interupsi apa yang kita perlukan untuk mengikat pengendali keyboard di IDT? Keyboardnya menggunakan IRQ1. Ini adalah jalur masukan 1 dan diproses oleh PIC1. Kami menginisialisasi PIC1 dengan offset 0x20 (lihat ICW2). Untuk mendapatkan nomor interupsi, Anda perlu menambahkan 1 dan 0x20, Anda mendapatkan 0x21. Artinya alamat pengendali keyboard akan diikat ke IDT untuk interupsi 0x21. Tugasnya adalah mengisi IDT untuk interupsi 0x21. Kami akan memetakan interupsi ini ke fungsi keyboard_handler, yang akan kami tulis di file perakitan. Setiap entri dalam IDT terdiri dari 64 bit. Dalam entri yang sesuai dengan interupsi, kami tidak menyimpan seluruh alamat fungsi pengendali. Sebagai gantinya, kami membaginya menjadi dua bagian 16-bit. Bit tingkat rendah disimpan dalam 16 bit pertama entri IDT, dan 16 bit tingkat tinggi disimpan dalam 16 bit terakhir entri. Semua ini dilakukan untuk kompatibilitas dengan 286 prosesor. Seperti yang Anda lihat, Intel menghasilkan angka seperti ini secara rutin dan di banyak tempat! Di entri IDT, kita hanya perlu mendaftarkan tipenya, sehingga menunjukkan bahwa semua ini dilakukan untuk menangkap interupsi. Kita juga perlu mengatur offset segmen kode kernel. GRUB menetapkan GDT untuk kita. Setiap entri GDT panjangnya 8 byte, dengan deskriptor kode kernel adalah segmen kedua, sehingga offsetnya adalah 0x08 (detailnya berada di luar cakupan artikel ini). Gerbang interupsi direpresentasikan sebagai 0x8e. Sisanya 8 bit di tengah diisi dengan angka nol. Dengan cara ini kita akan mengisi entri IDT yang sesuai dengan interupsi keyboard. Setelah kita selesai dengan pemetaan IDT, kita perlu memberi tahu prosesor di mana IDT berada. Ada instruksi perakitan yang disebut lidt untuk ini; dibutuhkan satu operan. Ini adalah penunjuk ke deskriptor struktur yang mendeskripsikan IDT. Tidak ada kesulitan dengan deskriptornya. Ini berisi ukuran IDT dalam byte dan alamatnya. Saya menggunakan array untuk membuatnya lebih kompak. Dengan cara yang sama, Anda dapat mengisi deskriptor menggunakan struktur. Dalam variabel idr_ptr kita memiliki pointer yang kita teruskan ke instruksi lidt di fungsi load_idt(). Load_idt: mov edx, tutup lagi Selain itu, fungsi load_idt() mengembalikan interupsi saat menggunakan instruksi sti. Dengan IDT terisi dan dimuat, kita dapat mengakses IRQ keyboard menggunakan masker interupsi yang kita bicarakan sebelumnya. Batal kb_init(batal) ( write_port(0x21, 0xFD); ) 0xFD adalah 11111101 - aktifkan hanya IRQ1 (keyboard). Fungsi - pengendali interupsi keyboardJadi, kami telah berhasil mengikat interupsi keyboard ke fungsi keyboard_handler dengan membuat entri IDT untuk interupsi 0x21. Fungsi ini akan dipanggil setiap kali Anda menekan tombol. Keyboard_handler: panggil keyboard_handler_main iretd Fungsi ini memanggil fungsi lain yang ditulis dalam C dan mengembalikan kontrol menggunakan instruksi kelas iret. Kita bisa menulis keseluruhan handler kita di sini, tapi akan lebih mudah untuk membuat kode dalam C, jadi mari kita beralih ke sana. Instruksi iret/iretd harus digunakan sebagai pengganti ret ketika kontrol kembali dari fungsi penanganan interupsi ke program yang diinterupsi. Kelas instruksi ini memunculkan register flag, yang didorong ke tumpukan ketika interupsi dipanggil. Void keyboard_handler_main(void) ( unsigned char status; char keycode; /* Tulis EOI */ write_port(0x20, 0x20); status = read_port(KEYBOARD_STATUS_PORT); /* Bit status yang lebih rendah akan disetel jika buffer tidak kosong */ if (status & 0x01) ( kode kunci = read_port(KEYBOARD_DATA_PORT); if(kode kunci< 0) return; vidptr = keyboard_map; vidptr = 0x07; } } Disini pertama-tama kita memberikan sinyal EOI (End Of Interrupt) dengan menuliskannya ke port perintah PIC. Hanya dengan demikian PIC akan mengizinkan permintaan interupsi lebih lanjut. Kita perlu membaca dua port: port data 0x60 dan port perintah (alias port status) 0x64. Pertama-tama, kita membaca port 0x64 untuk mendapatkan statusnya. Jika bit terbawah statusnya nol, maka buffer kosong dan tidak ada data untuk dibaca. Dalam kasus lain kita dapat membaca port data 0x60. Ini akan memberi kita kode dari tombol yang ditekan. Setiap kode berhubungan dengan satu tombol. Kami menggunakan array karakter sederhana yang ditentukan di keyboard_map.h untuk memetakan kode ke karakter yang sesuai. Simbol tersebut kemudian ditampilkan di layar menggunakan teknik yang sama yang kita gunakan pada kernel versi pertama. Untuk menyederhanakan kodenya, saya hanya memproses huruf kecil dari a hingga z dan angka dari 0 hingga 9. Anda dapat dengan mudah menambahkan karakter khusus, Alt, Shift, dan Caps Lock. Anda dapat mengetahui bahwa suatu tombol telah ditekan atau dilepaskan dari output port perintah dan melakukan tindakan yang sesuai. Dengan cara yang sama, Anda dapat mengikat pintasan keyboard apa pun ke fungsi khusus seperti mematikan. Sekarang Anda dapat membangun kernel dan menjalankannya di mesin nyata atau di emulator (QEMU) dengan cara yang sama seperti pada bagian pertama. |
Membaca: |
---|
Populer:
Baru
- Bagaimana cara mengetahui VID, PID flashdisk dan untuk apa nomor identifikasi tersebut?
- Huawei P8Lite - Spesifikasi
- Cara membuka kunci ponsel Xiaomi jika Anda lupa kata sandi
- Apptools: cara mendapatkan uang dengan bermain
- Lenovo Vibe K5 Plus - Spesifikasi Spesifikasi Audio dan Kamera
- Memutuskan untuk beralih dari Windows ke Mac?
- Cara menggunakan Google Foto, ikhtisar fungsi login Google foto
- Sistem pembayaran Payza (ex-Alertpay) Login Payza ke akun pribadi Anda
- Bagaimana cara membuka APK dan cara mengeditnya?
- Review smartphone Alpha GT dari Highscreen Pengemasan dan pengiriman