Przychodzi czas w życiu każdego niski - równego hakera kiedy oni decydują, że oni także, chcą utworzyć ich własny system obsługiwania. Co lepsza droga, by naprawdę odkryć zdolności twojej maszyny niż zaprogramować jego operację z początku? To są komputery drogi został znaczony, by zostać zaprogramowany: w ich poziomie. Typowe systemy obsługiwania tylko używają małego procentu naszych zdolności komputerów. Najwięcej jest przeznaczony dla dużych, głupich programów. Prawdziwa rozmaitość wykonalnych stanów naprawdę zadziwia. Przez zagłębianie do tego cudownego świata rzeczywistości CPU, otwierasz drzwi do twojej własnej zapierający tchu obliczeniowej kreatywności. To jest, gdzie paradygmaty są przesunięte, metodologie wymyśliły i architektury wykroczyły. Lata temu hakerzy napisali wszystko konieczne systemowe oprogramowanie dla ich " podań". Oni napisali jakiekolwiek jądro albo OS był konieczny. Faktycznie , oddzielenie między jądrem i podanie były często bez znaczenia albo nawet nieistniejące. To był prawdziwy hackery -- czyste doświadczenie systemu. Obecnie, dużo CPUs ma stał się tak złożony, że OS często jest zobaczony jako warunek wstępny do najwięcej programowania. Często będziesz widział jądra zwyczaju tylko na mały 8 - kawałka i 16 - gryzą procesory. Kiedy PICs, H8s i podobne jest zachwycającymi celami programowania, projektowanie CPU rozwinęło się dramatycznie. Do programowania do nowoczesnego procesora takie jak Pentium 4 albo G5, twój umysł doświadczy ectasy złożoności i możliwości. Jest więcej niż estetycznymi powodami dla programowania blisko metalu. Rozebrany śmieci, który był ciężarem " nowoczesnych" działających systemów, wolnych, by wyrazić dzikie programowanie, CPU staje się UberMaschine, którym to zostało znaczone, by być. Po prostu położyć, możesz ucieszyć się setkami występu czasów lepiej niż czego do jesteś przyzwyczajony i robisz rzeczy, które były po prostu niemożliwe pod sludgery Linuks, Windows, al et. Wita w prawdziwej informatyce! Weźmiemy spojrzenie w jak wnieść ciebie i biegnąc dalej nowoczesny x86 system od inicjalizowalnego CDROM. Wybieram to, ponieważ jest kilka podręczników na obuwaniu od dyskietek i dysków stałych, ale CDROMs wydaje się dziwnie zaniedbany. Zdaniem , obuwanie od CDROM jest jednym z najbardziej logicznych strategii dla tego typu rozwoju. Możesz łatwo przeprowadzić twój system na rozmaitości komputerów bez zmieniania instalacji na ich dysku stałym. Masz dostęp do więcej niż 600 MB danych zamiast marnego 1.44 MB / 2.88 MB na dyskietce. Mógłbyś mieć tony danych na temat CDROM i programu, który mógłby policzyć przez to rozjaśniające szybko. Są trzy drogi, by obuć od CDROM: żadna symulacja obuwająca, symulacja dyskietki i symulacja dysku stałego. Jesteśmy patrzeć na dwóch z ich, żadna symulacja i symulacja dyskietki. Nasze techniki będą wymagały, że BIOS popiera Torito Kolejki nadziemnej Inicjalizowalną specyfikację CDROM. Przykład użyje pożytku mkisofs, który jest częścią paczki cdrecord dla Windows, Linuks i innych systemów obsługiwania. Kod w x86 zgromadzeniu będzie przygotować się na NASM ( Asembler Netwide), który jest też uchwytny dla wielu platform. Raz system jest obuty i jesteś w 32 - gryzą tryb chroniony, możesz skoczyć bezpośrednio do zestawionego kodu C. Stąd masz dostęp bezpośredni do wszystkiej linearnej pamięci i możesz utworzyć twoje jądro albo podanie. Spójrzmy na obuwanie poza CDROM z symulacja dyskietki. Potrzebujemy obraz dyskietki, którego pierwszy 512 sektor bajtu zawiera bootloader. Bootloader zwykle załadowuje resztę kodu buta i skacze do tego. Nasz przykład jest mały wystarczająco, by pasować cały 512 bajtów. Zestawiamy naszego bootloader jak to: nasm boot.s -o start.img
To turn it into a 1.44MB floppy, we can use a little spot of Python code: startimg = open('start.img').read() open('floppy.img', 'w').write(startimg + (1474560 - len(startimg)))
Now we can place the floppy.img in the directory that will serve as the root of the ISO 9660 filesystem to be placed on the CDROM. Now, assuming that directory was named 'cdimage', we can simply do this: mkisofs -b floppy.img -o cd.iso cdimage
So, 'cdimage/floppy.img' is specified as the floppy image to boot with, 'cdimage' is the directory filled with whatever data we want in the output and 'cd.iso' is the final product, ready to be burned on to a CDROM. As for the assembly code in boot.s, this should start us off: [ORG 0x7c00] ; this code assumes that it starts at linear 0x7c00 [BITS 16] ; we start in real mode which is 16-bit jmp start ; ensure cs (code segment) is set start: xor bx, bx ; clear bx mov ds, bx ; zero out DS (data segment) mov es, bx ; zero out ES (extra segment) mov ss, bx ; zero out SS (stack segment) mov sp, 0x7bfe ; set stack pointer to right below boot code
mov ah, 0x2 ; read sector(s) into memory mov al, 0x1 ; number of sectors to read mov ch, 0x0 ; 0..7b of cylinder number mov cl, 0x1 ; 0..5b sector number, 6..7b high bits of cyl. num mov dh, 0x0 ; head number mov dl, 0x0 ; driver number mov bx, 0x7000 ; offset to ES -- linear 0x7000 int 0x13 ; call BIOS disk interrupt
.infinity: jmp .infinity ; wait for Godot
This will load first sector, sector 1, into 0x7000 linear memory and then wait for you. If you want to know it got that far, you can tie this in right before the infinite loop: mov al, '*' mov ah, 0x0e mov bh, 0x0 mov bl, 0x7 int 0x10 To narysuje trochę '*' na ekranie. Jakkolwiek, możesz więcej twój dysk rozruchowy z tym i wtedy skaczesz do tego. Ale, symulacja dyskietki jest zamierzona głównie, by poprzeć obsługiwanie systemów, które mają ich własnych kierowców CDROM. Jeżeli chcesz skoczyć, że i użyj BIOS, by dostać jakiegoś i wszystko zawartości twojego CDROM, będziesz chciał nie użyć żadnej symulacji obuwającej. Musisz zmodyfikować twoją rozmowę mkisofs jak to (to jest już nie konieczne, by wyścielić obraz do 1.44 MB): mkisofs - nie nie - emul - but - but but - ładunek ładunek - sekunda 0x7c0 - but but - ładunek ładunek - oceniają 4 \ - początek b.img - cd zera.iso cdimage - but - ładunek- wielkość' opcja daje liczbę 512 - bajtu sektorów, by załadować od obrazu buta. To powinno być wielokrotnością 4. Nasze przykłady tutaj są małe, więc 2048 bajtów jest piękne. Musisz teraz dostać liczbę jazdy CDROM, by uzyskać dostęp do to i używasz' terminate symulacja Dysku' zadziałać, by zrobić, że -- chyba, że każesz temu nie skończyć symulację. Ta funkcja wypełni pakiet specyfikacji. To jest smaczny 18 pakietu bajtu, ale rzecz naprawdę potrzebujesz wiedzieć od tego jest numerem jazdy, który jest trzecim bajtem. W ten sposób: mov ah, 0x4b ; terminate disk emulation mov al, 0x1 ; return status only -- don't terminate emulation mov dl, 0x80 ; drive number to terminate mov si, specification_packet ; empty specification packet int 0x13
; .... specification_packet: times 0x12 db 0x0 Teraz przeczytać dane od CDROM tobie używają powiększonej funkcji czytania z niedawno nabytym numerem dysku. Też mógłbyś chcieć widzieć co LBA (Logiczny Adres Bloku) dla obrazu obuwał był. To jest w bajtach 4..7 z pakietu specyfikacji. Oczywiście, nie potrzebujesz przeładować twojego ładowacza buta, ale w moim przypadku to było w LBA 0x196 więc tylko załadowałem, że do linearnego 0x7000. Zastąp niesztywne czytanie kodować twojego napisał wcześniej z tym: mov ah, 0x42 ; extended read mov dl, [specification_packet + 2] ; drive number mov si, disk_address_packet int 0x13 ; .... disk_address_packet: db 0x10 ; packet size db 0x0 ; reserved, must be 0 dw 0x1 ; number of blocks to read dw 0x0 ; offset of buffer address dw 0x700 ; segment of buffer address dd 0x196 ; absolute block number Teraz możesz uzyskać dostęp do cały dysk. Aby skoczyć od tryb rzeczywisty trybowi chronionemu ciebie tworzą Globalny Stół Deskryptora (GDT) i ustawiony GDTR ( Rejestr GDT) do opisu tego, ustawić kawałek PE regulującego rejestru, skoku zresetować CS i jesteś dobry, by pójść. Deskryptory segmentu w GDT całkiem interesują. Możesz mieć, aż 8192 segmentów w GDT opisującym segmenty dla danych, kodu, Miejscowe Stoły Deskryptora (LDT), bramy rozmowy, bramy pułapki, przerywają bramy, etc. Tutaj, tylko zrobimy to więc masz płaski 4GB modelu pamięci dla kodu i dostępu danych (i.e., który możesz uzyskać dostęp do cokolwiek jako linearna pamięć). GDT jest złożony z segmentu deskryptorów, każdych 8 bajtów długo. Pierwszy jest pusty. Format deskryptora segmentu jest złożony i poleciłbym kontrolowanie przewodnika producenta systemu obsługiwania przez Intel, ale tutaj tylko ustawiamy segment kodu i jeden segment danych. Oni są obie w pierścionek 0 poziomie ochrony, znacząc nieograniczony dostęp. Ich baza ( punkt początkowy) ma 0 lat i ich ograniczenie ma 0xfffff lat * 4KB (e.g. 4GB). Segment danych jest czytelny i writable i segment kodu dostosowuje się, który zasadniczo środki nie potrzebujesz wejść tego od przerwać. Wszystko to i więcej są kodowane do ich małych struktur. Tutaj jest jak to okazuje się: GDTR: ; here is what we put in the GDT Register dw GDT_end - GDT - 1 ; 0x17 as the size dd GDT ; the location
GDT: dd 0x0, 0x0 ; null descriptor dd 00000000000000001111111111111111b ; data segment descriptor dd 00000000110011111001001000000000b dd 00000000000000001111111111111111b ; code segment descriptor dd 00000000110011111001110000000000b GDT_end:
So, we just load that into the GDTR after blocking interrupts and then switch to protected mode:
cli ; turn off interrupts lgdt [GDTR] ; load our GDT into GDTR mov eax, cr0 ; get control register 0 or al, 1 ; set PE bit mov cr0, eax ; set control register 0
Protected mode will not be turned on into till we clear the fetch-ahead buffer by jumping or a similar operation. In protected mode, segment registers actually point to a location in the GDT and then have the offset relative to that. So, the code segment is the third segment descriptor and is 16 bytes in, thus: jmp 0x10:start_pm [BITS 32] ; we are in 32-bit mode start_pm: xor edi, edi xor esi, esi mov ax, 0x8 ; load data segment descriptor offset mov ds, ax mov es, ax mov fs, ax mov gs, ax mov ss, ax I, w ten sposób jesteś w kodzie. Teraz, skoczyłbyś do absolutnego miejsca zawierającego twoje jądro. Kopiowanie zawartości CDROM do wyższej pamięci może być złożone. Możesz też skoczyć z powrotem i naprzód od trybu chronionego do tryb rzeczywisty, albo użyć nierealnego trybu dla transferów. To jest konieczne, ponieważ rozmowy BIOS nie będą pracowały w trybie chronionym. To jest nie trudny, by zrobić w tym momencie, jednak. Oprócz robienia tego, też prawdopodobnie chciałbyś ustawić jakiegoś przerywają segmenty i być może witka do trybu VGA przez BIOS przed zatrzymywaniem w domu tryb chroniony. Zostawię te rzeczy, aż do ciebie. Mógłbyś chcieć zrobić wszystko to w miłym imitatorze jak Bochs albo VMware. Zauważ, że Bochs będzie radził twoją niesztywną grzywnę kodu buta, ale to brakuje koniecznego dla żadnej symulacji obuwającej. Też, VMware widocznie ma pluskwę taką, że to nie pozwoliłoby mi przeczytać CD w żadnej symulacji obuwającej witkę _and_ do tryb chroniony. Inne przerwania wydawały się uneffected. Kiedy wypaliłem kod do CDROM i przetestowałem to, chociaż, to doprowadziło grzywnę. YMMV. Baw się programowanie do maszyny! :) 1
|