Oddiy foydalanuvchilarga administrator huquqlari bilan dasturni ishga tushirish imkonini beruvchi yorliq qanday yaratiladi. UAC-ni o'chirmasdan Windows-da ilovalarni administrator sifatida ishlatishni osonlashtirish

Agar dasturni ishga tushirish kerak bo'lsa-yu, lekin uni o'rnatishni xohlamasangiz-chi? Nolinchi o'rnatish yordami!

Dunyo bo'ylab milliardlab odamlar kompyuter yoki noutbuklardan foydalanadilar operatsion tizim Windows. Odatda, biz dasturlarni o'rnatamiz, shundan so'ng ular bo'sh disk maydonini egallaydi va foydalanadi Ram. Bu kompyuter tezligini pasaytiradi.

Bugun biz sizga qanday qilib kompyuteringizning ish faoliyatini oshirishingiz va xotira yukini kamaytirishingiz mumkinligini aytib beramiz. Buning uchun kerakli dasturlarni o'rnatmasdan ishga tushirishingiz kerak.

Dasturni o'rnatmasdan qanday ishga tushirish kerak?

1. Nol o'rnatishni yuklab oling.

Birinchidan, Zero Install dasturini yuklab oling, bu sizga dasturlarni kompyuteringizga o'rnatmasdan ishga tushirish imkonini beradi.

2. Nol o'rnatishni o'rnating.

Zero Install-ni yuklab olganingizdan so'ng, uni o'rnatish uchun faylni ikki marta bosing. Keyin yugur yangi dastur kompyuteringizda.

3. ni bosingduvarcılık "Katalog".

Kompyuterda Zero Install ishga tushirilishi bilanoq yoki Windows noutbuk, siz "Katalog" yorlig'iga o'tishingiz kerak. Bu erda mavjud dasturlar ro'yxatini yangilash uchun "Ro'yxatni yangilash" tugmasini bosing.

4. Ishga tushirish uchun dasturni tanlang.

Yaqindan qarang to'liq ro'yxat mavjud dasturlar. Agar kerakli dasturni topsangiz, uni tanlang va "Ishga tushirish" tugmasini bosing. Ba'zi dasturlar tanlashi mumkin Firefox brauzeri yoki ishga tushirish uchun Mozilla. To'liq yuklab olishni kuting dasturiy ta'minot, shundan so'ng uni o'rnatmasdan kompyuteringizda ishga tushirishingiz mumkin.


Xulosa qilish

Agar kompyuteringizda dasturni ishga tushirish uchun etarli bo'sh xotira yoki quvvat bo'lmasa, siz Zero Install dan foydalanishingiz mumkin. Menimcha, bu sizning kompyuteringizni bir vaqtning o'zida kerakli dasturlar bilan to'ldirmaslikning ajoyib usuli.

Bundan tashqari, sizning kompyuteringiz Eclipse IDE, JetBrains, NetBeans va boshqalar kabi ba'zi dasturlarni ishga tushirish uchun etarli quvvatga ega bo'lmasligi mumkin. Bular iste'mol qiladigan ishlab chiquvchilar uchun juda og'ir dasturlardir katta miqdorda tasodifiy kirish xotirasi.

Zero Install bu va boshqa ko‘plab dasturlarni kompyuteringizga o‘rnatmasdan ishga tushirishga yordam beradi.

Eng muhimi, etarlicha batafsil tavsiflanmagan: ushbu kodni haqiqiy uskunada qanday ishlatish kerak? O'zingizni qanday yaratishingiz mumkin yuklash diski? Ushbu maqolada biz ushbu savollarning barchasiga batafsil javob beramiz (qisman, bu savollar oldingi maqolada ko'rib chiqilgan, ammo o'qish qulayligi uchun biz o'zimizga materialni biroz ko'paytirishga ruxsat beramiz).

O'zingizning mini-OSingizni qanday yozish haqida Internetda juda ko'p ta'riflar va qo'llanmalar mavjud, hatto yuzlab tayyor kichik sevimli mashg'ulot operatsion tizimlari mavjud. Men ta'kidlamoqchi bo'lgan ushbu mavzu bo'yicha eng munosib manbalardan biri bu osdev.org portalidir. PCI haqidagi oldingi maqolani to'ldirish uchun (va har qanday zamonaviy OTda mavjud bo'lgan turli xil funktsiyalar haqida keyingi maqolalarni yozish qobiliyati) biz tasvirlab beramiz bosqichma-bosqich ko'rsatmalar tanish bo'lgan C dasturi bilan yuklanadigan disk yaratish haqida.Biz hamma narsani o'zimiz hal qilishimiz uchun iloji boricha batafsil yozishga harakat qildik.

Shunday qilib, maqsad: iloji boricha kamroq kuch sarflab, o'zingizni yarating yuklanadigan flesh-disk, bu faqat klassik "Salom dunyo" ni kompyuter ekranida chop etadi.

Aniqroq qilib aytadigan bo'lsak, biz o'chirilgan peyjing va uzilishlar bilan himoyalangan rejimga "o'tishimiz" kerak - oddiy konsol dasturi uchun odatiy xatti-harakatlarga ega protsessorning eng oddiy rejimi. Ushbu maqsadga erishishning eng aqlli yo'li - multiboot yadrosini yaratish va uni mashhurdan foydalanib yuklash Grub yuklovchi. Ushbu yechimga alternativa o'zingizning yuklash yozuvingizni (VBR) yozishingiz mumkin, bu sizning yozma yuklagichingizni (yuklagichni) yuklaydi. Yaxshi yuklovchi, hech bo'lmaganda, disk bilan, fayl tizimi bilan ishlashi va elf tasvirlarini tahlil qilishi kerak. Bu juda ko'p montaj kodini va juda ko'p C kodini yozishni anglatadi.Xulosa qilib aytganda, sizga kerak bo'lgan hamma narsani qanday qilishni allaqachon biladigan Grubdan foydalanish osonroq.

Keling, keyingi harakatlar uchun ma'lum kompilyatorlar va yordamchi dasturlar to'plami talab qilinishidan boshlaylik. Eng oson yo'li - ba'zi Linux (masalan, Ubuntu) dan foydalanish, chunki u allaqachon yuklanadigan flesh-diskni yaratish uchun kerak bo'lgan hamma narsani o'z ichiga oladi. Agar siz Windows-da ishlashga odatlangan bo'lsangiz, unda siz sozlashingiz mumkin virtual mashina Linux bilan (Virtual Box yoki VMware Workstation yordamida).

Agar foydalanayotgan bo'lsangiz linux ubuntu, keyin birinchi navbatda siz bir nechta yordamchi dasturlarni o'rnatishingiz kerak:
1. Grub. Buning uchun buyruqdan foydalaning:

sudo apt-get grubni o'rnating

2. Qemu. Hamma narsani tezda sinab ko'rish va disk raskadrovka qilish kerak (tuzatish vositasi haqidagi maqolaga havola), buning uchun buyruq o'xshash:

sudo apt-get install qemu

Endi bizning rejamiz quyidagicha ko'rinadi:
1. ekranda chiziqni chop etuvchi C dasturini yarating.
2. GRUB yordamida yuklash uchun mavjud bo'lishi uchun undan miniboot formatida tasvirni (kernel.bin) yig'ing.
3. yuklash diskidagi tasvir faylini yarating va uni formatlang.
4. Grubni ushbu rasmga o'rnating.
5. yaratilgan dasturni (kernel.bin) diskka nusxalash.
6. tasvirni jismoniy mediaga yozing yoki uni qemu-da ishga tushiring.

va tizimni yuklash jarayoni:

Buni amalga oshirish uchun siz bir nechta fayl va kataloglarni yaratishingiz kerak bo'ladi:

1-qadam. Maqsadli dastur (yadro) kodini yaratish:

Biz ekranda xabarni chop etadigan quyidagi kodni o'z ichiga olgan kernel.c faylini yaratamiz:

#include "printf.h" #include "screen.h" #include "types.h" void main(void) ( clear_screen(); printf("n>>> Salom Dunyo!n"); )

Bu erda hamma narsa tanish va oddiy. Printf va clear_screen funksiyalarini qo'shish keyingi muhokama qilinadi. Ayni paytda, biz ushbu kodni Grub tomonidan yuklanishi uchun barcha kerakli narsalar bilan to'ldirishimiz kerak.
Yadro multiboot formatida bo'lishi uchun yadro tasvirining dastlabki 8 kilobaytida quyidagi struktura bo'lishi kerak:

Agar barcha belgilangan shartlar bajarilsa, u holda Grub ko'rsatkichni multiboot Information strukturasiga va mos ravishda % eax va % ebx registrlari orqali 0x1BADB002 qiymatiga uzatadi. Multiboot Information strukturasi o'z ichiga oladi turli ma'lumotlar, shu jumladan yuklangan modullar ro'yxati va ularning joylashuvi, tizimni keyingi yuklash uchun kerak bo'lishi mumkin.
Dasturga ega fayl kerakli imzolarni o'z ichiga olishi uchun quyidagi tarkibga ega fayl yuklovchi.s ni yarataylik:

Matn .global loader # kirish nuqtasini bog'lovchiga ko'rinadigan qilish # Multiboot sarlavhasini o'rnatish - batafsil ma'lumot uchun GRUB hujjatlarini ko'ring .FLAGS o'rnating, 0x0 # bu Multiboot "bayroq" maydoni .SET MAGIC, 0x1BADB002 # "sehrli raqam" yuklovchiga topish imkonini beradi sarlavha .set CHECKSUM, -(MAGIC + FLAGS) # nazorat summasi kerak .align 4 .long MAGIC .long FLAGS .long CHECKSUM # zahiradagi boshlang‘ich yadro stek maydoni .set STACKSIZE, 0x4000 # ya’ni 16k. .lcomm stack, STACKSIZE # reserve 16k stek .comm mbd, 4 # biz buni kmain .comm magic da ishlatamiz, 4 # buni kmain loaderda ishlatamiz: movl $(stack + STACKSIZE), %esp # stekni sozlash movl %eax, magic # Multiboot sehrli raqami movl %ebx, mbd # Multiboot ma'lumotlar tuzilishi qo'ng'iroq asosiy # qo'ng'iroq C kod cli hang: hlt # halt mashinasi yadro qaytishi kerak jmp osilgan

Keling, kodni batafsil ko'rib chiqaylik. Bu kod wiki.osdev.org/Bare_Bones dan deyarli o'zgarmagan holda olingan. Gcc kompilyatsiya qilish uchun ishlatilganligi sababli, GAS sintaksisi qo'llaniladi. Keling, ushbu kod nima qilishini batafsil ko'rib chiqaylik.

Barcha keyingi kodlar bajariladigan .text bo'limiga tushadi.

global yuklovchi

Biz yuklovchi belgisini bog'lovchiga ko'rinadigan deb e'lon qilamiz. Bu talab qilinadi, chunki bog'lovchi yuklagichni kirish nuqtasi sifatida ishlatadi.

BAYROQLAR ni o'rnating, 0x0 # o'rnating FLAGS = 0x0 .set MAGIC, 0x1BADB002 # set MAGIC = 0x1BADB002 .set CHECKSUM, -(MAGIC + FLAGS) # set CHECKSUM = -(MAGIC + FLAGS) to aligntes by data4 .aligntes by data. long MAGIC # joriy manzildagi qiymat MAGIC .long FLAGS # joy qiymati joriy manzilda FLAGS .long CHECKSUM # joriy manzildagi joy qiymati CHECKSUM

Ushbu kod Multiboot format imzosini yaratadi. .set direktivasi vergulning o'ng tomonidagi ifodaga belgi qiymatini o'rnatadi. .align 4 direktivasi quyidagi tarkibni 4 baytga tenglashtiradi. .long direktivasi qiymatni keyingi to'rt baytda saqlaydi.

STACKSIZE o'rnating, 0x4000 # o'rnating STACKSIZE = 0x4000 .lcomm stek, STACKSIZE # STACKSIZE baytni zaxiralang. stek range.comm mbd ga ishora qiladi, 4 # zahira 4 bayt mdb o'zgaruvchisi uchun COMMON sohasida .comm magic, 4 # reserve 4 bayt sehrli o'zgaruvchi uchun COMMON sohasida

Jarayonda grub boot stekni o'rnatmaydi va yadro qilish kerak bo'lgan birinchi narsa stekni o'rnatishdir, buning uchun biz 0x4000 (16Kb) baytni zaxiralaymiz. .lcomm direktivasi .bss bo'limida verguldan keyin ko'rsatilgan baytlar sonini saqlab qoladi. Nomlar to'plami faqat kompilyatsiya qilingan faylda ko'rinadi. .comm direktivasi .lcomm bilan bir xil ishlaydi, ammo belgi nomi global miqyosda e'lon qilinadi. Bu shuni anglatadiki, C kodiga quyidagi qatorni yozib, biz undan foydalanishimiz mumkin.
extern int magic

Va endi oxirgi qism:

Yuklagich: movl $(stack + STACKSIZE), %esp # stekni ishga tushirish movl %eax, magic # yozish %eax to magic movl %ebx, mbd # %ebx ni mbd qo‘ng‘iroqqa yozish main # cli asosiy funksiyasiga qo‘ng‘iroq qilish # apparat uzilishidan uzilishlarni o‘chirish : hlt # uzilish sodir bo'lguncha protsessorni to'xtating jmp hang # yorliqni osish uchun o'tish

Birinchi ko'rsatma stekning yuqori qismining qiymatini %esp registrida saqlaydi. Stek pastga qarab o'sganligi sababli, stek uchun ajratilgan diapazon oxiri manzili %esp ga yoziladi. Keyingi ikkita ko'rsatmalar Grub %eax, %ebx registrlarida o'tkazadigan qiymatlarni oldindan ajratilgan 4 baytlik diapazonlarda saqlaydi. Keyin C da yozilgan asosiy funktsiya chaqiriladi. Agar ushbu protsedura qaytsa, protsessor loop qiladi.

2-qadam. Dastur uchun qo'shimcha kod tayyorlash (tizim kutubxonasi):

Butun dastur noldan yozilganligi sababli printf funksiyasi noldan yozilishi kerak. Buning uchun siz bir nechta fayllarni tayyorlashingiz kerak.
Keling, umumiy jild yaratamiz va uni qo'shamiz:

mkdir umumiy mkdir o'z ichiga oladi

Keling, tanish printf funksiyasini amalga oshirishni o'z ichiga olgan commonprintf.c faylini yarataylik. Ushbu faylni to'liq holda www.bitvisor.org/ loyihasidan olish mumkin. Bitvisor manbalaridagi faylga yo'l: core/printf.c. Bitvisordan ko'chirilgan printf.c faylida maqsadli dasturda foydalanish uchun siz qatorlarni almashtirishingiz kerak:

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

qatorlarga:

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

Keyin, printf_init_global funksiyasini va uning ushbu fayldagi barcha havolalarini olib tashlang:

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

Keyin printf_lock o'zgaruvchisini va unga ushbu fayldagi barcha havolalarni olib tashlang:

statik spinlock_t printf_lock; ... spinlock_lock(&printf_lock); ... spinlock_unlock(&printf_lock);

Printf funksiyasi putchar funksiyasidan foydalanadi, uni ham yozish kerak. Buning uchun quyidagi tarkibga ega commonscreen.c faylini yaratamiz:

#include "types.h" #define GREEN 0x2 #define MAX_COL 80 // Maksimal ustunlar soni #define MAX_ROW 25 // Maksimal qatorlar sonini #define VRAM_SIZE (MAX_COL*MAX_ROW) // Ekran o‘lchami, qisqasi"s # DEF_VRAM_BASE ni aniqlang 0xb8000 // Video xotirasi uchun standart asos statik unsigned char curr_col = 0; static unsigned char curr_row = 0; // Joriy ekran joyida belgi yozing #define PUT(c) (((insigned short *) (DEF_VRAM_BASE)) [ (curr_row * MAX_COL) + curr_col] = (YASIL<< 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 >= MAX_ROW) ( curr_row = 0; ) tanaffus; "b" holi: agar (curr_col > 0) ( curr_col -= 1; PUT(" "); ) break; standart: PUT(c); curr_col += 1; agar (curr_col >= MAX_COL) ( curr_col = 0; curr_row += 1; if (curr_row >= MAX_ROW) ( curr_row = 0; ) ) ); ) void putchar(int c) ( if (c == "n") cons_putc("r"); cons_putc(c); ) void clear_screen(void) ( curr_col = 0; curr_row = 0; int i; (i) uchun = 0;i< VRAM_SIZE; i++) cons_putc(" "); curr_col = 0; curr_row = 0; }

Belgilangan kod matn rejimida ekranga belgilarni chop etish uchun oddiy mantiqni o'z ichiga oladi. Ushbu rejimda 0xB8000 manzilidan boshlab darhol ekranda ko'rsatiladigan videoxotiraga to'g'ridan-to'g'ri yozilgan belgilarni (biri belgilar kodi bilan, ikkinchisi uning atributlari bilan) yozish uchun ikkita bayt ishlatiladi. Ekran o'lchamlari 80x25 belgi. Belgi to'g'ridan-to'g'ri PUT makrosi yordamida chop etiladi.
Endi faqat bir nechta sarlavha fayllari etishmayapti:
1. Fayl jumladan ekran.h. printf funksiyasida qo'llaniladigan putchar funksiyasini e'lon qiladi. Fayl tarkibi:

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

2. Printf.h fayli. Asosiyda ishlatiladigan printf funksiyasini e'lon qiladi. Fayl tarkibi:

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

3. Fayl includetdarg.h. Argumentlar ustida takrorlash uchun funktsiyalarni e'lon qiladi, ularning soni oldindan ma'lum emas. Butun fayl www.bitvisor.org/ loyihasidan olingan. Bitvisor loyiha kodidagi faylga yo'l: includecorestdarg.h.
4. Includetypes.h fayli. NULL va size_t ni e'lon qiladi. Fayl tarkibi:

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

Shunday qilib, o'z ichiga va umumiy papkalar har qanday dasturga kerak bo'lgan minimal tizim kutubxona kodini o'z ichiga oladi.

3-qadam. Bog'lovchini skriptlash:

Biz linker.ld faylini yaratamiz, u bog'lovchi tomonidan maqsadli dastur faylini (kernel.bin) yaratish uchun ishlatiladi. Faylda quyidagilar bo'lishi kerak:

KIRISH (yuklagich) LMA = 0x00100000; SECTIONS ( . = LMA; .multiboot ALIGN (0x1000) : ( loader.o(.text) ) .text ALIGN (0x1000) : ( *(.text) ) .rodata ALIGN (0x1000) : ( *(.rodata) ) .ma'lumotlarni ALIGN (0x1000) : ( *(.data) ) .bss: ( *(UMUMIY) *(.bss) ) /DISCARD/ : ( *(.comment) ) )

O'rnatilgan ENTRY() funktsiyasi yadromiz uchun kirish nuqtasini o'rnatishga imkon beradi. Grub yadroni yuklagandan so'ng boshqaruvni aynan shu manzilga o'tkazadi. Bog'lovchi ushbu skriptdan ELF formatida ikkilik fayl yaratish uchun foydalanadi. ELF fayli segmentlar va bo'limlar to'plamidan iborat. Segmentlar ro'yxati Dastur sarlavhalari jadvalida, bo'limlar ro'yxati Bo'lim sarlavhasi jadvalida joylashgan. Bog'lovchi bo'limlar bilan, tasvir yuklagichi (bizning holatda, GRUB) segmentlar bilan ishlaydi.


Rasmda ko'rib turganingizdek, segmentlar bo'limlardan iborat. Bo'limni tavsiflovchi maydonlardan biri bo'limni bajarish vaqtida joylashgan bo'lishi kerak bo'lgan virtual manzildir. Aslida, segmentda uning joylashuvini tavsiflovchi 2 ta maydon mavjud: segmentning virtual manzili va segmentning jismoniy manzili. Segmentning virtual manzili - kod bajarilayotgan paytda segmentning birinchi baytining virtual manzili, segmentning jismoniy manzili - segment yuklanishi kerak bo'lgan jismoniy manzil. Ilova dasturlari uchun bu manzillar har doim bir xil bo'ladi. Grub rasm segmentlarini jismoniy manzili bo'yicha yuklaydi. Grub peyjingni o'rnatmagani uchun segmentning virtual manzili uning jismoniy manziliga mos kelishi kerak, chunki bizning dasturimizda virtual xotira ham sozlanmaydi.

LMA;

Ushbu ifoda bog'lovchiga keyingi barcha bo'limlar LMA manzilidan keyin ekanligini bildiradi.

ALIGN (0x1000)

Yuqoridagi direktiva bo'lim 0x1000 baytga tenglashtirilganligini bildiradi.

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

Multiboot format imzosi yadro tasvirining birinchi 8kb hajmiga tushishini ta'minlash uchun loader.o faylidagi .text qismini o'z ichiga olgan alohida multiboot bo'limi yaratilgan.

Bss: ( *(COMMON) *(.bss) )

*(COMMON) - .comm va .lcomm ko'rsatmalari bilan xotira zahiralangan maydon. Biz uni .bss bo'limiga joylashtiramiz.

/DISCARD/ : ( *(.sharh) )

Tasvirdan BO'LDI deb belgilangan barcha bo'limlar o'chiriladi. Bunday holda, biz bog'lovchi versiyasi haqida ma'lumotni o'z ichiga olgan .comment bo'limini olib tashlaymiz.

Endi kodni quyidagi buyruqlar bilan ikkilik faylga kompilyatsiya qilamiz:

As -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 yuklovchi.o

Objdump-dan foydalanib, ulangandan keyin yadro tasviri qanday ko'rinishini ko'rib chiqamiz:

Objdump -ph ./kernel.bin



Ko'rib turganingizdek, rasmdagi bo'limlar biz bog'lovchi skriptda tasvirlangan qismlarga mos keladi. Bog'lovchi tasvirlangan bo'limlardan 3 ta segmentni hosil qildi. Birinchi segment .multiboot, .text, .rodata bo'limlarini o'z ichiga oladi va 0x00100000 virtual va jismoniy manzilga ega. Ikkinchi segment .data va .bss bo'limlarini o'z ichiga oladi va 0x00104000 da joylashgan. Shunday qilib, Grub yordamida ushbu faylni yuklash uchun hamma narsa tayyor.

4-qadam Grub yuklash moslamasini tayyorlash:
Grub papkasini yarating:

mkdir grub

Rasmga o'rnatish uchun zarur bo'lgan ba'zi Grub fayllarini ushbu jildga nusxalang (agar tizimda Grub o'rnatilgan bo'lsa, quyidagi fayllar mavjud). Buning uchun siz quyidagi buyruqlarni bajarishingiz kerak:

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 /

Quyidagi tarkibga ega grub/menu.lst faylini yarating:

Vaqt tugashi 3 standart 0 sarlavha mini_os ildiz (hd0,0) yadro /kernel.bin

5-qadam: Avtomatlashtirish va yuklash tasvirini yaratish:

Qurilish jarayonini avtomatlashtirish uchun biz make yordam dasturidan foydalanamiz. Buning uchun biz manba kodini kompilyatsiya qiladigan, yadroni quradigan va yuklash tasvirini yaratadigan makefile yaratamiz. Makefile quyidagi tarkibga ega bo'lishi kerak:

CC=gcc CFLAGS=-Wall -fno-builtin -nostdinc -nostdlib LD=ld OBJFILES=loader.o common/printf.o common/screen.o kernel.o tasvir: @echo "Hdd.img yaratilmoqda..." @ dd if=/dev/zero of=./hdd.img bs=512 count=16065 1>/dev/null 2>&1 @echo "Birinchi yuklanadigan FAT32 bo'limi yaratilmoqda..." @losetup /dev/loop1 ./hdd .img @(echo c; echo u; echo n; echo p; echo 1; echo ; echo ; echo a; echo 1; echo t; echo c; echo w;) | fdisk /dev/loop1 1>/dev/null 2>&1 || true @echo "Bo'lim /dev/loop2 ga o'rnatilmoqda..." @losetup /dev/loop2 ./hdd.img --offset `echo `fdisk -lu /dev/loop1 | sed -n 10p | awk "($3 chop etish)"`*512 | bc` --sizelimit `echo `fdisk -lu /dev/loop1 | sed -n 10p | awk "($4 chop etish)"`*512 | bc` @losetup -d /dev/loop1 @echo "Bo'limni formatlash..." @mkdosfs /dev/loop2 @echo "Bo'limga yadro va grub fayllarini nusxalash..." @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 "GRUB o'rnatilmoqda. .." @echo "qurilma (hd0) hdd.img n root (hd0,0) n o'rnatish (hd0) n tugashi" | grub --batch 1>/dev/null @echo "Bajarildi!" all: kernel.bin rebuild: pok all .s.o: as -o [elektron pochta himoyalangan] $< .c.o: $(CC) -Iinclude $(CFLAGS) -o [elektron pochta himoyalangan]-c$< kernel.bin: $(OBJFILES) $(LD) -T linker.ld -o [elektron pochta himoyalangan]$^ toza: rm -f $(OBJFILES) hdd.img kernel.bin

Fayl ikkita asosiy maqsadni e'lon qiladi: yadroni kompilyatsiya qiluvchi barchasi va yuklash diskini yaratuvchi tasvir. Barcha maqsad, odatdagi makefile kabi, *.s va *.c fayllarini ob'yekt fayllariga (*.o) kompilyatsiya qiluvchi .s.o va .c.o pastki maqsadlarini, shuningdek, qo'ng'iroq qiluvchi kernel.bin yaratish maqsadini o'z ichiga oladi. ilgari yaratilgan skript bilan bog'lovchi. Ushbu maqsadlar 3-bosqichdagi kabi bir xil buyruqlarni bajaradi.
Bu erda ijodkorlik eng katta qiziqish uyg'otadi yuklash tasviri hdd.img (tasvir maqsadi). Keling, bu qanday sodir bo'lishini bosqichma-bosqich ko'rib chiqaylik.

Dd, agar=/dev/zero of=./hdd.img bs=512 count=16065 1>/dev/null 2>&1

Ushbu buyruq keyingi ish olib boriladigan tasvirni yaratadi. Sektorlar soni tasodifiy tanlanmagan: 16065 = 255 * 63. Odatiy bo'lib, fdsik diskni xuddi CHS geometriyasiga ega bo'lgandek ko'rsatadi, bunda Sarlavhalar (H) = 255, Sektorlar (S) = 63 va silindrlar © ga bog'liq. disk hajmi. Shunday qilib, fdsik standart geometriyani o'zgartirmasdan ishlashi mumkin bo'lgan minimal disk hajmi 512 * 255 * 63 * 1 = 8225280 bayt, bu erda 512 - sektor o'lchami va 1 - silindrlar soni.
Keyinchalik, bo'lim jadvali yaratiladi:

Losetup /dev/loop1 ./hdd.img (echo c; echo u; echo n; echo p; echo 1; echo ; echo ; echo a; echo 1; echo t; echo c; echo w;) | fdisk /dev/loop1 1>/dev/null 2>&1 || rost

Birinchi buyruq hdd.img faylini /dev/loop1 blok qurilmasiga o'rnatib, faylni qurilma sifatida ko'rib chiqishga imkon beradi. Ikkinchi buyruq /dev/loop1 qurilmasida bo'lim jadvalini yaratadi, unda 1 ta asosiy mavjud yuklash bo'limi butun diskni egallagan va FAT32 etiketli disk.
Keyin yaratilgan bo'limni formatlaymiz. Buning uchun siz uni blok qurilma sifatida o'rnatishingiz va formatlashingiz kerak.

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

Birinchi buyruq avval yaratilgan bo'limni /dev/loop2 qurilmasiga o'rnatadi. -ofset opsiyasi bo'lim boshi manzilini belgilaydi va bo'lim oxiri manzilini -sizelimit. Ikkala variant ham fdisk buyrug'i yordamida olinadi.

Mkdosfs /dev/loop2

Mkdosfs yordam dasturi bo'limni formatlaydi fayl tizimi FAT32.
Yadroni to'g'ridan-to'g'ri qurish uchun klassik makefile sintaksisida ilgari ko'rib chiqilgan buyruqlar qo'llaniladi.
Endi GRUBni bo'limga qanday o'rnatishni ko'rib chiqamiz:

mkdir -p tempdir # vaqtinchalik katalogni yaratadi /dev/loop2 tempdir # bo'limni mkdir katalogiga o'rnatadi tempdir/boot # bo'limda /boot katalogini yaratadi cp -r grub tempdir/boot/ # grub papkasini /ga nusxalash boot cp kernel.bin tempdir / # yadroni bo'limning ildiziga nusxa ko'chiradi uyqu 1 # Ubuntu umount /dev/loop2 ni kuting # vaqtinchalik papkani o'chirib qo'ying rm -r tempdir # vaqtinchalik papkani o'chiring losttup -d /dev/loop2 # bo'limni ajratib oling

Yuqoridagi buyruqlar bajarilgandan so'ng, rasm GRUBni o'rnatishga tayyor bo'ladi. Quyidagi buyruq GRUB-ni hdd.img disk tasvirining MBR-ga o'rnatadi.

Echo "qurilma (hd0) hdd.img n root (hd0,0) n sozlash (hd0) n quitn" | grub --batch 1>/dev/null

Hammasi sinovga tayyor!

6-qadam Ishga tushirish:

Kompilyatsiya qilish uchun quyidagi buyruqdan foydalaning:

Hammasini qiling

Shundan so'ng kernel.bin fayli paydo bo'lishi kerak.
Yuklanadigan disk tasvirini yaratish uchun quyidagi buyruqdan foydalaning:

sudo tasvir yaratish

Natijada, hdd.img fayli paydo bo'lishi kerak.
Endi siz hdd.img disk tasviridan yuklashingiz mumkin. Buni quyidagi buyruq bilan tekshirishingiz mumkin:

Qemu -hda hdd.img -m 32

qemu-system-i386 -hda hdd.img




Haqiqiy mashinani tekshirish uchun siz ushbu tasvirni flesh-diskga qo'shishingiz va undan yuklashingiz kerak. Masalan, bu buyruq:

Sudo dd if=./hdd.img of=/dev/sdb

Xulosa qilib aytishimiz mumkinki, amalga oshirilgan harakatlar natijasida tizim dasturlash sohasida turli tajribalar o'tkazish imkonini beruvchi manba kodlari va skriptlar to'plami olinadi. Gipervizorlar va operatsion tizimlar kabi tizimli dasturiy ta'minotni yaratish yo'lida birinchi qadam qo'yildi.

Eng muhimi, etarlicha batafsil tavsiflanmagan: ushbu kodni haqiqiy uskunada qanday ishlatish kerak? O'z yuklash diskini qanday yaratish mumkin? Ushbu maqolada biz ushbu savollarning barchasiga batafsil javob beramiz (qisman, bu savollar oldingi maqolada ko'rib chiqilgan, ammo o'qish qulayligi uchun biz o'zimizga materialni biroz ko'paytirishga ruxsat beramiz).

O'zingizning mini-OSingizni qanday yozish haqida Internetda juda ko'p ta'riflar va qo'llanmalar mavjud, hatto yuzlab tayyor kichik sevimli mashg'ulot operatsion tizimlari mavjud. Men ta'kidlamoqchi bo'lgan ushbu mavzu bo'yicha eng munosib manbalardan biri bu osdev.org portalidir. PCI (va har qanday zamonaviy OTda mavjud bo'lgan turli funktsiyalar haqida keyingi maqolalarni yozish qobiliyati) haqidagi oldingi maqolani to'ldirish uchun biz tanish C dasturi bilan yuklash diskini yaratish bo'yicha bosqichma-bosqich ko'rsatmalarni tasvirlab beramiz. Hamma narsani o'zingiz hal qilish uchun iloji boricha batafsil yozing.

Shunday qilib, maqsad: iloji boricha kamroq kuch sarflab, kompyuter ekranida klassik "Salom dunyo" ni chop etadigan o'zingizning yuklanadigan USB flesh-diskingizni yarating.

Aniqroq qilib aytadigan bo'lsak, biz o'chirilgan peyjing va uzilishlar bilan himoyalangan rejimga "o'tishimiz" kerak - oddiy konsol dasturi uchun odatiy xatti-harakatlarga ega protsessorning eng oddiy rejimi. Ushbu maqsadga erishishning eng aqlli usuli - ko'p yuklash yadrosini yaratish va mashhur Grub bootloader yordamida uni yuklash. Ushbu yechimga alternativa o'zingizning yuklash yozuvingizni (VBR) yozishingiz mumkin, bu sizning yozma yuklagichingizni (yuklagichni) yuklaydi. Yaxshi yuklovchi, hech bo'lmaganda, disk bilan, fayl tizimi bilan ishlashi va elf tasvirlarini tahlil qilishi kerak. Bu juda ko'p montaj kodini va juda ko'p C kodini yozishni anglatadi.Xulosa qilib aytganda, sizga kerak bo'lgan hamma narsani qanday qilishni allaqachon biladigan Grubdan foydalanish osonroq.

Keling, keyingi harakatlar uchun ma'lum kompilyatorlar va yordamchi dasturlar to'plami talab qilinishidan boshlaylik. Eng oson yo'li - ba'zi Linux (masalan, Ubuntu) dan foydalanish, chunki u allaqachon yuklanadigan flesh-diskni yaratish uchun kerak bo'lgan hamma narsani o'z ichiga oladi. Agar siz Windows-da ishlashga odatlangan bo'lsangiz, Linux virtual mashinasini o'rnatishingiz mumkin (Virtual Box yoki VMware Workstation yordamida).

Agar siz Linux Ubuntu dan foydalanayotgan bo'lsangiz, birinchi navbatda bir nechta yordamchi dasturlarni o'rnatishingiz kerak:
1. Grub. Buning uchun buyruqdan foydalaning:
sudo apt-get install grub

2. Qemu. Hamma narsani tez qilish kerak, buning uchun buyruq o'xshash:
sudo apt-get install qemu

Endi bizning rejamiz quyidagicha ko'rinadi:
1. ekranda chiziqni chop etuvchi C dasturini yarating.
2. GRUB yordamida yuklash uchun mavjud bo'lishi uchun undan miniboot formatida tasvirni (kernel.bin) yig'ing.
3. yuklash diskidagi tasvir faylini yarating va uni formatlang.
4. Grubni ushbu rasmga o'rnating.
5. yaratilgan dasturni (kernel.bin) diskka nusxalash.
6. tasvirni jismoniy mediaga yozing yoki uni qemu-da ishga tushiring.

Va tizimni yuklash jarayoni:

Buni amalga oshirish uchun siz bir nechta fayl va kataloglarni yaratishingiz kerak bo'ladi:

1-qadam. Maqsadli dastur (yadro) kodini yaratish:

Biz ekranda xabarni chop etadigan quyidagi kodni o'z ichiga olgan kernel.c faylini yaratamiz:

#include "printf.h" #include "screen.h" #include "types.h" void main(void) ( clear_screen(); printf("\n>>> Salom Dunyo!\n"); )

Bu erda hamma narsa tanish va oddiy. Printf va clear_screen funksiyalarini qo'shish keyingi muhokama qilinadi. Ayni paytda, biz ushbu kodni Grub tomonidan yuklanishi uchun barcha kerakli narsalar bilan to'ldirishimiz kerak.
Yadro multiboot formatida bo'lishi uchun yadro tasvirining dastlabki 8 kilobaytida quyidagi struktura bo'lishi kerak:

Agar barcha belgilangan shartlar bajarilsa, u holda Grub ko'rsatkichni multiboot Information strukturasiga va mos ravishda % eax va % ebx registrlari orqali 0x1BADB002 qiymatiga uzatadi. Multiboot Information strukturasi tizimni keyingi yuklash uchun kerak bo'lishi mumkin bo'lgan yuklangan modullar ro'yxati va ularning joylashuvi kabi turli xil ma'lumotlarni o'z ichiga oladi.
Dasturga ega fayl kerakli imzolarni o'z ichiga olishi uchun quyidagi tarkibga ega fayl yuklovchi.s ni yarataylik:

Matn .global loader # kirish nuqtasini bog'lovchiga ko'rinadigan qilish # Multiboot sarlavhasini o'rnatish - batafsil ma'lumot uchun GRUB hujjatlarini ko'ring .FLAGS o'rnating, 0x0 # bu Multiboot "bayroq" maydoni .SET MAGIC, 0x1BADB002 # "sehrli raqam" yuklovchiga topish imkonini beradi sarlavha .set CHECKSUM, -(MAGIC + FLAGS) # nazorat summasi kerak .align 4 .long MAGIC .long FLAGS .long CHECKSUM # zahiradagi boshlang‘ich yadro stek maydoni .set STACKSIZE, 0x4000 # ya’ni 16k. .lcomm stack, STACKSIZE # reserve 16k stek .comm mbd, 4 # biz buni kmain .comm magic da ishlatamiz, 4 # buni kmain loaderda ishlatamiz: movl $(stack + STACKSIZE), %esp # stekni sozlash movl %eax, magic # Multiboot sehrli raqami movl %ebx, mbd # Multiboot ma'lumotlar tuzilishi qo'ng'iroq asosiy # qo'ng'iroq C kod cli hang: hlt # halt mashinasi yadro qaytishi kerak jmp osilgan

Keling, kodni batafsil ko'rib chiqaylik. Bu kod wiki.osdev.org/Bare_Bones dan deyarli o'zgarmagan holda olingan. Gcc kompilyatsiya qilish uchun ishlatilganligi sababli, GAS sintaksisi qo'llaniladi. Keling, ushbu kod nima qilishini batafsil ko'rib chiqaylik.
.matn
Barcha keyingi kodlar bajariladigan .text bo'limiga tushadi.
.global loader
Biz yuklovchi belgisini bog'lovchiga ko'rinadigan deb e'lon qilamiz. Bu talab qilinadi, chunki bog'lovchi yuklagichni kirish nuqtasi sifatida ishlatadi.
.BAYroqlarni o'rnatish, 0x0 # bayroqlarni o'rnatish = 0x0 .MAGIC, 0x1BADB002 # o'rnatish MAGIC = 0x1BADB002 .CHECKSUM, -(MAGIC + FLAGS) # o'rnatish CHECKSUM = -(MAGIC + FLAGS) #align4 to align ma'lumotlar. .long MAGIC # MAGIC qiymatini joriy manzilga qo'ying .long FLAGS # BAYROQ qiymatini joriy manzilga qo'ying .long CHECKSUM # joriy manzilga CHECKSUM qiymatini joylashtiring
Ushbu kod Multiboot format imzosini yaratadi. .set direktivasi vergulning o'ng tomonidagi ifodaga belgi qiymatini o'rnatadi. .align 4 direktivasi quyidagi tarkibni 4 baytga tenglashtiradi. .long direktivasi qiymatni keyingi to'rt baytda saqlaydi.
.set STACKSIZE, 0x4000 # set STACKSIZE = 0x4000 .lcomm stek, STACKSIZE # bir STACKSIZE bayt zahira. stek range.comm mbd ga ishora qiladi, 4 # zahira 4 bayt mdb o'zgaruvchisi uchun COMMON sohasida .comm magic, 4 # reserve 4 bayt sehrli o'zgaruvchi uchun COMMON sohasida
Yuklash jarayonida grub stekni o'rnatmaydi va yadro birinchi bo'lib stekni o'rnatishi kerak, buning uchun biz 0x4000 (16Kb) baytni zaxiralaymiz. .lcomm direktivasi .bss bo'limida verguldan keyin ko'rsatilgan baytlar sonini saqlab qoladi. Nomlar to'plami faqat kompilyatsiya qilingan faylda ko'rinadi. .comm direktivasi .lcomm bilan bir xil ishlaydi, ammo belgi nomi global miqyosda e'lon qilinadi. Bu shuni anglatadiki, C kodiga quyidagi qatorni yozib, biz undan foydalanishimiz mumkin.
extern int magic

Va endi oxirgi qism:
loader: movl $(stack + STACKSIZE), %esp # stekni ishga tushirish movl %eax, magic # yozish %eax to magic movl %ebx, mbd # %ebx ni mbd qo‘ng‘iroqqa yozish main # cli asosiy funktsiyaga qo‘ng‘iroq qilish # apparat uzilishidan uzilishlarni o‘chirish : hlt # uzilish sodir bo'lguncha protsessorni to'xtating jmp hang # yorliqni osish uchun o'tish

Birinchi ko'rsatma stekning yuqori qismining qiymatini %esp registrida saqlaydi. Stek pastga qarab o'sganligi sababli, stek uchun ajratilgan diapazon oxiri manzili %esp ga yoziladi. Keyingi ikkita ko'rsatmalar Grub %eax, %ebx registrlarida o'tkazadigan qiymatlarni oldindan ajratilgan 4 baytlik diapazonlarda saqlaydi. Keyin C da yozilgan asosiy funktsiya chaqiriladi. Agar ushbu protsedura qaytsa, protsessor loop qiladi.

2-qadam. Dastur uchun qo'shimcha kod tayyorlash (tizim kutubxonasi):

Butun dastur noldan yozilganligi sababli printf funksiyasi noldan yozilishi kerak. Buning uchun siz bir nechta fayllarni tayyorlashingiz kerak.
Keling, umumiy jild yaratamiz va uni qo'shamiz:

mkdir umumiy mkdir o'z ichiga oladi

Keling, umumiy\printf.c faylini yarataylik, unda tanish printf funksiyasi amalga oshiriladi. Ushbu faylni to'liq holda www.bitvisor.org loyihasidan olish mumkin. Bitvisor manbalaridagi faylga yo'l: core/printf.c. Bitvisordan ko'chirilgan printf.c faylida maqsadli dasturda foydalanish uchun siz qatorlarni almashtirishingiz kerak:

#include "initfunc.h" #include "printf.h" #include "putchar.h" #include "spinlock.h"
qatorlarga:
#include "types.h" #include "stdarg.h" #include "screen.h"

Keyin, printf_init_global funksiyasini va uning ushbu fayldagi barcha havolalarini olib tashlang:

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

Keyin printf_lock o'zgaruvchisini va unga ushbu fayldagi barcha havolalarni olib tashlang:
statik spinlock_t printf_lock; ... spinlock_lock(&printf_lock); ... spinlock_unlock(&printf_lock);

Printf funksiyasi putchar funksiyasidan foydalanadi, uni ham yozish kerak. Buning uchun quyidagi tarkibga ega umumiy\screen.c faylini yaratamiz:
#include "types.h" #define GREEN 0x2 #define MAX_COL 80 // Maksimal ustunlar soni #define MAX_ROW 25 // Maksimal qatorlar sonini #define VRAM_SIZE (MAX_COL*MAX_ROW) // Ekran o‘lchami, qisqasi"s # DEF_VRAM_BASE ni aniqlang 0xb8000 // Video xotirasi uchun standart asos statik unsigned char curr_col = 0; statik unsigned char curr_row = 0; // Joriy ekran joyida belgi yozing #define PUT(c) (((insigned short *) (DEF_VRAM_BASE)) \ [(curr_row * MAX_COL) + curr_col] = (YASIL<< 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 >= MAX_ROW) ( curr_row = 0; ) tanaffus; case "\b": if (curr_col > 0) ( curr_col -= 1; PUT(" "); ) break; standart: PUT(c); curr_col += 1; agar (curr_col >= MAX_COL) ( curr_col = 0; curr_row += 1; if (curr_row >= MAX_ROW) ( curr_row = 0; ) ) ); ) void putchar(int c) ( if (c == "\n") cons_putc("\r"); cons_putc(c); ) void clear_screen(void) ( curr_col = 0; curr_row = 0; int i; uchun (i = 0; i< VRAM_SIZE; i++) cons_putc(" "); curr_col = 0; curr_row = 0; }

Belgilangan kod matn rejimida ekranga belgilarni chop etish uchun oddiy mantiqni o'z ichiga oladi. Ushbu rejimda 0xB8000 manzilidan boshlab darhol ekranda ko'rsatiladigan videoxotiraga to'g'ridan-to'g'ri yozilgan belgilarni (biri belgilar kodi bilan, ikkinchisi uning atributlari bilan) yozish uchun ikkita bayt ishlatiladi. Ekran o'lchamlari 80x25 belgi. Belgi to'g'ridan-to'g'ri PUT makrosi yordamida chop etiladi.
Endi faqat bir nechta sarlavha fayllari etishmayapti:
1. File include\screen.h. printf funksiyasida qo'llaniladigan putchar funksiyasini e'lon qiladi. Fayl tarkibi:
#ifndef _SCREEN_H #define _SCREEN_H void clear_screen(void); void putchar(int c); #endif

2. Fayl oʻz ichiga\printf.h. Asosiyda ishlatiladigan printf funksiyasini e'lon qiladi. Fayl tarkibi:
#ifndef _PRINTF_H #define _PRINTF_H int printf (const char *format, ...); #endif

3. Fayl ichiga\stdarg.h. Argumentlar ustida takrorlash uchun funktsiyalarni e'lon qiladi, ularning soni oldindan ma'lum emas. Butun fayl www.bitvisor.org loyihasidan olingan. Bitvisor loyiha kodidagi faylga yo'l: include\core\stdarg.h.
4. Fayl ichiga oladi\types.h. NULL va size_t ni e'lon qiladi. Fayl tarkibi:
#ifndef _TYPES_H #define _TYPES_H #define NULL 0 typedef unsigned int size_t; #endif
Shunday qilib, o'z ichiga va umumiy papkalar har qanday dasturga kerak bo'lgan minimal tizim kutubxona kodini o'z ichiga oladi.

3-qadam. Bog'lovchini skriptlash:

Biz linker.ld faylini yaratamiz, u bog'lovchi tomonidan maqsadli dastur faylini (kernel.bin) yaratish uchun ishlatiladi. Faylda quyidagilar bo'lishi kerak:

KIRISH (yuklagich) LMA = 0x00100000; SECTIONS ( . = LMA; .multiboot ALIGN (0x1000) : ( loader.o(.text) ) .text ALIGN (0x1000) : ( *(.text) ) .rodata ALIGN (0x1000) : ( *(.rodata) ) .ma'lumotlarni ALIGN (0x1000) : ( *(.data) ) .bss: ( *(UMUMIY) *(.bss) ) /DISCARD/ : ( *(.comment) ) )

O'rnatilgan ENTRY() funktsiyasi yadromiz uchun kirish nuqtasini o'rnatishga imkon beradi. Grub yadroni yuklagandan so'ng boshqaruvni aynan shu manzilga o'tkazadi. Bog'lovchi ushbu skriptdan ELF formatida ikkilik fayl yaratish uchun foydalanadi. ELF fayli segmentlar va bo'limlar to'plamidan iborat. Segmentlar ro'yxati Dastur sarlavhalari jadvalida, bo'limlar ro'yxati Bo'lim sarlavhasi jadvalida joylashgan. Bog'lovchi bo'limlar bilan, tasvir yuklagichi (bizning holatda, GRUB) segmentlar bilan ishlaydi.


Rasmda ko'rib turganingizdek, segmentlar bo'limlardan iborat. Bo'limni tavsiflovchi maydonlardan biri bo'limni bajarish vaqtida joylashgan bo'lishi kerak bo'lgan virtual manzildir. Aslida, segmentda uning joylashuvini tavsiflovchi 2 ta maydon mavjud: segmentning virtual manzili va segmentning jismoniy manzili. Segmentning virtual manzili - kod bajarilayotgan paytda segmentning birinchi baytining virtual manzili, segmentning jismoniy manzili - segment yuklanishi kerak bo'lgan jismoniy manzil. Ilova dasturlari uchun bu manzillar har doim bir xil bo'ladi. Grub rasm segmentlarini jismoniy manzili bo'yicha yuklaydi. Grub peyjingni sozlamaganligi sababli segmentning virtual manzili uning jismoniy manziliga mos kelishi kerak, chunki bizning dasturimizda virtual xotira ham sozlanmagan.

BO'LIMLAR
Bo'limlar keyingi tavsiflanganligini bildiradi.
. = LMA;
Ushbu ifoda bog'lovchiga keyingi barcha bo'limlar LMA manzilidan keyin ekanligini bildiradi.
ALIGN (0x1000)
Yuqoridagi direktiva bo'lim 0x1000 baytga tenglashtirilganligini bildiradi.
.multiboot ALIGN (0x1000): ( loader.o(.text) )
Multiboot format imzosi yadro tasvirining birinchi 8kb hajmiga tushishini ta'minlash uchun loader.o faylidagi .text qismini o'z ichiga olgan alohida multiboot bo'limi yaratilgan.
.bss: ( *(COMMON) *(.bss) )
*(COMMON) - .comm va .lcomm ko'rsatmalari bilan xotira zahiralangan maydon. Biz uni .bss bo'limiga joylashtiramiz.
/DISCARD/ : ( *(.sharh) )
Tasvirdan BO'LDI deb belgilangan barcha bo'limlar o'chiriladi. Bunday holda, biz bog'lovchi versiyasi haqida ma'lumotni o'z ichiga olgan .comment bo'limini olib tashlaymiz.

Endi kodni quyidagi buyruqlar bilan ikkilik faylga kompilyatsiya qilamiz:
as -o loader.o loader.s gcc -Isclude -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 yuklovchi.o
Objdump-dan foydalanib, ulangandan keyin yadro tasviri qanday ko'rinishini ko'rib chiqamiz:
objdump -ph ./kernel.bin


Ko'rib turganingizdek, rasmdagi bo'limlar biz bog'lovchi skriptda tasvirlangan qismlarga mos keladi. Bog'lovchi tasvirlangan bo'limlardan 3 ta segmentni hosil qildi. Birinchi segment .multiboot, .text, .rodata bo'limlarini o'z ichiga oladi va 0x00100000 virtual va jismoniy manzilga ega. Ikkinchi segment .data va .bss bo'limlarini o'z ichiga oladi va 0x00104000 da joylashgan. Shunday qilib, Grub yordamida ushbu faylni yuklash uchun hamma narsa tayyor.

4-qadam Grub yuklash moslamasini tayyorlash:
Grub papkasini yarating:
mkdir grub

Rasmga o'rnatish uchun zarur bo'lgan ba'zi Grub fayllarini ushbu jildga nusxalang (agar tizimda Grub o'rnatilgan bo'lsa, quyidagi fayllar mavjud). Buning uchun siz quyidagi buyruqlarni bajarishingiz kerak:
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 /

Quyidagi tarkibga ega grub/menu.lst faylini yarating:
vaqt tugashi 3 standart 0 sarlavha mini_os ildiz (hd0,0) yadro /kernel.bin

5-qadam: Avtomatlashtirish va yuklash tasvirini yaratish:

Qurilish jarayonini avtomatlashtirish uchun biz make yordam dasturidan foydalanamiz. Buning uchun biz manba kodini kompilyatsiya qiladigan, yadroni quradigan va yuklash tasvirini yaratadigan makefile yaratamiz. Makefile quyidagi tarkibga ega bo'lishi kerak:

CC=gcc CFLAGS=-Wall -fno-builtin -nostdinc -nostdlib LD=ld OBJFILES=\loader.o\common/printf.o\common/screen.o\kernel.o tasvir: @echo "Hdd.img yaratilmoqda. .." @dd if=/dev/zero of=./hdd.img bs=512 count=16065 1>/dev/null 2>&1 @echo "Birinchi yuklanadigan FAT32 bo'limi yaratilmoqda..." @losetup /dev/ loop1 ./hdd.img @(echo c; echo u; echo n; echo p; echo 1; echo ; echo ; echo a; echo 1; echo t; echo c; echo w;) | fdisk /dev/loop1 1>/dev/null 2>&1 || true @echo "Bo'lim /dev/loop2 ga o'rnatilmoqda..." @losetup /dev/loop2 ./hdd.img \ --offset `echo \`fdisk -lu /dev/loop1 | sed -n 10p | awk "($3 $ chop etish)"\`*512 | bc` \ --sizelimit `echo \`fdisk -lu /dev/loop1 | sed -n 10p | awk "($4 chop etish)"\`*512 | bc` @losetup -d /dev/loop1 @echo "Bo'limni formatlash..." @mkdosfs /dev/loop2 @echo "Bo'limga yadro va grub fayllarini nusxalash..." @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 "GRUB o'rnatilmoqda. .." @echo "qurilma (hd0) hdd.img \n \ root (hd0,0) \n \ sozlash (hd0) \n \ chiqish\n" | grub --batch 1>/dev/null @echo "Bajarildi!" all: kernel.bin rebuild: pok all .s.o: as -o [elektron pochta himoyalangan] $< .c.o: $(CC) -Iinclude $(CFLAGS) -o [elektron pochta himoyalangan]-c$< kernel.bin: $(OBJFILES) $(LD) -T linker.ld -o [elektron pochta himoyalangan]$^ toza: rm -f $(OBJFILES) hdd.img kernel.bin

Fayl ikkita asosiy maqsadni e'lon qiladi: yadroni kompilyatsiya qiluvchi barchasi va yuklash diskini yaratuvchi tasvir. Barcha maqsad, odatdagi makefile kabi, *.s va *.c fayllarini ob'yekt fayllariga (*.o) kompilyatsiya qiluvchi .s.o va .c.o pastki maqsadlarini, shuningdek, qo'ng'iroq qiluvchi kernel.bin yaratish maqsadini o'z ichiga oladi. ilgari yaratilgan skript bilan bog'lovchi. Ushbu maqsadlar 3-bosqichdagi kabi bir xil buyruqlarni bajaradi.
Bu erda hdd.img (tasvir maqsadi) yuklash tasvirini yaratish katta qiziqish uyg'otadi. Keling, bu qanday sodir bo'lishini bosqichma-bosqich ko'rib chiqaylik.
dd if=/dev/zero of=./hdd.img bs=512 count=16065 1>/dev/null 2>&1
Ushbu buyruq keyingi ish olib boriladigan tasvirni yaratadi. Sektorlar soni tasodifiy tanlanmagan: 16065 = 255 * 63. Odatiy bo'lib, fdsik diskni xuddi CHS geometriyasiga ega bo'lgandek ko'radi, unda Sarlavhalar (H) = 255, Sektorlar (S) = 63 va Tsilindrlar (C) disk hajmiga bog'liq. Shunday qilib, fdsik standart geometriyani o'zgartirmasdan ishlashi mumkin bo'lgan minimal disk hajmi 512 * 255 * 63 * 1 = 8225280 bayt, bu erda 512 - sektor o'lchami va 1 - silindrlar soni.
Keyinchalik, bo'lim jadvali yaratiladi:
losttup /dev/loop1 ./hdd.img (echo c; echo u; echo n; echo p; echo 1; echo ; echo ; echo a; echo 1; echo t; echo c; echo w;) | fdisk /dev/loop1 1>/dev/null 2>&1 || rost
Birinchi buyruq hdd.img faylini /dev/loop1 blok qurilmasiga o'rnatib, faylni qurilma sifatida ko'rib chiqishga imkon beradi. Ikkinchi buyruq /dev/loop1 qurilmasida FAT32 fayl tizimi bilan belgilangan butun diskni egallagan diskning 1 ta asosiy yuklash qismini o'z ichiga olgan bo'limlar jadvalini yaratadi.
Keyin yaratilgan bo'limni formatlaymiz. Buning uchun siz uni blok qurilma sifatida o'rnatishingiz va formatlashingiz kerak.
losttup /dev/loop2 ./hdd.img \ --offset `echo \`fdisk -lu /dev/loop1 | sed -n 10p | awk "($3 $ chop etish)"\`*512 | bc` \ --sizelimit `echo \`fdisk -lu /dev/loop1 | sed -n 10p | awk "($4 chop etish)"\`*512 | bc` losttup -d /dev/loop1
Birinchi buyruq avval yaratilgan bo'limni /dev/loop2 qurilmasiga o'rnatadi. -ofset opsiyasi bo'lim boshi manzilini belgilaydi va bo'lim oxiri manzilini -sizelimit. Ikkala variant ham fdisk buyrug'i yordamida olinadi.
mkdosfs /dev/loop2
Mkdosfs yordam dasturi FAT32 fayl tizimiga bo'limni formatlaydi.
Yadroni to'g'ridan-to'g'ri qurish uchun klassik makefile sintaksisida ilgari ko'rib chiqilgan buyruqlar qo'llaniladi.
Endi GRUBni bo'limga qanday o'rnatishni ko'rib chiqamiz:
mkdir -p tempdir # vaqtinchalik katalogni yaratadi /dev/loop2 tempdir # bo'limni mkdir katalogiga o'rnatadi tempdir/boot # bo'limda /boot katalogini yaratadi cp -r grub tempdir/boot/ # grub papkasini /ga nusxalash boot cp kernel.bin tempdir / # yadroni bo'limning ildiziga nusxa ko'chiradi uyqu 1 # Ubuntu umount /dev/loop2 ni kuting # vaqtinchalik papkani o'chirib qo'ying rm -r tempdir # vaqtinchalik papkani o'chiring losttup -d /dev/loop2 # bo'limni ajratib oling
Yuqoridagi buyruqlar bajarilgandan so'ng, rasm GRUBni o'rnatishga tayyor bo'ladi. Quyidagi buyruq GRUB-ni hdd.img disk tasvirining MBR-ga o'rnatadi.
echo "device (hd0) hdd.img \n \ root (hd0,0) \n \ setup (hd0) \n \ quit\n" | grub --batch 1>/dev/null

Hammasi sinovga tayyor!

6-qadam Ishga tushirish:

Kompilyatsiya qilish uchun quyidagi buyruqdan foydalaning:
hammasini qilish
Shundan so'ng kernel.bin fayli paydo bo'lishi kerak.
Yuklanadigan disk tasvirini yaratish uchun quyidagi buyruqdan foydalaning:
sudo tasvir yaratish
Natijada, hdd.img fayli paydo bo'lishi kerak.
Endi siz hdd.img disk tasviridan yuklashingiz mumkin. Buni quyidagi buyruq bilan tekshirishingiz mumkin:
qemu -hda hdd.img -m 32
yoki:
qemu-system-i386 -hda hdd.img



Haqiqiy mashinani tekshirish uchun siz ushbu tasvirni flesh-diskga qo'shishingiz va undan yuklashingiz kerak. Masalan, bu buyruq:
sudo dd if=./hdd.img of=/dev/sdb

Xulosa qilib aytishimiz mumkinki, amalga oshirilgan harakatlar natijasida tizim dasturlash sohasida turli tajribalar o'tkazish imkonini beruvchi manba kodlari va skriptlar to'plami olinadi. Gipervizorlar va operatsion tizimlar kabi tizimli dasturiy ta'minotni yaratish yo'lida birinchi qadam qo'yildi.

Ba'zi ilovalar Windows tizimida ishlash uchun yuqori imtiyozlarni talab qiladi va ularni administrator sifatida ishlatish kerak. Bu sizni " Foydalanuvchi hisobini boshqarish" (Foydalanuvchi hisobini boshqarish yoki UAC), bunda tizim ilovani ishga tushirishga roziligingizni so'raydi.

Ko'pgina foydalanuvchilar "Foydalanuvchi hisobini boshqarish" faqat noqulaylik deb hisoblashadi va uni o'chirib qo'yishadi. Shu bilan birga, kompyuterning xavfsizligi jiddiy ta'sir ko'rsatadi, chunki. ilovalarni ishga tushirish uchun foydalanuvchi roziligi endi talab qilinmaydi va har qanday zararli dastur muammosiz ishga tushishi va ishlashi mumkin. Antivirusning mavjudligi ham kompyuter xavfsizligini 100% kafolatlay olmaydi.

Ushbu maqolada men sizga UACni (to'liq yoki qisman) o'chirmasdan va xavfsizlikni buzmasdan administrator sifatida sevimli ilovalaringizni ishga tushirish jarayonini qanday soddalashtirishni ko'rsataman.

Ilovani administrator sifatida ishga tushirishning bir necha yo'li mavjud:

Misol tariqasida biz yuguramiz buyruq qatori(cmd) administrator sifatida.

1-usul (normal) - sichqonchaning o'ng tugmasi orqali ishga tushirish (UAC so'rovi ko'rsatiladi)

Belgini o'ng tugmasini bosing kerakli dastur va "ni tanlang Administrator sifatida ishga tushirish":

2-usul - "yordamida ishga tushirish" Ctrl+Shift+Enter" (UAC so'rovi ko'rsatiladi)

bosing Boshlash, qidiruv satriga yozing kerakli buyruq va bosing Ctrl+Shift+Enter.

3-usul - yorliqning xususiyatlarida administrator sifatida ishga tushirishni o'rnating (UAC so'rovi ko'rsatiladi)

Kerakli yorliqni o'ng tugmasini bosing va "ni tanlang. Xususiyatlari".

Yorliqga o'tish " Yorliq"," tugmasini bosing Qo'shimcha", tekshiring" Administrator sifatida ishga tushirish":


Yoki "ga boring Moslik"va katakchani belgilang" Ushbu dasturni administrator sifatida ishga tushiring":

4-usul - Vazifalar rejalashtiruvchisi yordamida tanlangan ilovalarni ishga tushirishni osonlashtiring (UAC so'rovi ko'rsatilmaydi)

Muhim! Bu usul faqat guruh a'zolari bo'lgan hisoblar uchun ishlaydi. Administratorlar. Bu oddiy foydalanuvchilar uchun ishlamaydi, chunki ularning maksimal ruxsatnomalari cheklangan.

Keling, eng qiziqarli yo'lga o'tamiz. Agar siz doimo ishlaydigan dastur bo'lsa va u ishonchli dasturiy ta'minot sotuvchisidan kelgan bo'lsa, masalan, bu windows ilovasi- boshlash osonroq bo'lishi mumkin. uchun yorliq yarating kerakli dastur 2 daqiqadan ko'proq vaqt talab qilmaydi va bu kelajakda keraksiz harakatlardan xalos bo'lishga imkon beradi. Biz ishga tushiramiz vazifalarni rejalashtiruvchi (Boshlash---> Barcha dasturlar ---> Standart---> Xizmat---> Vazifalarni rejalashtiruvchi) va "bosing" Vazifa yarating":

Belgilang Ism yangi vazifa uchun va katakchani belgilang " Eng yuqori imtiyozlar bilan boshqaring":

Tabga o'ting Harakatlar, tugmasini bosing Yaratmoq", keyingi oynada " ni bosing Ko‘rib chiqish":

Kerakli dasturga yo'lni belgilang va "ni bosing. Ochiq":



Rasmni kattalashtirish

tugmasini bosing OK":

Rejalashtiruvchini yoping va yorliq yaratishni davom eting.

Ish stolida yorliq yaratish uchun sichqonchaning o'ng tugmachasini bosing, "ni tanlang. Yaratmoq" ---> "Yorliq":


Dalada Mulkning joylashuvi kiriting:

Schtasks /run /tn cmd_admin

qayerda cmd_admin- biz yaratgan vazifaning nomi. Agar ismda bo'sh joylar bo'lsa, u qo'shtirnoq ichiga olinishi kerak.

Yorliq nomini belgilang:



Rasmni kattalashtirish

Yorliq yaratilgan va foydalanishga tayyor.

Belgini o'zgartirish uchun - yorliqni o'ng tugmasini bosing, "ni tanlang. Xususiyatlari":

Yorliqga o'tish " Yorliq"va bosing" belgisini o'zgartirish":

"Ko‘rib chiqish..."

Dasturga yo'lni belgilang:



Rasmni kattalashtirish

Kerakli belgini tanlang va ikkala oynani "" tugmasi bilan yoping. OK":

Endi kerakli dasturni administrator sifatida ishga tushirish yaratilgan yorliqni ikki marta bosish orqali amalga oshiriladi, UAC so'rovi ko'rsatilmaydi va xavfsizlik saqlanib qoladi.

Avtomatlashtirish uchun yordamchi dastur "4-usul"

Agar siz ko'p sonli dasturlar uchun yorliqlarni yaratishingiz kerak bo'lsa, yordamchi dasturdan foydalanish qulay.

Yordamchi dastur bilan ishlash ikkita oddiy bosqichdan iborat:

  • O'rnatish
  • Bajariladigan faylni (*.exe, *.bat, *.cmd) yordamchi dastur yorlig'iga sudrab olib boring:


Fokusni avtomatik ravishda ishlaydigan dasturga o'tkazish

Rejalashtiruvchidan ilovalarni ishga tushirishning o'ziga xos xususiyati shundaki, diqqat oynaga o'tkazilmaydi va, masalan, buyruq satrida buyruq yozish uchun siz qo'shimcha ravishda oynani bosishingiz kerak. Ushbu xatti-harakatlar muntazam rejalashtirilgan operatsiyalarni avtomatlashtirishga yordam beradi, ammo "4-usul" uchun bu har doim ham qulay emas.

"O'tish" uchun bir necha usullar mavjud. Ular biroz boshqacha ishlaydi, shuning uchun sizga eng mos keladiganini tanlang. Birinchisi dasturlarni ishga tushirish uchun qulayroq, ikkinchisi esa skriptlarni ishga tushirish uchun.

Vazifa yaratishda qo'shing:

Boshlash buyrug'idan foydalanish

Dastur yoki skript:

Argumentlar:

/c start /d "yo'l_dastur" file_name.exe

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

NirCmd yordam dasturidan foydalanish

Dastur yoki skript:

Path_to_nircmd\nircmd.exe

Argumentlar:

Exec dasturi "path_to_program\file_name.exe" ni ko'rsatadi.

Exec "C: \ Windows \ System32 \ cmd.exe" ni ko'rsatadi.

Administrator sifatida "Ishga tushirish" dialogini ishga tushirish

Buyruqlar qatorini ishga tushirishga o'xshab, siz dialog oynasini ishga tushirishni sozlashingiz mumkin " Yugurish", va unga kiritilgan buyruqlar administrator sifatida ham ishga tushiriladi. Bunday yondashuvning qulayligi shundaki, avval foydalanilgan buyruqlar ro'yxati saqlanadi va siz ro'yxatdan o'zingizga keraklisini tanlashingiz mumkin.


Rejalashtiruvchida vazifa yaratishda " Harakat yarating"aniqlash:

dalada " Dastur yoki skript":

Rundll 32

dalada " Argumentlar qo'shish":

Shell32.dll, №61

Yordamchi dasturni yuklab oling, paketdan chiqaring. Biz buyruq qatorini ishga tushiramiz, kerakli buyruqni kiritamiz, sintaksis juda oddiy:

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


UAC so'rovi ko'rsatiladi va dastur administrator sifatida ishlaydi.

Eslatma: DA kontekst menyusi Windows 7 da juda qulay fayl yo'lini nusxalash xususiyati mavjud: bosib turing Shift, faylni o'ng tugmasini bosing, tanlang " yo'l sifatida nusxalash".


Administrator parolini kiritmasdan administrator sifatida foydalanuvchi tomonidan dasturlarni ishga tushirish

Muhim! Ushbu usul xavfsiz emas, chunki u cheklangan huquqlarga ega foydalanuvchiga kodni to'liq huquqlar bilan ishlatish imkonini beradi. Ayyor foydalanuvchi yoki zararli dastur bundan foydalanishi va tizimni buzishi mumkin.

Yana bir qiziqarli muammoni ko'rib chiqing: hisobingiz Windows kirish administratorlar guruhining a'zosi, bir yoki bir nechtasi bor hisoblar foydalanuvchilar guruhi a'zolari. Foydalanuvchi balandlikni talab qiladigan dasturni ishga tushirishi kerak. Odatda shunday ko'rinadi: foydalanuvchi faylni sichqonchaning o'ng tugmasi bilan bosing va "Administrator sifatida ishga tushirish" ni tanlaydi, bu sizga administrator parolini kiritishni taklif qiladi:


Albatta, foydalanuvchilarga administrator parolini berish yaxshi fikr emas. Buni "aylanib o'tish" uchun biz Aleksey Kuryakinning AdmiLink yordam dasturidan foydalanamiz. Uning yordami bilan administrator foydalanuvchi uchun kerakli dasturni ishga tushirish uchun yorliq yaratishi mumkin, administrator parolini kiritish faqat 1 marta talab qilinadi - yorliqni yaratishda. Foydalanuvchi dasturni ishga tushirganda, parol shifrlangan shaklda uzatiladi.



Agar dastur faqat ma'mur sifatida ishga tushirilishi mumkin bo'lsa va ishlab chiquvchi manifestda ushbu shartni ko'rsatishni unutmagan bo'lsa, bu usul ishlaydi. Biroq, odatdagi rejimda ham, administrator sifatida ham ishga tushirilishi mumkin bo'lgan juda ko'p eski dasturlar yoki dasturlar mavjud (boshqa funktsiyalar to'plami mavjud). Bunday dasturni AdmiLink yordamida ishga tushirishga harakat qilganingizda, u oddiy rejimda (ma'muriy imtiyozlarsiz) boshlanadi. Va agar siz katakchani belgilashga harakat qilsangiz "3-usul raqami. Muallifning asl uslubi saqlanib qolgan.

gastroguru 2017