CSD İŞLETİM SİSTEMİNDE SİSTEM FONKSİYONLARININ ÇAĞIRILMASI

Benzer belgeler
Linux Assembly Programlamaya Giriş

Bahar Dönemi. Öğr.Gör. Vedat MARTTİN

MTM 305 MİKROİŞLEMCİLER

Bölüm 3: Adresleme Modları. Chapter 3: Addressing Modes

Yrd. Doç. Dr. Caner ÖZCAN

İŞLETİM SİSTEMİ KATMANLARI (Çekirdek, Kabuk ve diğer temel kavramlar) Öğr.Gör. Dr. Dr. Şirin KARADENİZ

PROGRAMLAMAYA GİRİŞ FONKSİYONLAR

BLM 112- Programlama Dilleri II. Hafta 5 İşaretçiler (Pointers)

İSTANBUL TİCARET ÜNİVERSİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ MİKROİŞLEMCİLİ SİSTEM LABORATUVARI KESMELİ GİRİŞ/ÇIKIŞ

Yrd. Doç. Dr. Caner ÖZCAN

Ders 3 ADRESLEME MODLARI ve TEMEL KOMUTLAR

8086 Mikroişlemcisi Komut Seti

ELN1001 BİLGİSAYAR PROGRAMLAMA I

BBM 341 Sistem Programlama

C İLE BUFFER OVERFLOW-2

Program Kontrol Komutları. Mikroişlemciler ve Mikrobilgisayarlar 1

API(Application Programming Interface) Fonksiyonları:

Sistem Programlama. Kesmeler(Interrupts): Kesme mikro işlemcinin üzerinde çalıştığı koda ara vererek başka bir kodu çalıştırması işlemidir.

ROP için kısacası şunları diyebiliriz;

Hafta 13 Fonksiyonlar

BLM-112 PROGRAMLAMA DİLLERİ II. Ders-3 İşaretçiler (Pointer) (Kısım-2)

BLM-111 PROGRAMLAMA DİLLERİ I. Ders-12 Fonksiyonlar. Yrd. Doç. Dr. Ümit ATİLA

Göstericiler (Pointers)

İŞLETİM SİSTEMİ KATMANLARI (Çekirdek, kabuk ve diğer temel kavramlar) Bir işletim sisteminin yazılım tasarımında ele alınması gereken iki önemli konu

BİL 220 Sistem Programlamaya Giriş

Ana Bellek (RAM) İşlemci (CPU) Depolama

NB Macro Kullanımı Hakkında Genel Bilgiler

Adresleme Modları. Mikroişlemciler ve Mikrobilgisayarlar

1 NEDEN SEMBOLİK MAKİNA DİLİ ÖĞRENİLMELİDİR? MİKROİŞLEMCİLERİN ÇALIŞMA BİÇİMLERİ TİPİK BİR RAM İN YAPISI

80X86 SEMBOLİK MAKİNA DİLİ

Temel Bilgisayar Bilimleri Ders Notu #4-2. kısım

İşletim Sistemlerine Giriş

VERİ YAPILARI VE PROGRAMLAMA (BTP104)

HEAP SİSTEMİ. Oğuz Karan

Bölüm 9. Altprogramlar ISBN

int faktoriyel(int sayi) { int sonuc = 1; for(int i=sayi;i>0;i--) sonuc*=i; return sonuc; } int main() { int sayi = faktoriyel(5); }

sayi=3 harf=a reelsayi=8.72 Bellek durumu 5. İşaretç iler (pointers)

BM-311 Bilgisayar Mimarisi

Bilgisayar Programlama. 1.Hafta

MTM 305 MĠKROĠġLEMCĠLER

Özyineleme (Recursion)

MTM 305 MĠKROĠġLEMCĠLER

MTM 305 MİKROİŞLEMCİLER

BLM 112- Programlama Dilleri II. Hafta 1 Giriş, Kapsama Kuralları ve Rasgele Sayı Üretimi

BM-311 Bilgisayar Mimarisi

MATLAB İLE PROGRAMLAMAYA GİRİŞ. Nedim TUTKUN Elektrik Elektronik Mühendisliği Bölümü

PIC ASSEMBLY VE MAKROLAR

ALGORİTMA VE PROGRAMLAMA II

BLM 112- Programlama Dilleri II. Hafta 2 C Programlarının Bellek Düzeni ve Rekürsif (Özyinelemeli) Fonksiyonlar

BLM-112 PROGRAMLAMA DİLLERİ II. Ders-8 Dosya İşlemleri-1. Yrd. Doç. Dr. Ümit ATİLA

Final Sınavı Soruları Güz, Süre: 90 Dakika

10/17/2007 Nesneye Yonelik Programlama 3.1

PROGRAMLAMAYA GİRİŞ. Öğr. Gör. Ayhan KOÇ. Kaynak: Algoritma Geliştirme ve Programlamaya Giriş, Dr. Fahri VATANSEVER, Seçkin Yay.

Bil101 Bilgisayar Yazılımı I. M. Erdem ÇORAPÇIOĞLU Bilgisayar Yüksek Mühendisi

Bilgi ve İletişim Teknolojileri (JFM 102) Ders 7. LINUX OS (Sistem Yapısı) BİLGİ & İLETİŞİM TEKNOLOJİLERİ. LINUX Yapısı

İSTANBUL TİCARET ÜNİVERSİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ MİKROİŞLEMCİLİ SİSTEM LABORATUARI İKİLİ TABANDA ÇOK BAYTLI ÇARPMA

Pointer Kavramı. Veri Yapıları

BIL 362 Mikroilemciler Dersi Final Sınavı Cevapları

Windows'da çalışırken pek çok durumda bir işe başlamadan önce işletim sisteminin o işe ilişkin bilgileri depolayacağı bir alan yaratması gerekir.

Dr. Fatih AY Tel: fatihay@fatihay.net

Yrd. Doç. Dr. Caner ÖZCAN

Fonksiyonlar (Altprogram)

Metasploit Framework ile Exploit Geliştirme. Fatih Özavcı Canberk Bolat

DERS 4 MİKROİŞLEMCİ PROGRAMLAMA İÇERİK

Bölüm 10. Altprogramların gerçeklenmesi ISBN

HSancak Nesne Tabanlı Programlama I Ders Notları

Ders Özeti. Ders 2. PC nin İç Organizasyonu. Mikroişlemcinin Organizasyonu. Basitçe İşlemciyi Oluşturan Parçalar. Mikroişlemciler

Struct VE GÖSTERİCİLER FONKSİYONLARDA STRUCT KULLANIMI Programlama dilleri hafta -

AND Komutu. and hedef, kaynak

8. İŞARETCİLER (POINTERS)

Bölüm 5: ARITMETIK VE MANTIK IŞLEM YAPAN KOMUTLAR

Bilgi ve İletişim Teknolojileri (JFM 102) Ders 10. LINUX OS (Programlama) BİLGİ & İLETİŞİM TEKNOLOJİLERİ GENEL BAKIŞ

MTM 305 MĠKROĠġLEMCĠLER

6. HAFTA KBT204 İNTERNET PROGRAMCILIĞI II. Öğr.Gör. Hakan YILMAZ.

Bölüm 10. Altprogramları Uygulamak

ELN1002 BİLGİSAYAR PROGRAMLAMA 2

MTM 305 MİKROİŞLEMCİLER

İşletim Sistemlerine Giriş 2. Kaynakların Paylaşımı. Öğr.Gör. Dr. Şirin KARADENİZ

WEB TASARIM I. Öğr. Gör. M. Mutlu YAPICI. Ankara Üniversitesi Elmadağ Meslek Yüksekokulu

Doğu Akdeniz Üniversitesi Bilgisayar Mühendisliği Bölümü. BLGM 318 Ara Sınavı Đlkbahar Dönemi 13 Nisan Ad, Soyad Öğrenci No.

Dr. Fatih AY Tel: fatihay@fatihay.net

İşletim Sistemlerine Giriş

BMT 101 Algoritma ve Programlama I 11. Hafta. Yük. Müh. Köksal Gündoğdu 1

FONKSİYONLAR. Gerçek hayattaki problemlerin çözümü için geliştirilen programlar çok büyük boyutlardadır.

INTEL İŞLEMCİLERİNDE CSD İŞLETİM SİSTEMİNİN BAŞLATILMASI. Selim Nasır

OpenGL Uygulamaları. 1. Giriş. 2. OpenGL. Deney 2

BİL-141 Bilgisayar Programlama I (Java)

Programlama Dilleri. C Dili. Programlama Dilleri-ders08/ 1

Bilgisayar Mimarisi ve Organizasyonu Giriş

MTM 305 MĠKROĠġLEMCĠLER

DENEY III RAPORU MİKROİŞLEMCİ UYGULAMALARI LABORATUVARI

5. BÖLÜM KORUMA MEKANİZMASI

Mikrobilgisayar Mimarisi ve Programlama

Şekil. 64 Kelimelik Yığıtın Blok Şeması

İŞLETİM SİSTEMİ İşletim sistemi kullanıcıyla bilgisayar donanımı arasında iletişim sağlayan programdır.

emon: Gerçek Zamanlı Gömülü Sistemlerin Çalışma Zamanı Görselleştirilmesi İçin Monitör Yazılımı

Multicore/Multithread Programlama

BIL 362 Mikroilemciler Dersi Arasınav Cevapları 3 Temmuz 2007

BM102 BİLGİSAYAR PROGRAMLAMA II LABORATUVAR UYGULAMALARI. 3Hafta

Transkript:

CSD İŞLETİM SİSTEMİNDE SİSTEM FONKSİYONLARININ ÇAĞIRILMASI 07.07.2003 Burak DEMİRKOL Atılım BOY [v 1.0] Özet : Bu makalede CSD İşletim sisteminin sistem fonksiyonlarının user mod dan (ring 3) kernel mod a (ring 0) geçilerek çağırılma mekanizması anlatılacaktır. 1. SİSTEM FONKSİYONU KAVRAMI Sistem fonksiyonları, işletim sisteminin dış dünya ile bağlantısını sağlayan aşağı seviyeli fonksiyonlardır. UNIX/LINUX terminolojisinde kernel moda geçilerek çalıştırılan API fonksiyonlarına sistem fonksiyonu denilmektedir. İşletim sisteminin aşağı seviyeli çalışma şekli ve organizasyonu, sistemin kararlılığı ve güvenirliliği açısından önemlidir. Her şey işletim sisteminin kontrolü altında, güvenli ve kararlı bir şekilde yürütülmelidir. Bütün bu koruma mekanizmalarına rağmen işletim sistemi dış dünya ile iletişimini kaybetmemeli ve çeşitli isteklere cevap verebilmelidir. İşletim sisteminin kendi belirlediği sınırlar içerisinde bu isteklere cevap verebilmesi için programcılara sunduğu fonksiyonlar ise sistem fonksiyonlarıdır. Bir işletim sisteminde olması beklenilen sistem fonksiyonları POSIX standartlarında belirtilmiştir. Bu standartlara uygun olarak yazılan işletim sistemlerindeki API fonksiyonları aynı olacağı için POSIX API fonksiyonları kullanılarak yazılan programlar taşınabilir olacaktır. CSD işletim sistemi de POSIX standartlarına uygun bir işletim sistemi olacaktır. Bütün bunlara ek olarak her işletim sisteminin kendisine özgü, programcılara sunduğu bazı sistem fonksiyonları olabilir. Bunlar da o işletim sisteminin karakteristik özelliklerini belirler. Örneğin GUI tabanlı bir işletim sistemi, kendine özgü grafik ara yüzü üzerinde her türlü işlemin kolayca yapılabilmesi için çeşitli sistem fonksiyonları sunabilir. Buradan da anlaşıldığı gibi sistem fonksiyonları, işletim sistemi üzerinde yazılan programların taşınabilirliği, kolay uygulama geliştirilebilir olması, sağlamlığı ve güvenilirliği açısından önemlidir. 2. SİSTEM FONKSİYONLARININ ÇAĞRILMA MEKANİZMASI CSD işletim sisteminde, bir API fonksiyonu çağırıldığında çağırılan API fonksiyonu sistem fonksiyonunu çağırır. Buradan da anlaşılabileceği gibi aslında programcının çağırdığı API fonksiyonu sarma (wrapper) bir fonksiyondur. CSD kaynak kodlarında sistem fonksiyonlarının isimlerinin başında SYS_ öneki vardır. Örneğin exit() API fonksiyonu kendi içerisinde sistem fonksiyonunu aşağıdaki gibi çağırır: 1

mov eax, 1 xor ebx, ebx int 80h Yukarıdaki kod da sırayla, eax'a çağrılacak gerçek sistem fonksiyonu numarası, ebx e birinci parametre koyulur. Eğer varsa diğer parametreler sırayla ecx, edx,... yazmaçlarına aktarılır. Daha sonra int 80h kesmesi çağrılır. Bu kesmeye işletim sistemi tarafından bir tuzak kapısı (trap gate) yerleştirilmiştir. Bu kesme çağırıldığında tuzak kapısı yolu ile akış işletim sisteminin belirlediği bir noktaya gelir. Bu nokta CSD işletim sisteminde SystemCall_ASM fonksiyonudur. 3. SİSTEM FONKSİYONU ÇAĞIRILDIĞINDA NE OLUR? Bir API fonksiyonu çağrıldığında tuzak kapısı yolu ile akış işletim sisteminin belirlediği noktaya gelir. Örneğin UNIX/LINUX işletim sistemlerinde 80h kesmesine bir tuzak kapısı yerleştirilmiştir. 80h kesmesi çağırıldığında tuzak kapısı yolu ile akış işletim sisteminin belirlediği noktaya gelir. CSD işletim sisteminde bu nokta entry.asm içerisindeki SystemCall_ASM fonksiyonudur. Bu noktaya gelindiğinde artık CPU ring 0 da çalışmaktadır. syscall.asm dosyasının içerisindeki kodun tamamı makalenin bir sonraki bölümünde verilecektir. Bu bölümde entry.asm dosyasındaki kodlar incelenecektir. SystemCall_ASM push eax ; save system call number Bu noktada eax içerisindeki değer stack te saklanmıştır. Bir önceki konuda anlatıldığı gibi eax yazmacı içerisinde çağırılacak sistem fonksiyonunun numarası vardır. SAVE_ALL ; save es, ds, eax, ebp, edi, esi, edx, ecx, ebx Bu bir makrodur. Açılımı ise aşağıdaki gibidir; %macro SAVE_ALL 0 push es push ds push eax push ebp push edi push esi push edx push ecx push ebx mov edx, KERNEL_DATA_SEL mov ds, edx mov es, edx %endmacro 2

Bu noktada tüm yazmaçlar ters sırada stack de saklanmıştır. Bir sistem fonksiyonu çağrılmadan önce tüm yazmaçlar stack de saklanmalı, sistem fonksiyonundan çıktıktan sonra akış user mod a geçerken bu yazmaçlar geri yüklenmelidir. SAVE_ALL makrosu tüm yazmaçların saklanması işini yapar. Makalenin bir önceki bölümünde sistem fonksiyonunun çağrılma mekanizması anlatılırken yazmaçların içerisinde sistem fonksiyonunun parametreleri olduğu anlatılmıştı. Buradan da anlaşılacağı gibi tüm yazmaçların saklanması demek aynı zamanda parametre olarak kullanılan yazmaçların da saklanması demektir. Bu noktada dikkat edilmesi gereken önemli bir durum daha vardır o da SAVE_ALL makrosu içerisinde parametrelerin stack e ters sırada push edilmesidir. Bilindiği gibi assembler içerisinden _cdecl çağrılma biçimine sahip bir C fonksiyonunu çağırmak için parametrelerin ters sırada push edilmesi gerekmektedir. Buradan da anlaşılabileceği gibi aslında SAVE_ALL makrosu ile saklanan yazmaçlar birazdan çağırılacak sistem fonksiyonuna parametre olarak geçirilmiştir. Özetlemek gerekirse SAVE_ALL makrosunda yapılan işlemin amacı şunlardır; Sistem fonksiyonunu çağırmadan önce tüm yazmaçları stack üzerinde saklanması, (Böylece sistem fonksiyonunun parametresi olarak kullanılan yazmaçların da stack üzerinde saklanması) Bütün yazmaçların stack üzerine ters sırada push edilmesi ile bu yazmaçların birazdan çağrılacak C fonksiyonlarına parametre olarak geçirilebilmesi de sağlanmıştır. cmp jae eax, NSYS_CALLS BAD_SYSCALL Yukarıdaki kod da çağırılması istenen sistem fonksiyonu numarasının, toplam sistem fonksiyonundan büyük olup olmadığı kontrol edilmiştir. Eğer geçersiz bir sistem fonksiyonu numarası girilmiş ise akış BAD_SYSCALL fonksiyonuna gidecektir. BAD_SYSCALL fonksiyonu ise aşağıdaki gibidir; BAD_SYSCALL: mov eax, -ENOSYS jmp RETURN_FROM_SYSCALL Burada ENOSYS hata kodu eax yazmacına negatif olarak yerleştirilmiştir ve RETURN_FROM_SYSCALL fonksiyonu çağırılmıştır. RETURN_FROM_SYSCALL: RESTORE_ALL add esp, 4 ret ; restores ebx, ecx, edx, esi, edi, ebp, eax, ds, es ; return to user mode! Bu noktaya gelindiğinde RESTORE_ALL makrosu çağırılarak stack üzerinde saklanan yazmaçlar aynı sırada pop edilmiştir ve stack dengelenerek ret makine kodu ile tekrar user mod a geri dönülmüştür. Eğer eax içerisindeki değer geçerli bir sistem fonksiyonu numarası ise akış aşağıdaki çağrı yapılarak devam edecektir; 3

call dword [ga_systemcalltable + eax * 4] ga_systemcalltable bir fonksiyon gösterici dizisidir. Bütün sistem fonksiyonlarının fonksiyon pointer ları bu dizinin bir elemanıdır ve dizinin her elemanı 4 byte uzunluğundadır. ga_systemcalltable bu dizinin başlangıç adresi olduğuna göre her bir fonksiyon göstericisine; n, sistem fonksiyon numarası olmak üzere: ga_systemcalltable + n * 4 şeklinde ulaşırız. call makine komutu ile erişilen pointer ı kullanarak sistem fonksiyonu çağırılmıştır. Sistem fonksiyonundan çıkıldığında akış aşağıdaki noktaya gelir. mov [esp + REG_EAX], eax ; save return value in EAX Sistem fonksiyonundan elde edilen geri dönüş değeri stack üzerindeki eax yazmacına yazılmıştır. Bilindiği gibi stack üzerine push edildiğinde esp yazmacının gösterdiği adres azalmaktadır. REG_ ile başlayan sabitler ise hangi yazmacın esp den ne kadar uzaklıkta olduğunu gösterir. Akış aşağıya doğru devam ettiğinde RETURN_FROM_SYSCALL fonksiyonuna girmektedir ve user moda yani ring 3 e geri dönülmektedir. 4. İSKELET PROGRAM Bu bölümde CSD sistem fonksiyon çağırma mekanizmasına ilişkin iskelet kodlar verilmektedir. ; FILE : syscall.asm ; AUTHOR : Kaan ASLAN ; LAST UPDATE : 01/05/2003 ; PLATFORM : Win32/Linux ; TRANSLATOR : nasm ; ; Sekeleton CSD System Call Implementation File ; ; Copyleft (c) 1993 by C and System Programmers Association (CSD) ; All Rights Free [BITS 32] %include "kernel.inc" %include "port.inc" ;-------------------------------------------------------------------- ; Symbolic Definitions NSYS_CALLS EQU 128 4

ENOSYS EQU 38 ; Register Stack Offsets REG_EBX EQU 0x00 REG_ECX EQU 0x04 REG_EDX EQU 0x08 REG_ESI EQU 0x0C REG_EDI EQU 0x10 REG_EBP EQU 0x14 REG_EAX EQU 0x18 REG_DS EQU 0x1C REG_ES EQU 0x20 ;-------------------------------------------------------------------- - ; Macro Definitions %macro SAVE_ALL 0 push es push ds push eax push ebp push edi push esi push edx push ecx push ebx mov edx, KERNEL_DATA_SEL mov ds, edx mov es, edx %endmacro %macro RESTORE_ALL 0 pop ebx pop ecx pop edx pop esi pop edi pop ebp pop eax pop ds pop es add esp, 4 %endmacro ;-------------------------------------------------------------------- ; System Call Routines [SECTION.text] ; --- Global Declarations --- ; GLOBAL_C SystemCall_ASM GLOBAL_C ga_sytemcalltable GLOBAL_C SetSystemCall_ASM ; --- System Call Entry Point --- ; 5

SystemCall_ASM: push eax ; save system call number SAVE_ALL ; save es, ds, eax, ebp, edi, esi, edx, ecx, ebx cmp eax, NSYS_CALLS jae BAD_SYSCALL call dword [ga_systemcalltable + eax * 4] mov [esp + REG_EAX], eax ; save return value in EAX RETURN_FROM_SYSCALL: RESTORE_ALL ; restores ebx, ecx, edx, esi, edi, ebp, eax, ds, es iret ; return to user mode! BAD_SYSCALL: mov eax, -ENOSYS jmp RETURN_FROM_SYSCALL ;--- Set System Call --- ; SetSystemCall_ASM: push ebp mov ebp, esp mov ecx, [ebp + 8] mov eax, [ebp + 12] shl ecx, 2 add [ecx + ga_systemcalltable], eax pop ret ebp ; --- NULL System Call --- ; SYS_LINUX_ni_syscall: ret [SECTION.data] ga_systemcalltable: dd SYS_LINUX_ni_syscall times (NSYS_CALLS - ($ - ga_systemcalltable) / 4 ) dd0 Kaynaklar: 1. CSD İşletim Sistemi Kernel Grubu Toplantıları, Kaan ASLAN 2003 2. Assembly Programlama Dili Kurs Notları, Kaan ASLAN 2003 6