07.01.2013 Views

Linux i386 Önyükleme Kodu NASIL

Linux i386 Önyükleme Kodu NASIL

Linux i386 Önyükleme Kodu NASIL

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

<strong>Linux</strong> <strong>i386</strong> <strong>Önyükleme</strong> <strong>Kodu</strong> <strong>NASIL</strong><br />

BSP için çekirdek parametreleri ESI tarafından gösterilen bellekten empty_zero_page’e kopyalanır. E˘ger<br />

uygulanabilir ise çekirdek komut satırı empty_zero_page+2K’ya kopyalanacaktır.<br />

6.3. ˙I¸slemci Türünü Kontrol Et<br />

˙I¸slemci türünün ve i¸slemci içeri˘ginin nasıl belirlendi˘gi konusunda bakınız: IA–32 Manual Vol.1. (Ch.13. Processor<br />

Identification and Feature Determination).<br />

struct cpuinfo_x86; // bakınız: include/asm–<strong>i386</strong>/processor.h<br />

struct cpuinfo_x86 boot_cpu_data; // bakınız: arch/<strong>i386</strong>/kernel/setup.c<br />

#define CPU_PARAMS SYMBOL_NAME(boot_cpu_data)<br />

#define X86 CPU_PARAMS+0<br />

#define X86_VENDOR CPU_PARAMS+1<br />

#define X86_MODEL CPU_PARAMS+2<br />

#define X86_MASK CPU_PARAMS+3<br />

#define X86_HARD_MATH CPU_PARAMS+6<br />

#define X86_CPUID CPU_PARAMS+8<br />

#define X86_CAPABILITY CPU_PARAMS+12<br />

#define X86_VENDOR_ID CPU_PARAMS+28<br />

checkCPUtype:<br />

{<br />

X86_CPUID = –1; // CPUID yok<br />

X86 = 3; // en azından 386<br />

save original EFLAGS to ECX;<br />

flip AC bit (0x40000) in EFLAGS;<br />

if (AC bit not changed) goto is386;<br />

X86 = 4; // en azından 486<br />

flip ID bit (0X200000) in EFLAGS;<br />

restore original EFLAGS; // AC ve ID seçenekleri için<br />

if (ID bit de˘gi¸semez) goto is486;<br />

// i¸slemci bilgilerini al<br />

CPUID(EAX=0);<br />

X86_CPUID = EAX;<br />

X86_VENDOR_ID = {EBX, EDX, ECX};<br />

if (!EAX) goto is486;<br />

CPUID(EAX=1);<br />

CL = AL;<br />

X86 = AH & 0x0f; // aile<br />

X86_MODEL = (AL & 0xf0) >> 4; // model<br />

X86_MASK = CL & 0x0f; // adımlama kimli˘gi (stepping id)<br />

X86_CAPABILITY = EDX; // özellik<br />

x87 aritmetik i¸slemcisinin ayarlanı¸sı için bakınız: IA–32 Manual Vol.3. (Ch.9.2. x87 FPU Initialization, and<br />

Ch.18.14. x87 FPU).<br />

is486:<br />

// PG, PE, ET’yi kaydet AM, WP, NE, MP’yi ise ayarla<br />

EAX = (CR0 & 0x80000011) | 0x50022;<br />

goto 2f; // "is386:" i¸slemeyi atla<br />

is386:<br />

orjinal EFLAGS’ları ECX’den yeniden al;<br />

http://belgeler.org <strong>Linux</strong> Kitaplı˘gı 42 / 77

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!