2014-09-12 25 views
5

Monolitik bir OS yazıyorum (Bu bir işletim sistemi olarak adlandırılan bir şakadır, ancak çok az, okul düzeyinde işlevsellik var). Monolitik dediğimde, tek bir ikili blob olarak derlenmiş ve dosya sistemi için desteklenmemişti. Şu anda sadece döngüsel olarak sonsuz olan basit bir kullanıcı alanı var.Bellek ayırması olmayan bir işletim sistemindeki uygulamadan çıkma

İşletim sistemimi biraz daha kullanışlı hale getirmeyi ve düzenli uygulamalar gibi son kullanıcılara son verebilecek kullanıcı uygulamaları yazmayı planlıyorum.

Glibc veya eşdeğeri yok. Mevcut alandaki kullanıcı kütüphanem, yazdığım koddur. Artık benim sorunum, kullanıcı uzay uygulamaları için bir çerçeve ekleme ve bu sayede bir düzeltme noktasında sonlandırmalarıdır.

Programların düzenli sistemlerde nasıl derlendiğini ve bir program sona erdiğinde ne olacağını biliyorum. Ancak, benim durumumda, kütüphanelere karşı programları derlemek için bir lüksüm yok ve eğer bir program sona ererse, o zaman talimat göstericim sadece bir vahşi sapma gider.

Şu anda tüm uygulamaların bir "iade çağrısı" yapmasını sağlıyorum ve uygulama yığınını bir düzeltme adresiyle (başlatma sırasında) önceden dolduruyorum. Sorunu çözmenin daha iyi bir yolu var mı?

Cevabın yanı sıra, bazı işletim sistemi kavramlarına açıklık getirmek için çok mutlu olurdum.

x86 öykünücü platformunda çalışıyorum ve ikili adım adım statik olarak derledim. (Sanal bellek desteğim var)

+3

Oldukça erken Linux sürümünün bir şakaydı. Kendi kendine kullanımdan kalkma o kadar çabuk olmayın :-) – paxdiablo

+0

Uygulama yığınıyla ilgili özel bir sorun mu soruyorsunuz, yoksa başka bir şey mi soruyorsunuz? – jxh

+0

Sabit bir adreste uygulama sonlandırma çözümlerini soruyorum. Şu anda her uygulamanın yığına yerleştirdiğim sabit bir dönüş adresine sahip olduğu bir rota aldım. Şimdi daha iyi bir çözüm arıyorum. –

cevap

3

İlk yığın çerçevesini el ile hazırlama işlemi, hangi işlemi gerçekleştirmeniz gerektiğine dair temizleme koduyla mükemmel bir yöntem gibi görünüyor. Eğer işletim sisteminizde "syscalls" varsa, o zaman kullanıcı alanı süreç temizleme kodu (exit() olarak adlandırılır) muhtemelen _exit() sistem çağrısı çağrısı ile sona erer. Programın hala '' la-la land '' 'da kod çalıştırmayı denediği durumu ele almanız gerekiyor, çünkü bu hala olabilir (ancak bunu yapmadan önce bir sayfa koruma sistemi zor bir problem olabilir).

+0

Evet, şu anki çözümüm bahsettiğiniz gibi. Her uygulamam sabit bir adrese geri döner ve çıkış eşdeğeri olan bir rutinde toplanır. Sonra gidip bir syscall yapıyorum ve bu uygulama için gerekli kullanıcı alanı ve çekirdek alan temizleme yap. Ancak, iadesi yapmayan bir uygulamam yok. (X86 ülkesinde "ret çağrısı"). Bunu bazı korsanlıkla başaramaya çalışıyorum. –

+0

Hemen hemen her işletim sisteminde geri dönmeyen uygulamalara sahip olabilirsiniz: int main (void) {do {} while (1); } ' –

+0

Oh, benim ifadem doğru olmayabilir. Bu geçersiz ana (void) {int j = 2;} gibi bir uygulamaya sahip olamıyorum. Bu uygulamanın çıkışı La La Land'de gider. Ancak int main (void) {int j = 2; return;} bana bir temizleme rutinine götüren bir iade beyanı olduğu için herhangi bir soruna neden olmaz. –

İlgili konular