2011-06-17 4 views
5

Potrzebuję zbudować system operacyjny, bardzo mały i podstawowy, z faktycznie najmniejszą funkcjonalnością, kodowany w C.Czy stdio można używać podczas kodowania jądra ...?

Prawdopodobnie CUI OS, który wykonuje pewne zarządzanie pamięcią i ma co najmniej edytor tekstu i kalkulator, jego będzie eksperymentowaniem, jak stworzyć kod, który ma pełną i bezpośrednią kontrolę nad twoim sprzętem.

Nadal będę wymagał interfejsu, który będzie wymagał funkcji wejścia/wyjścia, takich jak printf (& args), scanf (& args). Teraz moje podstawowe pytanie brzmi: czy powinienem używać istniejących nagłówków czy kodowania od podstaw, i dlaczego tak jest?

Byłbym bardzo wdzięczny wam i za pomoc.

Odpowiedz

3

Po pierwsze, nie można łączyć z niczym od libc ... będziesz musiał kodować wszystko od zera.

teraz pracował na mikro-jądra ja, nie użyłby rzeczywiste stdio nagłówków, które pochodzą z libc ponieważ będą zaśmiecone wiele dodatkowych informacji, które będą albo nieistotne dla Twojego systemu operacyjnego, czy będzie tworzyć błędy kompilatora ze względu na brakujące definicje, itp. Co do tego, że I będzie zrobić jednak podpisy funkcji dla tych standardowych funkcji są takie same ... więc w końcu będziesz miał plik o nazwie stdio.h dla systemu operacyjnego, ale byłoby bardzo uproszczony plik nagłówkowy z podstawowymi minimalnymi wymaganiami dla twoich potrzeb i posiadający tylko standardowe funkcje I/O, których potrzebujesz, z poprawnymi standardowymi podpisami.

Pamiętaj, że na zapleczu, tzn. W pliku stdio.c, będziesz musiał wskazać te funkcje na niestandardowy sterownik konsoli lub inny rodzaj napędu znaków dla swojego wyświetlacza. Albo to, albo możesz po prostu użyć ich jako wrapperów dla innej rutynowej procedury wyświetlania ekranu jądra. Będziesz także chciał się upewnić, że nawet jeśli możesz używać dyrektywy #include <stdio.h> w innych modułach kodu systemu operacyjnego, aby uzyskać dostęp do tych funkcji drukowania, nie łącz się z libc. Można to zrobić za pomocą gcc -ffreestanding.

+0

Wielkie dzięki, ale teraz dla ciebie kolejny ciężar ... teraz, gdy wiem, że przeszedłeś przez to wszystko, kiedy już zacznę tworzyć tę rzecz OS Mogę cię kłopotać, gdy tylko dostanę uderzenie :) – Kartikya

+1

Haha, oczywiście, nie ma problemu, chociaż szczerze mówiąc, myślę, że uzyskasz dużo więcej pomocy od ludzi na [OSdev.org] (http: // forum. osdev.org/). Pisanie jądra, szczególnie gdy dostajesz się do języka asemblerowego, może być bardzo trudne, szczególnie gdy zaczynasz podwójne i potrójne błędy (przynajmniej możesz złapać podwójny błąd w obsłudze wyjątków). Zdecydowanie sugeruję użycie emulatora takiego jak QEMU lub BOCHS i poznanie ich debuggerów (szczególnie debuggera BOCHS). Przygotuj się również na spędzenie dużo czasu w podręczniku programisty procesora Intela. – Jason

+0

Dziękuję. Sir, skontaktuję się z tobą, jak tylko zrobię postęp. – Kartikya

0

Just retarget newlib.

printf, scanf, itp. Polega na realizacji konkretnych funkcji, aby uzyskać pojedynczy znak lub wydrukować pojedynczy znak. Następnie możesz wykonać na przykład UU-1 stdin i stdout.

+0

Więc ten nowy interfejs ... czy działałby bez wsparcia, to znaczy, że nie jest to zależne od platformy , właśnie potwierdzam. ? – Kartikya

+0

Tak. Sprawdź to na http://sourceware.org/newlib/ –

0

Samo jądro nie wymagałoby funkcji printf i scanf, jeśli nie chcesz, aby jądro pozostało w trybie jądra i pracuj zgodnie z zaplanowanymi aplikacjami. Ale dla podstawowych funkcji printf i scanf możesz napisać własne funkcje printf i scanf, które zapewnią podstawowe wsparcie dla drukowania i odbierania danych wejściowych. Nie mam zbyt dużego doświadczenia w tym zakresie, ale możesz spróbować zrobić bufor konsoli, w którym sterownik klawiatury umieszcza odczytane znaki ASCII (po konwersji z kodów skanowania), a następnie sprawiają, że pracują nad nim printf i scanf. Mam jedną podstawową implementację: napisałem gets zamiast scanf i zachowałem prostotę. Aby uzyskać liczbę całkowitą, możesz napisać funkcję atoi, aby przekonwertować ciąg na liczbę.

Do portów w innych bibliotekach potrzebne są komponenty, od których zależą biblioteki. Musisz podjąć decyzję, jeśli możesz kodować te wsparcie w jądrze, aby możliwe było przeniesienie bibliotek.Jeśli jest to trudniejsze, to kodowanie niektórych podstawowych funkcji wejścia nie wydaje mi się złe na tym etapie,