Gå til innhold

Nyskjerrig på C++


Anbefalte innlegg

Hei. Har drevet en del med Java for tiden, men irriterer meg over at man ikke kan jobbe direkte mot hardware. Det som streifet tankene mine var om jeg skulle prøve meg på å lage mitt eget lille OS, for å lære mest mulig om hvordan datamaskinen er bygd opp. Derfor tenkte jeg kanskje at C++ var et bra valg? Har hørt at linux kjernen osv er skrevet i C, men er det egentlig noe forskjell på dette?

 

Jeg kan ikke si at jeg er proff i programmering, men det var vel ingen av oss i starten :D Har noen tips om hvordan jeg burde angripe dette temaet? Jeg må selfølgelig lære meg språket først, men det er jo sikkert en del stoff om hvordan man bygger et OS...

 

Takker for svar! :w00t:

Endret av kjey
Lenke til kommentar
Videoannonse
Annonse
Hei. Har drevet en del med Java for tiden, men irriterer meg over at man ikke kan jobbe direkte mot hardware.

 

Nærmest alle språk har støtte for kommunikasjon med OS o.l. siden OS som regel er skrevet i C. Via OSet igjen har man direkte tilgang (for rette betydning av "tilgang") til maskinvare; det er liksom litt av poenget med et OS.

 

Sjekk JNI siden du bruker Java: http://en.wikipedia.org/wiki/Java_Native_Interface

( jeg bruker CFFI: http://common-lisp.net/project/cffi/manual/cffi-manual.html )

 

Du gjør sansynligvis en stor feil om du tror at du kommer til å spare tid ved å porte hele prosjektet ditt over til C/C++ basert på det at "det er tungvinnt å nå C-biblioteker fra Java".

 

Det som streifet tankene mine var om jeg skulle prøve meg på å lage mitt eget lille OS, for å lære mest mulig om hvordan datamaskinen er bygd opp. Derfor tenkte jeg kanskje at C++ var et bra valg? Har hørt at linux kjernen osv er skrevet i C, men er det egentlig noe forskjell på dette?

 

Nå skifter plutselig temaet totalt - husk det; utvikling av OS havner ikke i samme kategori som det du snakker om over.

 

Hold deg til C i kjernen og i driverene. Det er mange grunner til dette, men jeg orker ikke gå inn på dem akkurat nå. Holder det å si at du bør stole på meg - siden det er lørdag?

 

Så fort du i OSet ditt merker at du trenger et kraftigere mer høynivåish språk til ting som f.eks. GUI så hopper du rett over C++ og går for ting som Lisp, Python o.s.v.

 

Jeg kan ikke si at jeg er proff i programmering, men det var vel ingen av oss i starten  :D  Har noen tips om hvordan jeg burde angripe dette temaet? Jeg må selfølgelig lære meg språket først, men det er jo sikkert en del stoff om hvordan man bygger et OS...

6789426[/snapback]

 

Bestill og les `The C Programming Language' og en eller annen bok om operativsystemer fra amazon.com så er du 0.00000000001% nærmere målet ditt ang. utvikling av OS. Det er dog ikke umulig å bruke andre språk her også. En norsk kar med navn Frode utvikler et OS i Lisp kallt Movitz: http://common-lisp.net/project/movitz/

Lenke til kommentar

Takk for svar! Grunnen til at jeg "byttet" tema er vel fordi jeg ikke akkurat kan så veldig mye om hvordan et OS er bygd opp i det hele tatt. Men jeg har sett OS som er bygget opp i Java, men der benytter de ASM også, men mener du at det går ann å lage et OS ved bruk av Java ved hjelp av JNI? Hvis det går tar jeg heller bruk av Java siden jeg allerede er godt i gang :)

Endret av kjey
Lenke til kommentar

edit: det må taes forbehold når man leser denne posten; jeg er visst ikke helt edru :}

 

JNI brukes til å:

 

* laste inn C-biblioteker

* kalle C funksjoner

* lese av globale variabler i C-biblioteker

* angi Java-metoder som kan kalles fra C

 

edit: Det jeg sier her er litt galt, for det finnes nemlig flere språk enn C som spytter ut biblioteker (.dll eller .so-filer); Lisp f.eks. :)

 

Ta f.eks. `strlen' som er en del av glibc (noe som bør regnes som en del av at hvilket som helst desktop-OS). Jeg kan kalle `strlen' helt direkte, rett fra Lisp, slik:

 

cffi> (foreign-funcall "strlen" :string "blah" :size-t)
4

 

I C er strlen deklarert slik: size_t strlen(const char* s). Jeg kan laste inn C-biblioteker og kalle funksjonene i dem. Regner med at du kjenner til GTK:

 

cffi> (load-foreign-library "/usr/lib/libgtk-x11-2.0.so")
#P"/usr/lib/libgtk-x11-2.0.so"

 

.so-filer under Linux er forresten det "samme som" .dll-filer i Windows.

 

Dette kan gjøres i de fleste høynivåspråk, og gjøres altså i Java v.h.a. JNI.

 

Litt Off Topic, men ta også en titt på RFFi, som er en ting jeg duller med innimellom for å kalle funksjoner på andre maskiner over TCP/IP (derav navnet Remote Foreign Function Interface):

http://nostdal.org/~lars/programming/lisp/rffi/rffi.html Serveren kan selvfølgelig være skrevet i "hva som helst"; ikke nødvendigvis Lisp som i mitt tilfelle her.

 

Hm - tja; tolkeren er en native binary, tolkeren omtolker java-binary til native binary. Det spiller ingen rolle, for C må også tolkes om - forskjellen er kun _når_ og _hvordan_ det skjer.

 

Angående dette med "OS" så er det bare et spørsmål ved hvor en ønsker å sette grensa. Tradisjonelt forståes et OS kun som det ene tynne laget som ligger rett over maskinvaren og har et API som klienter (programmer) kan ta i bruk, men et OS kan også defineres mer generelt som et hvilket som helst lag med et API. For meg er OSet Gnome, Firefox, Openoffice, Emacs eller dette forumet .. for Gnome er OSet GTK .. for Gtk er OSet Glib .. for GLib er OSet glibc .. for glibc er OSet Linux o.s.v. Det snakkes jo om at webben er i ferd med å bli et gigantisk distribuert OS også, med ting som webservices o.l. (RFFi også! :}). Det hele ligger i ordet "services"; ting som kan utføre tjenester - og det er det et OS også gjør.

 

Tilslutt - i hvertfall i noen tilfeller (hehe) når man det ytterste "laget", og man oppnår en komplett sirkel: "request -> response -> request -> response". Man har et lukket "levende" system. Dette laget er altså brukeren for de som ikke har forstått hva jeg "babbler om". Siden jeg snakker så generelt som jeg gjorde her innser man plutselig at dette "laget" vi kaller brukeren i realiteten kunne vært programvare - og illusjonen av at et OS er en bestemt lukket ting "der nede" forsvinner når man ser at det ikke kan eksistere (eller oppstå) alene, men kun i form av en ting eller "rolle" koblet til andre ting på "begge sider" av en request-response-sirkel. Man vet ikke lengre hvor kjernen i det som før var et enkelt tre er, i det det blir til en graph ( http://en.wikipedia.org/wiki/Graph_%28mathematics%29 ); altså et nettverk eller sirkler.

 

Plutselig innser man altså at det hele kun handler om hvor man ønsker å sette grensen. I ditt tilfelle antar jeg at du ønsker å lære eller forstå hvordan man hånderer resurser som f.eks.:

 

* minne

* tråder/prosesser/scheduling

* filsystemer, disker

* netverksrelaterte ting (tcp/ip)

 

Disse tingene må man håndtere både oppe og nede, men i forskjellige former. Du er sansynligvis ute etter å re-implementere, eller forstå et lag som håndterer disse tingene og samtidig er nært knyttet til selve maskinvaren. Så for din del blir OSet "der nede" i det som tradisjonellt kalles "kjernen" eller "kernelen", men som etter min mening ikke er noen kjerne i noe som egentlig ikke er et tre med én rot (altså kjerne).

 

..vel; nok snakk om sirkler - folk kan jo tro jeg er en av disse gale hippi-typene..

 

Det folk i hvertfall må få med seg er at det er ikke nødvendig - eller en gang hensiktsmessig - jeg vil t.o.m. si at det er idiotisk, å skrive større programvare i C bare fordi de underliggende lagene er i C eller ASM! :) Det er _lett_ og _lurt_ å kalle ting i/fra de underliggende og overliggende lagene v.h.a. høynivåspråk som Lisp, Java, o.s.v.

Endret av lnostdal
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...