Cara menjalankan program tanpa sistem operasi. Cara menjalankan program tanpa menginstalnya di komputer

Ingin mengizinkan pengguna dengan akun standar untuk menjalankan aplikasi dengan hak administrator tanpa UAC atau permintaan kata sandi? Maka saya akan memberi tahu Anda cara melakukannya. Kami akan membuat pintasan menggunakan perintah runa / savecredyang menyimpan kata sandi. Saya perhatikan bahwa ini dapat dianggap sebagai lubang keamanan - pengguna biasa akan dapat menggunakan runas / savecred untuk menjalankan perintah apa pun atas nama administrator tanpa memasukkan kata sandi. Namun, dalam beberapa situasi ini dapat berguna - misalnya, jika Anda ingin anak Anda dari akun standar dapat menjalankan aplikasi sebagai administrator tanpa meminta Anda.

Aktifkan akun admin

Pertama-tama, Anda harus mengaktifkan akun administrator bawaan, yang dinonaktifkan secara default. Jadi, klik kanan pada pintasan baris perintah dan pilih "Run as administrator".

Di jendela prompt perintah yang terbuka, jalankan perintah berikut:

administrator pengguna net / aktif: ya


Akun tersebut sekarang diaktifkan, walaupun tanpa kata sandi. Untuk mengatur kata sandi, buka Panel Kontrol, pilih kategori Akun Pengguna dan Keamanan Keluarga, lalu buka menu Akun Pengguna. Selanjutnya, klik tautan “Kelola akun lain”.

Pilih akun administrator, klik tombol "Buat Kata Sandi", dan buat kata sandi untuk akun administrator.

Buat jalan pintas

Sekarang kita akan membuat jalan pintas yang akan meluncurkan aplikasi dengan hak administrator. Klik kanan pada desktop, pilih "Buat", dan kemudian klik "Pintasan".

Di jendela yang terbuka, masukkan perintah dari tipe berikut:

runas / pengguna: Nama pengguna\\ Administrator / savecred “ C: \\ Path \\ To \\ Program.exe

Harap dicatat bahwa Anda perlu mengganti Nama pengguna  atas nama komputer Anda, dan C: \\ Path \\ To \\ Program.exe  ke jalur lengkap ke program yang ingin Anda jalankan. Misalnya, jika nama komputer adalah Laptop, dan program yang ingin Anda jalankan adalah Auslogics BoostSpeed, Anda harus memasukkan lintasan berikut:

runas / pengguna: Laptop \\ Administrator / savecred “C: \\ Program Files \\ Auslogics \\ Auslogics BoostSpeed \u200b\u200b\\ BoostSpeed.exe"


Di jendela berikutnya, masukkan nama untuk pintasan. Jika diinginkan, Anda dapat memilih ikon untuk pintasan baru - klik kanan padanya dan pilih "Properti".

Di kotak dialog "Properti", klik tombol "Ubah Ikon" dan pilih yang sesuai.

Ketika Anda mengklik dua kali pintasan untuk pertama kali, Anda akan diminta memasukkan kata sandi untuk akun administrator yang Anda buat sebelumnya.


Kata sandi ini akan disimpan - saat berikutnya Anda menjalankan program, Anda tidak perlu lagi memasukkannya.

Seperti disebutkan di atas, dari akun standar, pengguna dapat menjalankan program apa pun dengan hak administrator tanpa memasukkan kata sandi (menggunakan perintah runas / savecred), jadi ingatlah itu.

Kata sandi administrator disimpan di "Credential Manager" - jika Anda ingin menghapus kata sandi yang disimpan, Anda dapat melakukannya dari sana.

Semoga harimu menyenangkan!

Beberapa aplikasi Windows memerlukan izin tinggi, dan Anda harus menjalankannya sebagai administrator. Kueri " Kontrol Akun Pengguna"(Kontrol Akun Pengguna atau Uac), di mana sistem meminta persetujuan Anda untuk meluncurkan aplikasi.

Banyak pengguna secara keliru percaya bahwa "Kontrol Akun Pengguna" hanya mengganggu dan menonaktifkannya. Pada saat yang sama, keamanan komputer sangat terpengaruh. persetujuan pengguna untuk meluncurkan aplikasi tidak lagi diperlukan, dan program jahat apa pun dapat berjalan dan berjalan tanpa halangan. Kehadiran antivirus juga tidak dapat 100% menjamin keamanan komputer.

Dalam artikel ini saya akan memberi tahu Anda cara menyederhanakan proses peluncuran aplikasi yang dipilih atas nama administrator tanpa menonaktifkan UAC (seluruhnya atau sebagian) dan tanpa mengorbankan keamanan.

Ada beberapa cara untuk menjalankan aplikasi sebagai administrator:

Sebagai contoh, kita akan lari baris perintah  (cmd) sebagai administrator.

  Metode nomor 1 (normal) - mulai melalui tombol kanan mouse (permintaan UAC ditampilkan)

Klik kanan pada ikon aplikasi yang diinginkan  dan pilih " Jalankan sebagai administrator":

  Metode nomor 2 - mulai menggunakan " Ctrl + Shift + Enter"(Permintaan UAC ditampilkan)

Klik Mulai, di bilah pencarian, ketikkan perintah yang diinginkan dan klik Ctrl + Shift + Enter.

  Metode No. 3 - mengatur peluncuran sebagai administrator di properti pintasan (permintaan UAC ditampilkan)

Klik kanan pada pintasan yang diinginkan dan pilih " Sifat-sifat".

Pergi ke " Jalan pintas"klik" Opsional"centang kotak" Jalankan sebagai administrator":


Atau pergi ke " Kompatibilitas"dan centang kotak" Jalankan program ini sebagai administrator":

  Metode nomor 4 - menyederhanakan peluncuran untuk aplikasi yang dipilih menggunakan penjadwal tugas (permintaan UAC tidak ditampilkan)

Penting!  Metode ini hanya berfungsi untuk akun dalam grup. Administrator. Di pengguna biasa  itu tidak akan berhasil, karena hak mereka terbatas di langit-langit mereka.

Kami melewati jalan yang paling menarik. Jika ada aplikasi yang terus Anda jalankan, dan diterima dari produsen perangkat lunak yang andal, misalnya, aplikasi Windows  - Anda dapat menyederhanakan peluncuran. Buat jalan pintas untuk program yang diinginkan  tidak membutuhkan waktu lebih dari 2 menit dan ini akan menghilangkan tindakan yang tidak perlu di masa depan. Kami meluncurkan penjadwal tugas (Mulai---> Semua program ---> Standar---> Kantor---> Penjadwal Tugas) dan klik " Buat tugas":

Tunjukkan Nama depanuntuk tugas baru dan centang kotak " Lakukan dengan hak tertinggi":

Buka tab Tindakanklik " Buat", di jendela berikutnya klik" Ulasan":

Tentukan jalur ke aplikasi yang diinginkan dan klik " Buka":



Perbesar gambar

Dorong " Ok":

Tutup penjadwal dan teruskan membuat pintasan.

Untuk membuat pintasan di desktop, klik kanan, pilih " Buat" ---> "Jalan pintas":


Di lapangan Lokasi objek  masukkan:

Schtasks / run / tn cmd_admin

dimana cmd_admin  - nama tugas yang kami buat. Jika nama berisi spasi, itu harus dilampirkan dalam tanda kutip.

Tetapkan nama label:



Perbesar gambar

Pintasan dibuat dan siap digunakan.

Untuk mengubah ikon - klik kanan pada pintasan, pilih " Sifat-sifat":

Pergi ke " Jalan pintas"dan klik" Ubah ikon":

"Ulasan..."

Tentukan jalur ke program:



Perbesar gambar

Pilih ikon yang diinginkan dan tutup kedua jendela dengan " Ok":

Sekarang meluncurkan aplikasi yang diinginkan sebagai administrator dilakukan dengan mengklik dua kali pada jalan pintas yang dibuat, sementara permintaan UAC tidak ditampilkan dan keamanan tetap utuh.

  Utilitas untuk otomatisasi "Metode nomor 4"

Jika Anda perlu membuat pintasan untuk sejumlah besar program, akan lebih mudah untuk menggunakan utilitas ini.

Bekerja dengan utilitas diturunkan ke dua langkah sederhana:

  • Instalasi
  • Seret dan letakkan file yang dapat dieksekusi (* .exe, * .bat, * .cmd) ke pintasan utilitas:


  Fokus otomatis pada program yang sedang berjalan

Kekhususan meluncurkan aplikasi dari scheduler adalah bahwa fokus pada jendela tidak diterjemahkan dan, misalnya, untuk mengetik perintah pada baris perintah, Anda harus mengklik pada jendela juga. Perilaku seperti itu dapat membantu untuk mengotomatiskan operasi terjadwal rutin, tetapi untuk "Metode No. 4" ini tidak selalu nyaman.

Ada beberapa metode untuk mengatasinya. Mereka bekerja sedikit berbeda, jadi pilihlah yang paling cocok. Yang pertama lebih nyaman untuk menjalankan program, dan yang kedua untuk menjalankan skrip.

Tambahkan saat membuat tugas:

Menggunakan perintah mulai

Program atau skrip:

Argumen:

  / c start / d "program_path" file_name.exe

  / c start / d "C: \\ Windows \\ System32 \\" cmd.exe

Menggunakan NirCmd Utility

Program atau skrip:

Path_k_nircmd \\ nircmd.exe

Argumen:

Exec tampilkan "program_path \\ file_name.exe"

Exec tampilkan "C: \\ Windows \\ System32 \\ cmd.exe"

  Meluncurkan dialog Run sebagai administrator

Mirip dengan meluncurkan baris perintah, Anda dapat mengkonfigurasi peluncuran " Lari", dan perintah yang dimasukkan ke dalamnya juga akan diluncurkan atas nama administrator. Kenyamanan pendekatan ini adalah bahwa daftar perintah yang digunakan sebelumnya disimpan, dan Anda dapat memilih yang diinginkan dari daftar.


Saat membuat tugas di penjadwal, di " Penciptaan aksi"menunjukkan:

di lapangan " Program atau skrip":

Rundll32

di lapangan " Tambahkan argumen":

Shell32.dll, # 61

Unduh utilitasnya, bongkar. Kami meluncurkan baris perintah, masukkan perintah yang diinginkan, sintaksnya cukup sederhana:

<путь к утилите> <путь к нужному приложению>


Prompt UAC ditampilkan dan aplikasi dimulai sebagai administrator.

Catatan:  Dalam konteks menu Windows  7 ada fungsi yang sangat nyaman untuk menyalin path file: tahan Bergeser, klik kanan pada file tersebut, pilih " Salin sebagai jalur".


  Menjalankan program oleh pengguna sebagai administrator tanpa memasukkan kata sandi administrator

Penting!  Metode ini tidak aman karena memungkinkan pengguna dengan hak terbatas untuk menjalankan kode dengan hak penuh. Pengguna atau malware yang licik dapat memanfaatkan hal ini dan membahayakan sistem.

Mari kita pertimbangkan satu tugas lagi yang menarik: akun Anda catatan Windows  milik grup administrator, ada satu atau beberapa akuntermasuk dalam grup pengguna. Pengguna perlu menjalankan program yang membutuhkan peningkatan hak istimewa. Biasanya terlihat seperti ini: pengguna mengklik kanan pada file dan memilih "Run as Administrator", dan permintaan untuk memasukkan kata sandi administrator ditampilkan:


Tentu saja, memberikan kata sandi admin kepada pengguna bukanlah ide yang baik. Untuk menyiasatinya, kita akan menggunakan utilitas AdmiLink dari Alexei Kuryakin. Dengan bantuannya, administrator dapat membuat pintasan bagi pengguna untuk meluncurkan program yang diperlukan, sementara memasukkan kata sandi administrator hanya diperlukan 1 kali - saat membuat pintasan. Ketika pengguna memulai program, kata sandi akan dikirimkan dalam bentuk terenkripsi.



Metode ini akan bekerja jika memulai program hanya mungkin atas nama administrator dan pengembang tidak lupa untuk menunjukkan kondisi ini dalam manifes. Namun, itu tetap ada sejumlah besar  program lama atau program yang dapat dimulai seperti pada mode normal, dan atas nama administrator (dalam hal ini, serangkaian fungsi yang berbeda akan tersedia). Ketika Anda mencoba menjalankan program seperti itu menggunakan AdmiLink, program itu dimulai dalam mode normal (tanpa hak administratif). Dan jika Anda mencoba memasukkan tanda centang di "Metode nomor 3. Gaya asli penulis disimpan.

Bagaimana jika Anda perlu menjalankan program, tetapi Anda tidak ingin menginstalnya? Nol Instal untuk menyelamatkan!

Miliaran orang di seluruh dunia menggunakan komputer atau laptop di ruang operasi. sistem Windows. Biasanya, kami memasang program, setelah itu mereka ambil ruang bebas  pada disk dan gunakan memori akses acak. Ini mengurangi kecepatan komputer.

Hari ini kami akan memberi tahu Anda cara meningkatkan kinerja komputer dan mengurangi beban memori. Untuk melakukan ini, Anda harus menjalankan program yang diperlukan tanpa menginstalnya.

Bagaimana cara menjalankan program tanpa instalasi?

1. Unduh Zero Install.

Pertama, unduh perangkat lunak Zero Install, yang memungkinkan Anda untuk menjalankan program tanpa harus menginstalnya di komputer Anda.

2. Pasang Zero Install.

Setelah Anda mengunduh Zero Install, klik dua kali pada file untuk menginstalnya. Kemudian jalankan program baru  di komputer Anda.

3. Klikbatu "Katalog".

Segera setelah Zero Install diluncurkan di komputer atau windows laptop, Anda harus pergi ke tab "Katalog". Klik tombol “Refresh list” di sini untuk memperbarui daftar program yang tersedia.

4. Pilih program untuk dijalankan.

Perhatikan baik-baik daftar lengkap  program yang tersedia. Jika Anda menemukan program yang Anda butuhkan, pilih dan klik "Run". Beberapa program mungkin memilih browser firefox  atau Mozilla untuk dijalankan. Tunggu saja unduhan lengkapnya. perangkat lunak, setelah itu Anda dapat menjalankannya di komputer Anda tanpa menginstalnya.


Ringkasan

Jika komputer Anda tidak memiliki cukup memori atau daya untuk menjalankan program, Anda dapat menggunakan Zero Install. Saya pikir ini adalah cara yang bagus untuk tidak membuang sampah sembarangan komputer Anda dengan program yang Anda butuhkan pada satu waktu.

Selain itu, komputer Anda mungkin tidak memiliki cukup daya untuk menjalankan program tertentu, misalnya, Eclipse IDE, JetBrains, NetBeans, dll. Ini adalah program yang sangat sulit bagi pengembang yang mengonsumsi RAM dalam jumlah besar.

Zero Install akan membantu meluncurkan ini, dan banyak program lain, tanpa menginstalnya di komputer.

Yang paling penting tidak dijelaskan secara cukup rinci: bagaimana menjalankan kode ini pada perangkat keras nyata? Cara membuatnya sendiri disk boot? Dalam artikel ini, kami akan menjawab semua pertanyaan ini secara terperinci (pertanyaan-pertanyaan ini sebagian dibahas dalam artikel sebelumnya, tetapi untuk kenyamanan membaca, kami membiarkan diri kami menggandakan materi).

Ada banyak deskripsi dan tutorial di internet tentang cara menulis mini-OS Anda sendiri, bahkan ada ratusan OS hobi kecil yang sudah jadi. Salah satu sumber paling berharga tentang hal ini, yang ingin saya tekankan, adalah portal osdev.org. Untuk melengkapi artikel sebelumnya tentang PCI (dan kemampuan untuk menulis artikel selanjutnya tentang berbagai fungsi yang ada di OS modern), kami akan menjelaskan petunjuk langkah demi langkah  untuk membuat boot disk dengan program biasa di C. Kami mencoba menulis sedetail mungkin sehingga kami bisa mengetahuinya sendiri.

Jadi, tujuannya: setelah menghabiskan sesedikit mungkin upaya, buat USB flash drive Anda sendiri yang dapat di-boot, yang hanya mencetak "Hello World" klasik di layar komputer.

Untuk lebih tepatnya, kita perlu "masuk" ke mode terlindungi dengan pengalamatan dan interupsi halaman yang dinonaktifkan - mode prosesor paling sederhana dengan perilaku yang biasa untuk program konsol sederhana. Cara paling masuk akal untuk mencapai tujuan ini adalah membangun kernel yang mendukung format multiboot dan memuatnya menggunakan yang populer boot loader grub. Alternatif untuk solusi ini adalah dengan menulis volume boot record (VBR) Anda sendiri, yang akan memuat bootloader tertulis Anda sendiri (loader). Bootloader yang layak, setidaknya, harus dapat bekerja dengan disk, dengan sistem file, dan parse elf images. Ini berarti Anda perlu menulis banyak kode assembler, dan banyak kode C. Singkatnya, lebih mudah menggunakan Grub, yang sudah tahu cara melakukan semua yang diperlukan.

Untuk mulai dengan, satu set kompiler dan utilitas tertentu diperlukan untuk tindakan lebih lanjut. Cara termudah adalah dengan menggunakan beberapa jenis Linux (misalnya, Ubuntu), karena sudah berisi semua yang Anda butuhkan untuk membuat flash drive yang dapat di-boot. Jika Anda terbiasa bekerja di Windows, Anda dapat mengkonfigurasi mesin virtual dengan Linux (menggunakan Virtual Box atau VMware Workstation).

Jika Anda menggunakan Linux Ubuntu, maka pertama-tama Anda perlu menginstal beberapa utilitas:
  1. Grub. Untuk melakukan ini, gunakan perintah:

Sudo apt-get install grub

2. Qemu. Diperlukan untuk dengan cepat menguji dan men-debug semuanya (Tautan ke artikel tentang debugger), untuk ini perintahnya mirip:

Sudo apt-get install qemu

Sekarang rencana kami terlihat seperti ini:
  1. Buat program C yang mencetak garis pada layar.
  2. kompilasi darinya gambar (kernel.bin) dalam format miniboot sehingga tersedia untuk diunduh menggunakan GRUB.
  3. Buat file gambar disk boot dan formatlah.
  4. Instal Grub pada gambar ini.
  5. salin program yang dibuat (kernel.bin) ke disk.
  6. bakar gambar media fisik  atau jalankan di qemu.

dan proses boot sistem:

Untuk membuatnya berfungsi, Anda perlu membuat beberapa file dan direktori:

Langkah 1. Membuat kode program target (kernel):

Buat file kernel.c yang akan berisi kode berikut yang mencetak pesan di layar:

   #include "printf.h" #include "screen.h" #include "types.h" void main (void) (clear_screen (); printf ("n \u003e\u003e\u003e Hello World! n");)

Semuanya akrab dan sederhana di sini. Menambahkan fungsi printf dan clear_screen akan dibahas nanti. Sementara itu, Anda perlu melengkapi kode ini dengan semua yang diperlukan sehingga dapat dimuat oleh Grub.
  Agar kernel dalam format multiboot, Anda memerlukan struktur berikut dalam 8 kilobyte pertama dari gambar kernel:

Jika semua kondisi ini terpenuhi, maka Grub melewati% eax dan% ebx mendaftarkan pointer ke struktur Informasi multiboot dan nilai 0x1BADB002, masing-masing. Struktur Informasi multiboot berisi berbagai informasi, termasuk daftar modul yang dimuat dan lokasinya, yang mungkin diperlukan untuk pemuatan sistem lebih lanjut.
  Agar file program mengandung tanda tangan yang diperlukan, buat file loader.s dengan konten berikut:

Teks .global loader # membuat titik entri terlihat oleh tautan # mengatur tajuk Multiboot - lihat dokumen GRUB untuk detail .set FLAGS, 0x0 # ini adalah bidang "bendera" Multiboot. Set MAGIC, 0x1BADB002 # "angka ajaib" memungkinkan bootloader ditemukan header .set CHECKSUM, - (MAGIC + FLAGS) # diperlukan checksum .align 4 .long MAGIC .long FLAGS .long CHECKSUM # cadangan ruang stack kernel awal. set STACKSIZE, 0x4000 # yaitu, 16k. .lcomm stack, STACKSIZE # cadangan 16k stack .comm mbd, 4 # kita akan menggunakan ini dalam kmain .comm magic, 4 # kita akan menggunakan ini dalam kmain loader: movl $ (stack + STACKSIZE),% esp # atur stack movl% eax, magic # Multiboot nomor ajaib movl% ebx, mbd # Multiboot struktur data panggilan utama # panggilan C kode cli hang: hlt # halt machine seharusnya kernel kembali jmp hang

Pertimbangkan kodenya lebih detail. Kode ini, hampir tidak berubah, diambil dari wiki.osdev.org/Bare_Bones. Karena gcc digunakan untuk kompilasi, sintaks GAS digunakan. Mari kita lihat lebih dekat apa yang dilakukan kode ini.

Semua kode selanjutnya akan jatuh ke bagian executable .text.

Pemuat global

Kami mendeklarasikan simbol pemuat yang terlihat oleh tautan. Ini diperlukan karena penghubung akan menggunakan loader sebagai titik masuk.

Set FLAGS, 0x0 # assign FLAGS \u003d 0x0 .set MAGIC, 0x1BADB002 # assign MAGIC \u003d 0x1BADB002 .set CHECKSUM, - (MAGIC + FLAGS) # assign CHECKSUM \u003d - (MAGIC + FLAGS) .Selaraskan 4 # sejajarkan data selanjutnya dengan 4 byte. panjang MAGIC # nilai tempat saat ini MAGIC. BENDERA panjang # tempat nilai sekarang BENDERA. CHECKSUM panjang # tempat nilai sekarang

Kode ini membentuk tanda tangan dari format Multiboot. Arahan .set mengatur nilai karakter ke ekspresi di sebelah kanan koma. Arahan .align 4 menyelaraskan konten berikutnya menjadi 4 byte. Arahan lama menyimpan nilai dalam empat byte berikutnya.

Atur STACKSIZE, 0x4000 # assign STACKSIZE \u003d 0x4000 .lcomm stack, STACKSIZE # cadangan STACKSIZE byte. stack merujuk ke range.comm mbd, 4 # cadangan 4 byte untuk variabel mdb di area COMMON .comm magic, 4 # cadangan 4 byte untuk variabel ajaib di area UMUM

Selama proses boot, grub tidak mengkonfigurasi stack, dan hal pertama yang harus dilakukan kernel adalah mengkonfigurasi stack, untuk ini kami memesan byte 0x4000 (16Kb). Arahan.lcomm cadangan di bagian .bss jumlah byte yang ditentukan setelah titik desimal. Tumpukan nama hanya akan terlihat di file yang dikompilasi. Arahan .comm melakukan hal yang sama dengan .lcomm, tetapi nama simbol akan dideklarasikan secara global. Ini berarti bahwa dengan menulis baris berikut dalam kode C, kita dapat menggunakannya.
  ex int int magic

Dan sekarang bagian terakhir:

Loader: movl $ (stack + STACKSIZE),% esp # inisialisasi stack movl% eax, magic # write% eax ke alamat magic movl% ebx, mbd # tulis% ebx ke mbd panggilan utama # panggil fungsi cli utama # putuskan interupsi dari perangkat keras hang: hlt # stop prosesor hingga terjadi gangguan jmp hang # jump to hang label

Instruksi pertama menyimpan nilai bagian atas tumpukan dalam register% esp. Saat tumpukan bertambah, alamat akhir kisaran yang dialokasikan untuk tumpukan ditulis dalam% esp. Dua instruksi selanjutnya menyimpan dalam kisaran yang sebelumnya disediakan 4 byte nilai yang dilewati Grub di% eax,% ebx register. Kemudian fungsi utama, yang sudah ditulis dalam C, disebut. Jika Anda kembali dari prosedur ini, prosesor akan mengulang.

Langkah 2. Persiapan kode tambahan untuk program (pustaka sistem):

Karena seluruh program ditulis dari awal, fungsi printf harus ditulis dari awal. Untuk melakukan ini, siapkan beberapa file.
  Buat folder umum dan sertakan:

Mkdir umum termasuk mkdir

Buat file commonprintf.c yang akan berisi implementasi fungsi printf yang sudah dikenal. Seluruh file ini dapat diambil dari proyek www.bitvisor.org/. Path ke file di sumber bitvisor: core / printf.c. Dalam file printf.c yang disalin dari bitvisor, untuk digunakan dalam program target, Anda perlu mengganti baris:

   #include "initfunc.h" #include "printf.h" #include "putchar.h" #include "spinlock.h"

per baris:

   #include "types.h" #include "stdarg.h" #include "screen.h"

Kemudian, hapus fungsi printf_init_global dan semua rujukannya dalam file ini:

Void printf_init_global statis (void) (spinlock_init (& printf_lock);) INITFUNC ("global0", printf_init_global);

Kemudian hapus variabel printf_lock dan semua rujukannya dalam file ini:

Spinlock_t statis printf_lock; ... spinlock_lock (& \u200b\u200bprintf_lock); ... spinlock_unlock (& \u200b\u200bprintf_lock);

Fungsi printf menggunakan fungsi putchar, yang juga perlu ditulis. Untuk melakukan ini, buat file commonscreen.c dengan konten berikut:

   #include "types.h" #define GREEN 0x2 #define MAX_COL 80 // Jumlah maksimum kolom #define MAX_ROW 25 // Jumlah maksimum baris #define VRAM_SIZE (MAX_COL * MAX_ROW) // Ukuran layar, singkatnya "s # define DEF_VRAM_BASE 0xb8000 // Basis default untuk memori video static unsigned char curr_col \u003d 0; static unsigned char curr_row \u003d 0; // Tulis karakter di lokasi layar saat ini #define PUT (c) (((tidak ditandai pendek *) (DEF_VRAM_BASE)) [ (curr_row * MAX_COL) + curr_col] \u003d (GREEN<< 8) | (c)) // Place a character on next screen position static void cons_putc(int c) { switch (c) { case "t": do { cons_putc(" "); } while ((curr_col % 8) != 0); break; case "r": curr_col = 0; break; case "n": curr_row += 1; if (curr_row >\u003d MAX_ROW) (curr_row \u003d 0;) break; huruf "b": if (curr_col\u003e 0) (curr_col - \u003d 1; PUT ("");) rusak; default: PUT (c); curr_col + \u003d 1; if (curr_col\u003e \u003d MAX_COL) (curr_col \u003d 0; curr_row + \u003d 1; if (curr_row\u003e \u003d MAX_ROW) (curr_row \u003d 0;))); ) void putchar (int c) (if (c \u003d\u003d "n") cons_putc ("r"); cons_putc (c);) void clear_screen (void) (curr_col \u003d 0; curr_row \u003d 0; int i; untuk (i \u003d 0; i< VRAM_SIZE; i++) cons_putc(" "); curr_col = 0; curr_row = 0; }

Kode yang ditentukan berisi logika sederhana untuk mencetak karakter ke layar dalam mode teks. Dalam mode ini, dua byte digunakan untuk merekam karakter (satu dengan kode karakter, yang lain dengan atributnya), ditulis langsung ke memori video yang ditampilkan segera di layar dan dimulai dengan alamat 0xB8000. Resolusi layar adalah 80x25 karakter. Karakter langsung dicetak menggunakan makro PUT.
  Sekarang hanya beberapa file header yang hilang:
  1. File ini termasuk screen.h. Menyatakan fungsi putchar, yang digunakan dalam fungsi printf. Isi file:

   #ifndef _SCREEN_H #define _SCREEN_H batal clear_screen (batal); kekosongan putchar (int c); #endif

2. File termasuk printf.h. Menyatakan fungsi printf, yang digunakan di utama. Isi file:

   #ifndef _PRINTF_H #define _PRINTF_H int printf (format char * const, ...); #endif

3. File ini termasukestharg.h. Mendeklarasikan fungsi untuk menyebutkan argumen, yang jumlahnya tidak diketahui sebelumnya. Seluruh file diambil dari proyek www.bitvisor.org/. Jalur ke file dalam kode proyek bitvisor: Includedecorestdarg.h.
  4. File termasuk tipe.h. Nyatakan NULL dan size_t. Isi file:

   #ifndef _TYPES_H #define _TYPES_H #define NULL 0 mengetikkan unsigned int size_t; #endif

Dengan demikian, folder include dan common berisi kode pustaka sistem minimum yang dibutuhkan oleh setiap program.

Langkah 3. Membuat skrip untuk tautan:

Kami membuat file linker.ld, yang akan digunakan oleh linker untuk menghasilkan file program target (kernel.bin). File tersebut harus berisi yang berikut:

ENTRY (loader) LMA \u003d 0x00100000; BAGIAN (. \u003d LMA; .multiboot ALIGN (0x1000): (loader.o (.text)) .text ALIGN (0x1000): (* (. Teks)) .rodata ALIGN (0x1000): (* (. Rodata *) ) .data ALIGN (0x1000): (* (. data)) .bss: (* (UMUM) * (. bss)) / DISCARD /: (* (. komentar)))

Fungsi bawaan ENTRY () memungkinkan Anda untuk mengatur titik masuk untuk kernel kami. Di alamat inilah grub akan memberikan kontrol setelah boot kernel. Menggunakan skrip ini, penghubung akan membuat file biner dalam format ELF. File ELF terdiri dari sekumpulan segmen dan bagian. Daftar segmen terkandung dalam tabel tajuk Program, daftar bagian dalam tabel tajuk Bagian. Linker beroperasi dengan bagian, pemuat gambar (dalam kasus kami, GRUB) dengan segmen.


Seperti yang Anda lihat pada gambar, segmen terdiri dari bagian. Salah satu bidang yang menggambarkan bagian tersebut adalah alamat virtual di mana bagian tersebut harus pada saat eksekusi. Bahkan, segmen memiliki 2 bidang yang menggambarkan lokasinya: alamat virtual segmen dan alamat fisik segmen. Alamat virtual segmen adalah alamat virtual byte pertama segmen pada saat kode dieksekusi, alamat fisik segmen adalah alamat fisik di mana segmen harus dimuat. Untuk aplikasi, alamat ini selalu cocok. Grub mengunduh segmen gambar di alamat fisiknya. Karena Grub tidak mengonfigurasi pengalamatan halaman, alamat virtual segmen harus sesuai dengan alamat fisiknya, karena dalam program kami, memori virtual juga tidak dikonfigurasikan.

LMA

Ekspresi ini memberi tahu linker bahwa semua bagian berikutnya adalah setelah alamat LMA.

ALIGN (0x1000)

Arahan di atas berarti bahwa bagian tersebut sejajar dengan 0x1000 byte.

Multiboot ALIGN (0x1000): (loader.o (.text))

Bagian multiboot terpisah, yang mencakup bagian .text dari file loader.o, dirancang untuk memastikan bahwa tanda tangan dari format multiboot masuk ke 8kb pertama dari gambar kernel.

Bss: (* (UMUM) * (. Bss))

* (UMUM) adalah area di mana memori dicadangkan oleh instruksi .com dan.lcomm. Kami menempatkannya di bagian .bss.

   / DISCARD /: (* (. Komentar))

Semua bagian bertanda DISCARD dihapus dari gambar. Dalam hal ini, kami menghapus bagian .comment, yang berisi informasi tentang versi tautan.

Sekarang kompilasi kode menjadi file biner dengan perintah berikut:

Sebagai -o loader.o loader.s gcc -Iinclude -Wall -fno-builtin -nostdinc -nostdlib -o kernel.o -c kernel.c gcc -Iinclude -Wall -fno-builtin -nostdinc -nostdlib -o printf.o -c common / printf.c gcc -Iinclude -Wall -fno-builtin -nostdinc -nostdlib -o screen.o -c common / screen.c ld -T linker.ld -o kernel.bin kernel.o screen.o printf .o loader.o

Menggunakan objdump, mari kita lihat seperti apa gambar kernel setelah menautkan:

Objdump -ph ./kernel.bin



Seperti yang Anda lihat, bagian-bagian pada gambar bertepatan dengan yang kami jelaskan dalam skrip tautan. Linker membentuk 3 segmen dari bagian yang dijelaskan. Segmen pertama termasuk bagian.multiboot, .text, .rodata dan memiliki alamat virtual dan fisik 0x00100000. Segmen kedua berisi bagian .data dan .bss dan terletak di 0x00104000. Jadi semuanya siap untuk mengunduh file ini menggunakan Grub.

Langkah 4. Mempersiapkan bootloader Grub:
  Buat folder grub:

Mkdir grub

Salin beberapa file Grub ke folder ini yang diperlukan untuk menginstalnya pada gambar (file-file berikut ada jika Grub diinstal pada sistem). Untuk melakukan ini, jalankan perintah berikut:

Cp / usr / lib / grub / i386-pc / stage1 ./grub/ cp / usr / lib / grub / i386-pc / stage2 ./grub/ cp / usr / lib / grub / i386-pc / fat_stage1_5 ./grub /

Buat file grub / menu.lst dengan konten berikut:

Timeout 3 default 0 title mini_os root (hd0,0) kernel /kernel.bin

Langkah 5. Otomatis dan buat gambar boot:

Untuk mengotomatiskan proses pembuatan, kami akan menggunakan utilitas make. Untuk melakukan ini, buat makefile yang akan dikompilasi kode sumber, bangun kernel dan buat image boot. Makefile harus memiliki konten berikut:

CC \u003d gcc CFLAGS \u003d -Dinding -fno-builtin -nostdinc -nostdlib LD \u003d ld OBJFILES \u003d loader.o common / printf.o common / screen.o kernel.o image: @echo "Membuat hdd.img ..." @ dd if \u003d / dev / zero of \u003d. / hdd.img bs \u003d 512 count \u003d 16065 1\u003e / dev / null 2\u003e & 1 @echo "Membuat partisi FAT32 pertama yang dapat di-boot ..." @losetup / dev / loop1 ./hdd .img @ (gema c; gema u; gema n; gema p; gema 1; gema; gema; gema a; gema 1; gema t; gema c; gema w;) | fdisk / dev / loop1 1\u003e / dev / null 2\u003e & 1 || true @echo "Mounting partisi ke / dev / loop2 ..." @losetup / dev / loop2 ./hdd.img --offset `echo` fdisk -lu / dev / loop1 | sed -n 10p | awk "(cetak $$ 3)" `* 512 | bc` --sizelimit `echo` fdisk -lu / dev / loop1 | sed -n 10p | awk "(cetak $$ 4)" `* 512 | bc` @losetup -d / dev / loop1 @echo "Format partisi ..." @mkdosfs / dev / loop2 @echo "Salin kernel dan grub file di partisi ..." @mkdir -p tempdir @mount / dev / loop2 tempdir @mkdir tempdir / boot @cp -r grub tempdir / boot / @cp kernel.bin tempdir / @sleep 1 @umount / dev / loop2 @rm -r tempdir @losetup -d / dev / loop2 @echo "Instalasi GRUB. .. "@echo" perangkat (hd0) hdd.img n root (hd0,0) n pengaturan (hd0) n quitn "| grub --batch 1\u003e / dev / null @echo "Selesai!" all: kernel.bin rebuild: clean all .s.o: as -o [dilindungi email] $< .c.o: $(CC) -Iinclude $(CFLAGS) -o [dilindungi email]  -c $< kernel.bin: $(OBJFILES) $(LD) -T linker.ld -o [dilindungi email]  $ ^ clean: rm -f $ (OBJFILES) hdd.img kernel.bin

Dua tujuan utama dideklarasikan dalam file: semua - mengkompilasi kernel, dan gambar - yang menciptakan disket boot. Target semua, seperti makefile biasa, berisi subgoals.s.o dan.c.o yang mengkompilasi file * .s dan * .c ke file objek (* .o), serta target untuk menghasilkan kernel.bin, yang memanggil linker dengan skrip yang dibuat sebelumnya. Sasaran ini melakukan perintah yang persis sama dengan yang tercantum di langkah 3.
  Yang paling menarik di sini adalah penciptaan gambar boot  hdd.img (gambar target). Mari kita pertimbangkan secara bertahap bagaimana ini terjadi.

Dd jika \u003d / dev / nol dari \u003d. / Hdd.img bs \u003d 512 count \u003d 16065 1\u003e / dev / null 2\u003e & 1

Perintah ini menciptakan gambar yang akan dilakukan pekerjaan lebih lanjut. Jumlah sektor tidak dipilih secara kebetulan: 16065 \u003d 255 * 63. Secara default, fdsik bekerja dengan disk seolah-olah memiliki geometri CHS, di mana Header (H) \u003d 255, Sektor (S) \u003d 63, dan Silinder © tergantung pada ukuran disk . Dengan demikian, ukuran disk minimum yang dapat bekerja dengan fdsik tanpa mengubah geometri default adalah 512 * 255 * 63 * 1 \u003d 8225280 byte, di mana 512 adalah ukuran sektor dan 1 adalah jumlah silinder.
  Selanjutnya, tabel partisi dibuat:

Losetup / dev / loop1 ./hdd.img (gema c; gema u; gema n; gema 1; gema 1; gema; gema; gema a; gema 1; gema t; gema c; gema w;) | fdisk / dev / loop1 1\u003e / dev / null 2\u003e & 1 || benar

Perintah pertama me-mount file hdd.img ke perangkat blok / dev / loop1, memungkinkan Anda untuk bekerja dengan file sebagai perangkat. Perintah kedua membuat tabel partisi pada perangkat / dev / loop1, di mana ada 1 primer partisi boot  disk yang merentang seluruh disk dengan label sistem file FAT32.
  Kemudian kami memformat bagian yang dibuat. Untuk melakukan ini, pasang sebagai perangkat blok dan lakukan pemformatan.

Losetup / dev / loop2 ./hdd.img --offset `echo` fdisk -lu / dev / loop1 | sed -n 10p | awk "(cetak $$ 3)" `* 512 | bc` --sizelimit `echo` fdisk -lu / dev / loop1 | sed -n 10p | awk "(cetak $$ 4)" `* 512 | bc` losetup -d / dev / loop1

Perintah pertama memasang partisi yang dibuat sebelumnya ke perangkat / dev / loop2. Opsi –offset menunjukkan alamat bagian awal, dan –sizel membatasi alamat bagian akhir. Kedua parameter tersebut diperoleh dengan menggunakan perintah fdisk.

Mkdosfs / dev / loop2

Utilitas mkdosfs memformat partisi di sistem file  FAT32.
  Untuk perakitan langsung kernel, perintah yang sebelumnya dibahas dalam sintaks makefile klasik digunakan.
  Sekarang pertimbangkan cara menginstal GRUB di partisi:

Mkdir -p tempdir # membuat direktori sementara mount / dev / loop2 tempdir # me-mount partisi di direktori mkdir tempdir / boot # membuat direktori / boot di bagian cp -r grub tempdir / boot / # salin folder grub ke / boot cp kernel.bin tempdir / # menyalin kernel ke root dari partisi sleep 1 # tunggu umount Ubuntu / dev / loop2 # unmount folder sementara rm -r tempdir # hapus folder sementara losetup -d / dev / loop2 # unmount partisi

Setelah menjalankan perintah di atas, gambar akan siap untuk menginstal GRUB’a. Perintah berikut menginstal GRUB di MBR dari image disk hdd.img.

Echo "perangkat (hd0) hdd.img n root (hd0,0) n pengaturan (hd0) n quitn" | grub --batch 1\u003e / dev / null

Semuanya siap untuk diuji!

Langkah 6. Peluncuran:

Untuk mengkompilasi, gunakan perintah:

Buat semuanya

Setelah itu file kernel.bin akan muncul.
  Untuk membuat image disk yang dapat di-boot, gunakan perintah:

Sudo membuat gambar

Akibatnya, file hdd.img akan muncul.
  Sekarang Anda dapat mem-boot dari image disk hdd.img. Anda dapat memverifikasi ini dengan perintah berikut:

Qemu -hda hdd.img -m 32

Qemu-system-i386 -hda hdd.img




Untuk memeriksa mesin yang sebenarnya, Anda harus membuat gambar ini pada flash drive dan boot darinya. Misalnya, dengan perintah ini:

Sudo dd if \u003d. / Hdd.img dari \u003d / dev / sdb

Kesimpulannya, kita dapat mengatakan bahwa sebagai hasil dari tindakan yang diambil, satu set kode sumber dan skrip diperoleh yang memungkinkan untuk berbagai percobaan di bidang pemrograman sistem. Langkah pertama telah diambil untuk menciptakan perangkat lunak sistem seperti hypervisor dan sistem operasi.