Hogyan lehet programot futtatni operációs rendszer nélkül. A program futtatása számítógépre telepítése nélkül

Szeretné engedélyezni a normál fiókkal rendelkező felhasználók számára, hogy adminisztrátori jogosultságokkal rendelkező alkalmazásokat futtassanak UAC vagy jelszó kérés nélkül? Akkor elmondom, hogyan kell csinálni. A parancs segítségével létrehozunk egy parancsikont runas / savecredamely elmenti a jelszót. Megjegyzem, hogy ez biztonsági lyuknak tekinthető - egy hétköznapi felhasználó a runas / savecred használatával bármilyen parancsot végrehajthat a rendszergazda nevében jelszó megadása nélkül. Bizonyos helyzetekben azonban ez hasznos lehet - például ha azt akarja, hogy egy szokásos fiókból származó gyermeke képes legyen adminisztrátorként futtatni az alkalmazásokat anélkül, hogy kérdezne tőled.

Adminisztrátori fiók engedélyezése

Mindenekelőtt engedélyeznie kell a beépített rendszergazdai fiókot, amelyet alapértelmezés szerint letiltott. Tehát, kattintson a jobb gombbal a parancssori parancsikonra, és válassza a "Futtatás rendszergazdaként" menüpontot.

A megnyíló parancssori ablakban futtassa a következő parancsot:

net felhasználó adminisztrátor / aktív: igen


A fiók most engedélyezve van, bár jelszó nélkül. Jelszó beállításához nyissa meg a Vezérlőpultot, válassza a Felhasználói fiókok és a Családbiztonság kategóriát, majd nyissa meg a Felhasználói fiókok menüt. Ezután kattintson a „Másik fiók kezelése” linkre.

Válasszon egy rendszergazdai fiókot, kattintson a "Jelszó létrehozása" gombra, és hozzon létre egy jelszót a rendszergazdai fiókhoz.

Hozzon létre parancsikont

Most létrehozunk egy parancsikont, amely elindítja az alkalmazást rendszergazdai jogosultságokkal. Kattintson a jobb gombbal az asztalon, válassza a „Létrehozás” lehetőséget, majd kattintson a „Parancsikon” elemre.

A megnyíló ablakban írja be a következő típusú parancsot:

runas / felhasználó: ComputerName\\ Adminisztrátor / mentőcím “ C: \\ elérési út \\ a \\ Program.exe

Felhívjuk figyelmét, hogy ki kell cserélni ComputerName   számítógépének nevében, és C: \\ elérési út \\ a \\ Program.exe   a futtatni kívánt program teljes elérési útjához. Például, ha a számítógép neve Laptop, és a futtatni kívánt program az Auslogics BoostSpeed, akkor a következő útvonalat kell megadnia:

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


A következő ablakban írja be a parancsikon nevét. Ha szükséges, kiválaszthat egy ikont egy új parancsikonhoz - kattintson rá a jobb gombbal, és válassza a "Tulajdonságok" lehetőséget.

A "Tulajdonságok" párbeszédpanelen kattintson a "Ikon megváltoztatása" gombra, és válassza ki a megfelelőt.

Amikor duplán kattint a parancsikonra, a rendszer kéri, hogy írja be a korábban létrehozott rendszergazdai fiók jelszavát.


Ez a jelszó el lesz mentve - a program legközelebbi futtatásakor már nem kell újból beírnia.

Mint fentebb említettük, a normál fiókok alatt a felhasználók bármilyen programot futtathatnak rendszergazdai jogokkal jelszó megadása nélkül (a runas / savecred paranccsal), ezért ne feledje ezt.

Az adminisztrátori jelszót a "Hitelesítő adatok kezelője" tárolja - ha törölni szeretné a mentett jelszót, akkor meg is tudja csinálni.

Remek napot!

Egyes Windows alkalmazásokhoz megnövelt engedélyekre van szükség, és ezeket rendszergazdaként kell futtatnia. A " Felhasználói fiókok ellenőrzése"(Felhasználói fiókok ellenőrzése vagy UAC), amelyben a rendszer kéri az Ön hozzájárulását az alkalmazás elindításához.

Sok felhasználó tévesen hiszi, hogy a "felhasználói fiókok ellenőrzése" csak zavarja és tiltja azt. Ugyanakkor a számítógépes biztonságot súlyosan érinti. Az alkalmazások elindításához már nincs szükség felhasználói hozzájárulásra, és minden rosszindulatú program akadálytalanul futhat és futhat. A víruskereső jelenléte szintén nem garantálja a számítógép biztonságát.

Ebben a cikkben elmondom, hogyan lehet egyszerűsíteni a kiválasztott alkalmazások rendszergazda nevében történő elindítását az UAC (teljes vagy részleges) letiltása és a biztonság veszélyeztetése nélkül.

Az alkalmazás rendszergazdaként történő futtatásához többféle módszert használhat:

Példaként futunk parancssor   (cmd) adminisztrátorként.

  1. módszer (normál) - kezdje meg a jobb egérgombbal (megjelenik az UAC kérés)

Kattintson a jobb gombbal az ikonra a kívánt alkalmazás   és válassza a " Futtatás rendszergazdaként":

  2. módszer - kezdje el használni a " Ctrl + Shift + Enter"(Megjelenik az UAC kérés)

sajtó kezdet, írja be a keresősávba a kívánt parancsot, majd kattintson a gombra Ctrl + Shift + Enter.

  3. módszer - állítsa be az indítást rendszergazdaként a parancsikon tulajdonságainál (megjelenik az UAC kérés)

Kattintson a jobb gombbal a kívánt parancsikonra, és válassza a " A tulajdonságok".

Lépjen a " címke"Click" emellett"jelölje be a négyzetet" Futtatás rendszergazdaként":


Vagy lépjen a " kompatibilitás"és jelölje be a négyzetet" Futtassa ezt a programot rendszergazdaként":

  4. módszer - egyszerűsíti a kiválasztott alkalmazások indítását a feladatütemezővel (az UAC kérés nem jelenik meg)

Fontos!   Ez a módszer csak a csoport fiókjaira működik. A rendszergazdák. -ban hétköznapi felhasználók   nem fog működni, mert jogaik a felső határra korlátozódnak.

Haladunk a legérdekesebb úthoz. Ha van egy alkalmazás, amelyet folyamatosan fut, és például megbízható szoftvergyártótól érkezik, például ez a Windows alkalmazás, egyszerűsítheti az indítást. Hozzon létre egy parancsikont a következőhöz: a kívánt program   nem vesz több mint 2 percet, és ez megszabadul a szükségtelen tevékenységektől a jövőben. Indítunk feladatütemező (kezdet---> Minden program ---> standard---> System Tools---> Feladat ütemező), majd kattintson a " Hozzon létre feladatot":

meghatározza Keresztnévúj feladathoz, és jelölje be a " Végezzen el a legmagasabb jogokkal":

Lépjen a lapra akciókkattintson a " teremt", kattintson a következő ablakban a" áttekintés":

Adja meg a kívánt alkalmazás elérési útját, majd kattintson a " nyílt":



Kép nagyítása

Push " rendben":

Zárja be az ütemezőt, és lépjen tovább a parancsikon létrehozásához.

Az asztalon parancsikon létrehozásához kattintson a jobb gombbal, válassza a " teremt" ---> "címke":


A mezőn Az objektum helye   írja:

Schtasks / run / tn cmd_admin

ahol cmd_admin   - a létrehozott feladat neve. Ha a név szóközöket tartalmaz, idézőjelekbe kell helyezni.

Állítsa be a címke nevét:



Kép nagyítása

A parancsikon létrehozva és használatra kész.

Az ikon megváltoztatásához kattintson a jobb gombbal a parancsikonra, válassza a " A tulajdonságok":

Lépjen a " címke"és kattintson a" Változás ikonra":

"áttekintés..."

Adja meg a program elérési útját:



Kép nagyítása

Válassza ki a kívánt ikont, és zárja be mindkét ablakot a " rendben":

Most a kívánt alkalmazás rendszergazdaként történő elindítását a létrehozott parancsikon duplán történő kattintásával hajthatjuk végre, miközben az UAC kérés nem jelenik meg, és a biztonság sértetlen marad.

  Segédprogram a "4. módszer" automatizálásához

Ha sok programhoz parancsikonokat kell létrehoznia, akkor kényelmes a segédprogram használata.

A segédprogrammal való munka két egyszerű lépésből áll:

  • telepítés
  • Húzza a végrehajtható fájlt (* .exe, * .bat, * .cmd) a segédprogram parancsikonjára:


  Automatikus fókusz egy futó programra

Az alkalmazások ütemezőből történő indításának sajátosságai az, hogy az ablakra összpontosítva nem fordítják le, és például egy parancs gépelésére a parancssorba rá kell kattintaniuk az ablakra is. Ez a viselkedés segíthet a rutinszerű ütemezett műveletek automatizálásában, de a "4. módszernél" ez nem mindig kényelmes.

Számos módszer létezik a „megkerülésre”. Kicsit másképp működnek, tehát válassza a legmegfelelőbbet. Az első kényelmesebb a programok futtatásához, a második pedig a szkriptek futtatásához.

Adja hozzá a feladat létrehozásakor:

A start parancs segítségével

Program vagy szkript:

érvek:

  / c start / d "program_path" fájlnév.exe

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

A NirCmd segédprogram használata

Program vagy szkript:

Path_k_nircmd \\ nircmd.exe

érvek:

Végezzen show "program_path \\ fájlnév.exe"

Végrehajtás a "C: \\ Windows \\ System32 \\ cmd.exe"

  Indítsa el a Futtatás párbeszédpanelt rendszergazdaként

A parancssor elindításához hasonlóan konfigurálhatja a " futás", és az abban megadott parancsokat a rendszergazda nevében is elindítják. Ennek a megközelítésnek az a kényelme, hogy a korábban használt parancsok listája elmentésre kerül, és a listából kiválaszthatja a kívánt parancsot.


Amikor feladatot hoz létre az ütemezőben, a " Akció létrehozása„Adja meg:

a mezőben " Program vagy szkript":

Rundll32

a mezőben " Adj hozzá érveket":

Shell32.dll, 61. szám

Töltse le a segédprogramot, és csomagolja ki. Indítunk a parancssort, írjuk be a kívánt parancsot, a szintaxis meglehetősen egyszerű:

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


Megjelenik egy UAC prompt, és az alkalmazás rendszergazdaként indul.

Megjegyzés:   Összefüggésben windows menü   A 7. ábra szerint a fájl elérési útjának másolásához egy nagyon kényelmes funkció van: hold műszak, kattintson a jobb gombbal a fájlra, válassza a " Másolás útként".


  A felhasználó által rendszergazdaként futtatott programok rendszergazdai jelszó megadása nélkül

Fontos!   Ez a módszer nem biztonságos, mert lehetővé teszi a korlátozott jogokkal rendelkező felhasználók számára, hogy teljes jogokkal futtassák a kódot. Egy ravasz felhasználó vagy rosszindulatú program kihasználhatja ezt és veszélyeztetheti a rendszert.

Fontoljuk meg még egy érdekes feladatot: a fiókját windows rekord   az adminisztrátorok csoportjába tartozik, egy vagy több számlákszerepel a felhasználói csoportban. A felhasználónak olyan programot kell futtatnia, amely megköveteli a jogosultságok megnövelését. Általában így néz ki: a felhasználó a jobb gombbal kattint a fájlra, és kiválasztja a "Futtatás rendszergazdaként" lehetőséget, és megjelenik egy kérés az adminisztrátori jelszó megadásáról:


Természetesen nem jó ötlet a rendszergazdai jelszó megadása a felhasználók számára. Ennek megkerülésére Alexei Kuryakin AdmiLink segédprogramját használjuk. Ezzel az adminisztrátor létrehozhat egy parancsikont a felhasználó számára a szükséges program elindításához, miközben az adminisztrátori jelszó megadása csak egyszer szükséges - a parancsikon létrehozásakor. Amikor a felhasználó elindítja a programot, a jelszó titkosított formában kerül továbbításra.



Ez a módszer akkor működik, ha a program indítása csak a rendszergazda nevében lehetséges, és a fejlesztő nem felejtette el jelezni ezt a feltételt a manifesztban. Ennek ellenére megmarad nagy szám   régi programok vagy olyan programok, amelyek elindíthatók, mint a normál üzemmódban, és a rendszergazda nevében (ebben az esetben más funkciókészlet lesz elérhető). Amikor megpróbál egy ilyen programot az AdmiLink segítségével futtatni, akkor normál módban indul (rendszergazdai jogosultságok nélkül). És ha megpróbál bejelölni a "3. számú módszer" pontot, akkor a szerző eredeti stílusa megmarad.

Mi van, ha futtatnia kell a programot, de nem akarja telepíteni? Nulla Telepítés a mentésre!

A világ minden táján milliárd ember használ számítógépet vagy laptopot a műtőben. windows rendszer. Általában programokat telepítünk, majd elvégezzük szabad hely   a lemezen és a használat véletlen hozzáférésű memória. Ez csökkenti a számítógép sebességét.

Ma elmondjuk Önnek, hogyan lehetne növelni a számítógép teljesítményét és csökkenteni a memóriaterhelést. Ehhez a szükséges programokat telepítés nélkül kell futtatnia.

Hogyan lehet futtatni a programot telepítés nélkül?

1. Töltse le a Zero Install szoftvert.

Először töltse le a Zero Install szoftvert, amely lehetővé teszi a programok futtatását anélkül, hogy telepítenie kellene azokat a számítógépre.

2. Telepítse a Zero Install szoftvert.

Miután letöltötte a Zero Install szoftvert, kattintson duplán a fájlra annak telepítéséhez. Akkor fuss új program   a számítógépén.

3. Kattintson a gombrakőműves "Katalógus".

Amint a Zero Install fut a számítógépen, vagy windows laptop, lépjen a „Katalógus” fülre. Kattintson a „Lista frissítése” gombra az elérhető programok listájának frissítéséhez.

4. Válassza ki a futtatni kívánt programot.

Vigyázzon alaposan teljes lista   elérhető programok. Ha megtalálja a szükséges programot, válassza ki és kattintson a „Futtatás” gombra. Egyes programok választhatnak firefox böngésző   vagy Mozilla futni. Csak várja meg a teljes letöltést. szoftver, majd telepítés nélkül futtathatja a számítógépen.


Összegezve

Ha számítógépe nem rendelkezik elegendő szabad memóriával vagy árammal a program futtatásához, használhatja a Zero Install alkalmazást. Úgy gondolom, hogy ez egy nagyszerű módja annak, hogy ne dobja el számítógépét egyszerre a szükséges programokkal.

Ezenkívül előfordulhat, hogy számítógépének nincs elegendő energiája bizonyos programok futtatásához, például az Eclipse IDE, JetBrains, NetBeans stb. Ez nagyon nehéz program a fejlesztők számára, akik nagy mennyiségű RAM-ot fogyasztanak.

A Zero Install segítségével elindíthatja ezeket és sok más programot anélkül, hogy számítógépre telepítené őket.

A legfontosabb dolgot nem írták le kellő részletességgel: hogyan lehet ezt a kódot valódi hardveren futtatni? Hogyan lehet létrehozni a saját indítólemez? Ebben a cikkben ezekre a kérdésekre részletesen válaszolunk (részben ezeket a kérdéseket tárgyalták az előző cikkben, de az olvasás kényelme érdekében megengedjük magának egy kicsit az anyag másolatát).

Az interneten nagyon sok leírás és oktatóprogram található, hogyan kell saját mini-operációs rendszert írni, még több száz kész kis hobbi-operációs rendszer is található. A témának az egyik legérdekesebb forrása, amelyet szeretnék kiemelni, az osdev.org portál. A PCI-ről szóló korábbi cikk kiegészítéseként (és annak képességét, hogy későbbi cikkeket írjunk a modern operációs rendszerekben található különféle funkciókról) leírjuk. lépésről lépésre   hogy elindítsunk egy indítólemezt a szokásos programmal a C-ben. Megpróbáltuk a lehető legrészletesebben írni, hogy önmagunknak kitaláljuk.

Tehát a cél: a lehető legkevesebb erőfeszítéssel költöztesse el saját indítható USB flash meghajtóját, amely csak a klasszikus „Hello World” -t nyomtatja ki a számítógép képernyőjére.

Pontosabban fogalmazva, védett üzemmódba kell lépnünk, letiltott oldalcímekkel és megszakításokkal - a legegyszerűbb processzor mód, az egyszerű konzolprogram szokásos viselkedésével. A cél elérésének ésszerűbb módja egy olyan kernel felépítése, amely támogatja a multiboot formátumot, és a népszerû használatával tölti be boot betöltő grub. Ennek a megoldásnak egy alternatívája a saját kötetindító rekord (VBR) megírása, amely betölti a saját írásbeli betöltőjét (betöltőjét). Legalább egy tisztességes rendszerbetöltőnek képesnek kell lennie a lemezzel, a fájlrendszerrel és az elf képek elemzésére. Ez azt jelenti, hogy sok összeszerelő kódot és sok C kódot kell írni. Röviden: könnyebb használni a Grubot, amely már tudja, hogy mindent megtegyen.

Először is egy bizonyos fordítókészletre és segédprogramra van szükség a további műveletekhez. A legegyszerűbb módszer valamilyen Linux (például Ubuntu) használata, mivel már tartalmaz mindent, amire szüksége lehet egy indítható flash meghajtó létrehozásához. Ha megszokta a Windows rendszert, konfigurálhat egy virtuális gépet Linux alatt (a Virtual Box vagy a VMware Workstation használatával).

Linux Ubuntu használata esetén először több segédprogramot kell telepítenie:
  1. Vágás. Ehhez használja a következő parancsot:

Sudo apt-get install grub

2. Qemu. Mindent gyorsan tesztelni és hibakeresni kell (Link a hibakeresőről szóló cikkhez), mert ehhez a parancs hasonló:

Sudo apt-get install qemu

Most a tervünk így néz ki:
  1. Készítsen egy C programot, amely egy sort nyomtat a képernyőn.
  2. fordítson le egy képet (kernel.bin) miniboot formátumban, hogy letölthető legyen a GRUB használatával.
  3. Hozzon létre egy indítólemez-képfájlt, és formázza meg.
  4. Telepítse a Grub-ot erre a képre.
  5. másolja a létrehozott programot (kernel.bin) a lemezre.
  6. írja be a képet fizikai média   vagy futtassa a qemu-ban.

és a rendszerindítási folyamat:

Ahhoz, hogy működjön, több fájlt és könyvtárat kell létrehoznia:

1. lépés: A célprogram (kernel) kódjának létrehozása:

Hozzon létre egy kernel.c fájlt, amely a következő kódot tartalmazza, és kinyomtatja az üzenetet a képernyőn:

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

Itt minden ismert és egyszerű. A printf és a clear_screen funkciók hozzáadásáról később lesz szó. Addig is ki kell egészítenie ezt a kódot, amire szükség van, hogy a Grub letölthesse azt.
  Annak érdekében, hogy a kernel multiboot formátumban legyen, a következő szerkezetre van szüksége a kernelkép első 8 kilobájtjában:

Ha ezek a feltételek teljesülnek, akkor a Grub átadja a% eax, a% ebx pedig egy mutatót regisztrál a multiboot információs struktúrához, illetve a 0x1BADB002 értéket. A multiboot információs struktúra tartalmazza különféle információk, beleértve a betöltött modulok listáját és azok helyét, amelyek szükségesek lehetnek a rendszer további betöltéséhez.
  Annak érdekében, hogy a programfájl tartalmazza a szükséges aláírásokat, hozzon létre a loader.s fájlt a következő tartalommal:

Szöveg .global loader # a belépési pont láthatóvá tétele a linker számára # a Multiboot fejléc beállítása - a részletekért lásd a GRUB dokumentumokat .set FLAGS, 0x0 # ez a Multiboot "flag" mező .set MAGIC, 0x1BADB002 # "mágikus szám" lehetővé teszi a bootloader számára fejléc .set CHECKSUM, - (MAGIC + FLAGS) # ellenőrző összeg szükséges .align 4 .long MAGIC .long FLAGS .long CHECKSUM # a kezdeti kernel-verem hely fenntartása .set STACKSIZE, 0x4000 #, azaz 16k. .lcomm stack, STACKSIZE # tartalék 16k verem .comm mbd, 4 # ezt a kmain .comm varázslatban fogjuk használni, 4 # ezt a kmain betöltõben fogjuk használni: movl $ (stack + STACKSIZE),% esp # állítsuk be a verem movl% eax, magic # Multiboot mágikus szám movl% ebx, mbd # Multiboot adatszerkezet hívás main # hívás C kód cli hang: hlt # leáll gépen kell a kernelnek visszatérnie jmp hang

Fontolja meg a kódot részletesebben. Ez a kód szinte változatlan a wiki.osdev.org/Bare_Bones webhelytől. Mivel a gcc-t használják az összeállításhoz, a GAS-szintaxist kell használni. Vessen egy pillantást erre a kódra.

Az összes későbbi kód a .text végrehajtható szakaszába esik.

Globális betöltő

A rakodó szimbólumát a linker számára láthatónak nyilvánítjuk. Erre szükség van, mivel a linker a betöltőt fogja használni belépési pontként.

Beállítása FLAGS, 0x0 # hozzárendelése FLAGS \u003d 0x0 .set MAGIC, 0x1BADB002 # hozzárendelése MAGIC \u003d 0x1BADB002 .set CHECKSUM, - (MAGIC + FLAGS) # hozzárendelése CHECKSUM \u003d - (MAGIC + FLAGS) .A 4 hozzáigazítása # a további adatok 4 byte-os összehangolása. hosszú MAGIC # hely jelenlegi érték MAGIC .long FLAGS # hely jelenlegi érték FLAGS hosszú CHECKSUM # hely jelenlegi érték CHECKSUM

Ez a kód a Multiboot formátum aláírását képezi. A .set irányelv a karakterértéket a vesszőtől jobbra lévő kifejezésre állítja. A .align 4 irányelv a későbbi tartalmat 4 byte-ra igazítja. A hosszú irányelv az értéket négy egymást követő bájtban tárolja.

Állítsa be a STACKSIZE, 0x4000 # hozzárendelését STACKSIZE \u003d 0x4000 .lcomm verem, STACKSIZE # tartalék STACKSIZE bájt. A stack a range.comm mbd-re vonatkozik, 4 # tartalék 4 bájt az mdb változóra a COMMON területen .comm magic, 4 # tartalék 4 bájt a mágikus változóra a COMMON területen

A rendszerindítási folyamat során a grub nem konfigurálja a veremét, és a kernelnek elsőként a verem konfigurálását kell elvégeznie, ehhez 0x4000 (16Kb) bájtot fenntartunk. A.lcomm irányelv a.bss szakaszban a tizedes pont után megadott bájt számot fenntartja. A névverem csak a lefordított fájlban lesz látható. A .comm irányelv ugyanaz, mint a .lcomm, de a szimbólum nevét globálisan deklarálják. Ez azt jelenti, hogy a következő sort a C-kódba írva felhasználhatjuk.
  külső int varázslat

És most az utolsó rész:

Betöltő: movl $ (verem + STACKSIZE),% esp # inicializálja a verem movl% eax, varázslat #% eax írása a varázscímhez movl% ebx, mbd #% ebx írása mbd híváshoz main # hívás fő CLI funkció # leválasztás megszakítás hardver hang: hlt # állítsa le a processzort, amíg megszakítás meg nem történik jmp hang # ugrás a felfüggesztés címkéjéhez

Az első utasítás menti a verem tetejét az% esp regiszterben. A verem növekedésével a veremhez hozzárendelt tartomány végének címét% esp-ben írják. A két következő utasítás a korábban fenntartott 4 bájt tartományban tárolja azokat az értékeket, amelyeket a Grub átad a% eax,% ebx regiszterekben. Ezután hívják a fő funkciót, amelyet már C-ben írtak. Ha visszatér ebből az eljárásból, a processzor hurokba kerül.

2. lépés: Kód készítése a programhoz (rendszerkönyvtár):

Mivel az egész program a semmiből van írva, a printf funkciót a semmiből kell írni. Ehhez készítsen több fájlt.
  Hozzon létre egy közös és mappát tartalmazó mappát:

Az Mkdir közös mkdir része

Hozzon létre egy commonprintf.c fájlt, amely tartalmazza az ismerős printf funkció megvalósítását. Ez a teljes fájl a www.bitvisor.org/ projektből származik. A fájl elérési útja a bitvisor forrásaiban: core / printf.c. A bitvisorból másolt printf.c fájlban, a célprogramban való felhasználáshoz meg kell cserélni a sorokat:

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

soronként:

   #include "tips.h" #include "stdarg.h" #include "screen.h"

Ezután távolítsa el a printf_init_global függvényt és az összes hivatkozást ebben a fájlban:

Statikus érvénytelen printf_init_global (érvénytelen) (spinlock_init (& printf_lock);) INITFUNC ("global0", printf_init_global);

Ezután törölje a printf_lock változót és az összes hivatkozást ebben a fájlban:

Statikus spinlock_t printf_lock; ... spinlock_lock (& \u200b\u200bprintf_lock); ... spinlock_unlock (& \u200b\u200bprintf_lock);

A printf függvény a putchar funkciót használja, amelyet szintén meg kell írni. Ehhez hozzon létre egy commonscreen.c fájlt a következő tartalommal:

   #include "tips.h" #define ZÖLD 0x2 #define MAX_COL 80 // Oszlopok maximális száma #define MAX_ROW 25 // A sorok maximális száma #define VRAM_SIZE (MAX_COL * MAX_ROW) // A képernyő mérete röviden "s # definiálja DEF_VRAM_BASE 0xb8000 // A videó memória alapértelmezett alapja statikus aláíratlan char curr_col \u003d 0; statikus aláíratlan char curr_row \u003d 0; // Karakter írása a képernyő aktuális helyén #define PUT (c) (((alá nem írt rövid *) (DEF_VRAM_BASE))) [ (curr_row * MAX_COL) + curr_col] \u003d (ZÖLD<< 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; "b" eset: ha (curr_col\u003e 0) (curr_col - \u003d 1; PUT ("");) break; alapértelmezett: 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; for (i) \u003d 0; i< VRAM_SIZE; i++) cons_putc(" "); curr_col = 0; curr_row = 0; }

A megadott kód egyszerű logikát tartalmaz a karakterek képernyőn történő nyomtatásához szöveges módban. Ebben az üzemmódban két bájtot használunk egy karakter írására (az egyik a karakterkóddal, a másik az attribútumokkal), amelyet közvetlenül a képernyőn megjelenő videó memóriába írunk, és a 0xB8000 címmel kezdődik. A képernyő felbontása 80x25 karakter. A karakter közvetlenül a PUT makró segítségével kerül kinyomtatásra.
  Most csak néhány fejlécfájl hiányzik:
  1. A fájl tartalmazza a screen.h fájlt. Egy putchar funkciót deklarál, amelyet a printf funkcióban használnak. Fájl tartalma:

   #ifndef _SCREEN_H #define _SCREEN_H void clear_screen (érvénytelen); semleges putchar (int c); #endif

2. A fájl tartalmazza az printprint.h fájlt. Deklarálja a főként használt printf funkciót. Fájl tartalma:

   #ifndef _PRINTF_H #define _PRINTF_H int printf (const char * formátum, ...); #endif

3. A fájl tartalmazza a /. Funkciókat deklarál azoknak az argumentumoknak az iterálására, amelyek száma előre nem ismert. A teljes fájl a www.bitvisor.org/ projektből származik. A fájl elérési útja a bitvisor projektkódjában: includecorestdarg.h.
  4. A fájl tartalmazza az typepes.h fájlt. NULL-ot és size_t-et deklarál. Fájl tartalma:

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

Így a beépített és a közös mappák tartalmazzák a minimális rendszerkönyvtár-kódot, amelyre minden programnak szüksége van.

3. lépés: A szkript létrehozása a linkerhez:

Készítjük a linker.ld fájlt, amelyet a linker felhasznál a célprogramfájl (kernel.bin) létrehozására. A fájlnak a következőket kell tartalmaznia:

BELÉPÉS (rakodógép) LMA \u003d 0x00100000; SZEKCIÓK (. \u003d LMA; .multiboot ALIGN (0x1000): (loader.o (.text)) .text ALIGN (0x1000): (* (. Szöveg)) .rodata ALIGN (0x1000): (* (. Rodata *) ) .data ALIGN (0x1000): (* (. adatok)) .bss: (* (KÖZÖS) * (. bss)) / DISCARD /: (* (. megjegyzés)))

A beépített ENTRY () funkció lehetővé teszi a kernel belépési pontjának beállítását. A grub ezen a címen adja át az irányítást a rendszermag indítása után. Ezzel a szkripttel a linker ELF formátumú bináris fájlt hoz létre. Az ELF fájl szegmensek és szakaszok halmazából áll. A szegmensek listáját a Program fejléc táblája tartalmazza, a szakaszok listája a Szekció fejléc táblája. A kapcsoló szekciókkal működik, a kép betöltő (esetünkben GRUB) szegmensekkel.


Mint az ábrán látható, a szegmensek szakaszokból állnak. A szekciót leíró mezők egyike a virtuális cím, amelyen a szakasznak a végrehajtás időpontjában kell lennie. Valójában egy szegmensnek 2 mezője van, amelyek leírják a helyét: a szegmens virtuális címe és a szegmens fizikai címe. A szegmens virtuális címe a szegmens első bájtjának virtuális címe a kód végrehajtásakor, a szegmens fizikai címe az a fizikai cím, amelyen a szegmenst be kell tölteni. Alkalmazások esetén ezek a címek mindig megegyeznek. A Grub a képszegmenseket tölti le a fizikai címükön. Mivel a Grub nem konfigurálja az oldalcímzést, a szegmens virtuális címének meg kell egyeznie a fizikai címével, mivel programunkban a virtuális memória szintén nincs konfigurálva.

LMA;

Ez a kifejezés azt jelzi a linker számára, hogy minden további szakasz az LMA cím után van.

ALIGN (0x1000)

A fenti irányelv azt jelenti, hogy a szakasz 0x1000 bájtra van igazítva.

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

Egy különálló rendszerindító szakasz, amely tartalmazza a loader.o fájl .text szakaszát, annak garantálása, hogy a multiboot formátum aláírása bekerül a kernelkép első 8 kb-jába.

Bss: (* (KÖZÖS) * (. Bss))

* (COMMON) az a terület, amelyen a .com és.lcomm utasítások fenntartják a memóriát. A .bss szekcióba helyezzük.

   / KIVÉTEL /: (* (. Megjegyzés))

A DISCARD jelöléssel ellátott összes részt eltávolítják a képről. Ebben az esetben töröljük a .comment szekciót, amely információkat tartalmaz a linker verziójáról.

Fordítsa le a kódot egy bináris fájlba a következő parancsokkal:

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

Az objdump használatával lássuk, hogyan néz ki a kernelkép a hivatkozás után:

Objdump -ph ./kernel.bin



Mint láthatja, a kép szakaszai egybeesnek azokkal, amelyeket a linker szkriptben írtunk le. A kapcsoló 3 szegmenst alkotott a leírt szakaszokból. Az első szegmens a szakaszokat.multiboot, .text, .rodata tartalmazza, és virtuális és fizikai címe 0x00100000. A második szegmens a .data és .bss szekciókat tartalmazza, és 0x00104000 ponton található. Tehát minden készen áll a fájl letöltésére a Grub használatával.

4. lépés: A Grub rendszerbetöltő előkészítése:
  Grub mappa létrehozása:

Mkdir grub

Másoljon ebbe a mappába több Grub fájlt, amelyek szükségesek a képre történő telepítéshez (a következő fájlok léteznek, ha a Grub telepítve van a rendszerben). Ehhez futtassa a következő parancsokat:

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 /

Hozzon létre egy grub / menu.lst fájlt a következő tartalommal:

Időtúllépés 3 alapértelmezett 0 cím mini_os root (hd0,0) kernel /kernel.bin

5. lépés: Automatizálja és készítse el a rendszerindító képet:

Az összeállítási folyamat automatizálásához a make segédprogramot fogjuk használni. Ehhez hozzon létre egy makefile-t, amelyet össze fog állítani forráskód, építsd fel a kernelt, és készíts egy indító képet. A makefilenek a következő tartalommal kell rendelkeznie:

CC \u003d gcc CFLAGS \u003d -Wall -fno-buildtin -nostdinc -nostdlib LD \u003d ld OBJFILES \u003d loader.o common / printf.o common / screen.o kernel.o image: @echo "Hdd.img létrehozása ..." @ dd, ha \u003d / dev / nulla \u003d. / hdd.img bs \u003d 512 count \u003d 16065 1\u003e / dev / null 2\u003e & 1 @echo "Indító első FAT32 partíció létrehozása ..." @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\u003e / dev / null 2\u003e és 1 || true @echo "Partíció beillesztése a / dev / loop2 ..." @losetup / dev / loop2 ./hdd.img - offset `echo` fdisk -lu / dev / loop1 | sed -n 10p | awk "($$ 3 nyomtatás)" `* 512 | bc` --sizelimit `echo` fdisk -lu / dev / loop1 | sed -n 10p | awk "($$ 4 nyomtatás)" `* 512 | bc` @losetup -d / dev / loop1 @echo "Partíció formázása ..." @mkdosfs / dev / loop2 @echo "Kernel és grub fájlok másolása a partíción ..." @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 "A GRUB telepítése. .. "@echo" eszköz (hd0) hdd.img n root (hd0,0) n setup (hd0) n quitn "| grub - 1. tétel\u003e / dev / null @echo "Kész!" all: kernel.bin újjáépítés: minden .s.o: as -o $ @ $ törlés< .c.o: $(CC) -Iinclude $(CFLAGS) -o $@ -c $< kernel.bin: $(OBJFILES) $(LD) -T linker.ld -o $@ $^ clean: rm -f $(OBJFILES) hdd.img kernel.bin

Két fő célt jelentenek a fájlban: mindegyik - összeállítja a kernelt, és a kép - ami létrehozza a rendszerindító lemezt. Az összes cél, a szokásos makefile-hez hasonlóan, tartalmaz subgoals.s.o és.c.o fájlokat, amelyek * .s és * .c fájlokat állítanak elő objektumfájlokba (* .o), valamint egy célt a kernel.bin létrehozására, amely a linkert felhívja a korábban létrehozott szkripttel. Ezek a célok pontosan ugyanazokat a parancsokat hajtják végre, mint a 3. lépésben.
  A legnagyobb érdeklődés itt a rendszerindító kép   hdd.img (célkép). Nézzük szakaszosan, hogyan történik ez.

Dd, ha \u003d / dev / nulla \u003d. / Hdd.img bs \u003d 512 szám \u003d 16065 1\u003e / dev / null 2\u003e & 1

Ez a parancs képet hoz létre, amellyel további munkára kerül sor. Az ágazatok számát nem véletlenszerűen választották ki: 16065 \u003d 255 * 63. Alapértelmezés szerint az fdsik úgy működik a lemezzel, mintha CHS-geometriája lenne, amelyben a fejlécek (H) \u003d 255, az ágazatok (S) \u003d 63 és a hengerek © a lemez méretétől függ. . Így az a minimális lemezméret, amellyel az fdsik segédprogram képes működni az alapértelmezett geometria megváltoztatása nélkül, 512 * 255 * 63 * 1 \u003d 8225280 bájt, ahol 512 az ágazat mérete és 1 a hengerek száma.
  Ezután létrejön egy partíciós tábla:

Losetup / dev / loop1 ./hdd.img (visszhang; visszhang; visszhang; visszhang; 1 visszhang: 1 visszhang; visszhang; visszhang; visszhang: 1 visszhang: visszhang:; visszhang: visszhang;) | fdisk / dev / loop1 1\u003e / dev / null 2\u003e és 1 || igaz

Az első parancs a hdd.img fájlt csatolja a / dev / loop1 blokk eszközbe, lehetővé téve, hogy eszközként dolgozzon a fájlkal. A második parancs létrehozza a partíciós táblát a / dev / loop1 eszközön, amelyben 1 elsődleges van rendszerindító partíció   egy lemez, amely a teljes lemezt a FAT32 fájlrendszer-címkével tartalmazza.
  Ezután formázjuk a létrehozott részt. Ehhez szerelje fel blokkoló eszközként és hajtsa végre a formázást.

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

Az első parancs a korábban létrehozott partíciót illeti a / dev / loop2 eszközre. Az – offset opció megadja a szakasz elejének címét, és –segíti a szakasz végének címét. Mindkét paramétert az fdisk paranccsal lehet elérni.

Mkdosfs / dev / loop2

Az mkdosfs segédprogram formázza a partíciót fájlrendszer   FAT32.
  A kernel közvetlen összeállításához a korábban tárgyalt parancsokat használjuk a klasszikus makefile szintaxisban.
  Most fontolja meg a GRUB telepítését egy partíción:

Az Mkdir -p tempdir # létrehoz egy ideiglenes mount / dev / loop2 könyvtárat tempdir # csatolja a partíciót az mkdir könyvtárban a tempdir / boot # létrehozza a / boot könyvtárat a cp -r szakasz grub tempdir / boot / # másolja a grub mappát a / boot cp kernel.bin tempdir könyvtárba. / # másolja a kernelt az alváspartíció gyökérzetébe 1 # várjon az Ubuntu umount / dev / loop2 elemre # szedje le az ideiglenes mappát rm -r tempdir # törölje az ideiglenes mappát kaotatup -d / dev / loop2 # szüntesse meg a partíciót

A fenti parancsok végrehajtása után a kép készen áll a GRUB'a telepítésére. A következő parancs telepíti a GRUB-ot a hdd.img lemezkép MBR-jébe.

Visszhang "eszköz (hd0) hdd.img n root (hd0,0) n setup (hd0) n quitn" | grub - 1. tétel\u003e / dev / null

Minden készen áll a tesztelésre!

6. lépés: Indítás:

A fordításhoz használja a következő parancsot:

Készíts mindent

Ezután a kernel.bin fájlnak meg kell jelennie.
  A rendszerindító lemezkép létrehozásához használja a következő parancsot:

Sudo képet

Ennek eredményeként meg kell jelennie a hdd.img fájlnak.
  Most már indíthat a hdd.img lemezképből. Ezt a következő paranccsal ellenőrizheti:

Qemu-hda hdd.img -m 32

Qemu-system-i386 -hda hdd.img




Valódi gépen való ellenőrzéshez el kell készítenie a kép dd-jét egy flash meghajtóra, és indulnia kell belőle. Például ezzel a paranccsal:

Sudo dd, ha \u003d. / Hdd.img / \u003d / dev / sdb

Összefoglalva elmondhatjuk, hogy a megtett intézkedések eredményeként forrásokat és szkripteket kapunk, amelyek lehetővé teszik, hogy különféle kísérleteket végezzünk a rendszerprogramozás területén. Az első lépés megtörtént a rendszerszoftverek, például a hipervizorok és az operációs rendszerek létrehozása felé.