Search

'CLKH64 OS/10장'에 해당되는 글 3건

  1. 2013.01.12 SwitchMode.o: Inline Assembly 버전 및 파이썬 스크립트 수정

SwitchMode.o: Inline Assembly 버전 및 파이썬 스크립트 수정

CLKH64 OS/10장 2013. 1. 12. 10:35 Posted by 알 수 없는 사용자
// SwitchMode.h
#ifndef __MODE_SWITCH__
#define __MODE_SWITCH__

#include "Types.h"

void kCpuid(DWORD* eax, DWORD* ebx, DWORD* ecx, DWORD* edx);
void kSwitchModeTo64(void);

extern void kPrintString(int nX, int nY, const char* pString);
extern int gScreenY;

#endif


// SwitchMode.c

#include "ModeSwitch.h"


void kCpuid(DWORD* eax, DWORD* ebx, DWORD* ecx, DWORD* edx)
{
	__asm__ __volatile__ ("cpuid"
			:"=a"(*eax), "=b"(*ebx), "=c"(*ecx), "=d"(*edx)
			:"a"(*eax) );
}


void setCR4(void)
{
	int eax;
	eax = 0x20;

	__asm__ __volatile( "or $0x20, %%eax\n"
		"mov %%eax, %%cr4"
		:
		:"a"(eax));
}

void setCR3(DWORD eax)
{
	__asm__ __volatile("mov %%eax, %%cr3"
		:
		:"a"(eax));
}

void setIA32_EFER(void)
{
	DWORD ecx;
	ecx = 0xC0000080;

	__asm__ __volatile( "rdmsr\n"
			"or $0x0100, %%eax\n"
			"wrmsr"
			:
			:"c"(ecx));
}

void setCR0(void)
{
	BYTE cs;
	cs = 0x08;
	char* string = "GCC Inline Assembly Operation................[PASS]";

	__asm__ __volatile( "mov %%cr0, %%eax\n"
			"or $0xE0000000, %%eax\n"
			"xor $0x60000000, %%eax\n"
			"mov %%eax, %%cr0\n"
			"mov $0x20000, %%eax\n"
			//
			"push %%esi\n"
			"push %%edx\n"
			"push %%ecx\n"
			"call *%%edi\n"
			//
			"ljmp $0x08, $0x200000\n"
			:
			:"c"(0x00), "d"(gScreenY++), "S"(string), "D"(kPrintString) );
}



void kSwitchModeTo64(void)
{
	setCR4();
	setCR3(0x100000);
	setIA32_EFER();
	setCR0();
}


# ImageMaker.py

import sys
import struct


def createDiskImage():
    fDiskImage = open('Disk.img', "wb+")
    return fDiskImage

def readBootLoader(fDiskImage):
    fBootLoader = open('00.BootLoader/BootLoader.bin', 'rb')
    
    # get size of bootloader
    fBootLoader.seek(0, 2)
    sizeOfBootLoader = fBootLoader.tell()
    
    # reset file descriptor
    fBootLoader.seek(0)
    
    fDiskImage.write(fBootLoader.read())
#    padding = struct.pack('b', 0) * (sizeOfBootLoader % 512)
    if ( sizeOfBootLoader % 512 ) != 0 :
        padding = (b'\x00') * (sizeOfBootLoader % 512)
        fDiskImage.write(padding)
    
    fBootLoader.close()
    
    
def readKernel(fDiskImage, Path):
    fKernel = open(Path, 'rb')
    
    fKernel.seek(0, 2)
    sizeOfKernel = fKernel.tell()
    fKernel.seek(0)
    
    fDiskImage.write(fKernel.read())
    if ( sizeOfKernel % 512 ) != 0 :
        for i in range(512 - (sizeOfKernel % 512)):
            fDiskImage.write(b'\x00')
        sizeOfKernel += (512 - (sizeOfKernel % 512))
        
    fKernel.close()
    
    return (sizeOfKernel // 512)

if __name__ == "__main__":
    fDiskImage = createDiskImage()
    readBootLoader(fDiskImage)
    k32sectorNumber = readKernel(fDiskImage, '01.Kernel32/Kernel32.bin')
    k64sectorNumber = readKernel(fDiskImage, '02.Kernel64/Kernel64.bin')
    
    print ("Sector Number :", k32sectorNumber)
    print ("Sector Number :", k64sectorNumber)
    
    fDiskImage.seek(5);
    fDiskImage.write(struct.pack('b', k32sectorNumber +  k64sectorNumber))
    fDiskImage.seek(7);
    fDiskImage.write(struct.pack('b', k32sectorNumber)) 
    
    fDiskImage.close()

'CLKH64 OS > 10장' 카테고리의 다른 글

GCC AT&T Syntax  (0) 2013.01.12
10장 CPUID, GCC Inline Assembly 이용해서 작성하기  (0) 2013.01.11