24.01.2014 Views

Codice

Codice

Codice

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.

184 volume VI os16<br />

Script e sorgenti del kernel 185<br />

30265 | #<br />

30266 | true<br />

30267 | else<br />

30268 | #<br />

30269 | # File oggetto differente da ‘...crt0.s’.<br />

30270 | #<br />

30271 | EXEC=‘echo "$o" | sed "s/\.o$//"‘<br />

30272 | BASENAME=‘basename $o .o‘<br />

30273 | if [ -e "applic/$BASENAME.crt0.o" ]<br />

30274 | then<br />

30275 | #<br />

30276 | # Qui c’è un file ‘...crt0.o’ specifico.<br />

30277 | #<br />

30278 | ld86 -i -d -s -o $EXEC \<br />

30279 | applic/$BASENAME.crt0.o $o $OBJLIB<br />

30280 | else<br />

30281 | #<br />

30282 | # Qui si usa il file ‘crt0.o’ generale.<br />

30283 | #<br />

30284 | ld86 -i -d -s -o $EXEC applic/crt0.o $o $OBJLIB<br />

30285 | fi<br />

30286 | #<br />

30287 | if [ -x "applic/$BASENAME" ]<br />

30288 | then<br />

30289 | if mount | grep /mnt/os16.a > /dev/null<br />

30290 | then<br />

30291 | mkdir /mnt/os16.a/bin/ 2> /dev/null<br />

30292 | cp -f "$EXEC" /mnt/os16.a/bin<br />

30293 | else<br />

30294 | echo "[$0] Cannot copy the application "<br />

30295 | echo "[$0] $BASENAME inside the floppy "<br />

30296 | echo "[$0] disk image!"<br />

30297 | break<br />

30298 | fi<br />

30299 | fi<br />

30300 | fi<br />

30301 | done<br />

30302 | sync<br />

30303 | #<br />

30304 | # Collegamento delle applicazioni più semplici,<br />

30305 | # provenienti da altri sistemi operativi.<br />

30306 | #<br />

30307 | for o in ‘find ported/mix -name \*.o -print‘<br />

30308 | do<br />

30309 | if [ "$o" = "ported/mix/crt0.o" ] \<br />

30310 | || [ ! -e "$o" ] \<br />

30311 | || echo "$o" | grep ".crt0.o$" > /dev/null<br />

30312 | then<br />

30313 | #<br />

30314 | # Il file non esiste oppure si tratta di ‘...crt0.s’.<br />

30315 | #<br />

30316 | true<br />

30317 | else<br />

30318 | #<br />

30319 | # File oggetto differente da ‘...crt0.s’.<br />

30320 | #<br />

30321 | EXEC=‘echo "$o" | sed "s/\.o$//"‘<br />

30322 | BASENAME=‘basename $o .o‘<br />

30323 | if [ -e "ported/mix/$BASENAME.crt0.o" ]<br />

30324 | then<br />

30325 | #<br />

30326 | # Qui c’è un file ‘...crt0.o’ specifico.<br />

30327 | #<br />

30328 | ld86 -i -d -s -o $EXEC \<br />

30329 | applic/$BASENAME.crt0.o $o $OBJLIB<br />

30330 | else<br />

30331 | #<br />

30332 | # Qui si usa il file ‘crt0.o’ generale.<br />

30333 | #<br />

30334 | ld86 -i -d -s -o $EXEC applic/crt0.o $o $OBJLIB<br />

30335 | fi<br />

30336 | #<br />

30337 | if [ -x "$EXEC" ]<br />

30338 | then<br />

30339 | if mount | grep /mnt/os16.a > /dev/null<br />

30340 | then<br />

30341 | mkdir /mnt/os16.b/bin/ 2> /dev/null<br />

30342 | cp -f "$EXEC" /mnt/os16.b/bin<br />

30343 | else<br />

30344 | echo "[$0] Cannot copy the application "<br />

30345 | echo "[$0] $EXEC inside the floppy "<br />

30346 | echo "[$0] disk image!"<br />

30347 | break<br />

30348 | fi<br />

30349 | fi<br />

30350 | fi<br />

30351 | done<br />

30352 | sync<br />

30353 | #<br />

30354 | # Altre applicazioni più importanti.<br />

30355 | #<br />

30356 | for d in ported/*<br />

30357 | do<br />

30358 | if [ -d "$d" ]<br />

30359 | then<br />

30360 | #<br />

30361 | #<br />

30362 | #<br />

30363 | OBJECTS=""<br />

30364 | BASENAME=‘basename $d‘<br />

30365 | EXEC="$d/$BASENAME"<br />

30366 | #<br />

30367 | #<br />

30368 | #<br />

30369 | if [ "$BASENAME" = "mix" ]<br />

30370 | then<br />

30371 | #<br />

30372 | # già fatto.<br />

30373 | #<br />

30374 | continue<br />

30375 | fi<br />

30376 | #<br />

30377 | #<br />

30378 | #<br />

30379 | for o in $d/*.o<br />

30380 | do<br />

30381 | if [ "$o" = "$d/crt0.o" ] \<br />

30382 | || [ ! -e "$o" ]<br />

30383 | then<br />

30384 | true<br />

30385 | else<br />

30386 | OBJECTS="$OBJECTS $o"<br />

30387 | fi<br />

30388 | done<br />

30389 | #<br />

30390 | ld86 -i -d -s -o $EXEC $d/crt0.o $OBJECTS $OBJLIB<br />

30391 | #<br />

30392 | if [ -x "$d/$BASENAME" ]<br />

30393 | then<br />

30394 | if mount | grep /mnt/os16.b > /dev/null<br />

30395 | then<br />

30396 | mkdir /mnt/os16.b/bin/ 2> /dev/null<br />

30397 | cp -f "$EXEC" /mnt/os16.b/bin<br />

30398 | else<br />

30399 | echo "[$0] Cannot copy the application "<br />

30400 | echo "[$0] $BASENAME inside the floppy "<br />

30401 | echo "[$0] disk image!"<br />

30402 | break<br />

30403 | fi<br />

30404 | fi<br />

30405 | fi<br />

30406 | done<br />

30407 | sync<br />

30408 |<br />

30409 | fi<br />

30410 |}<br />

30411 |#<br />

30412 |# Start.<br />

30413 |#<br />

30414 |if [ -d kernel ] && \<br />

30415 | [ -d applic ] && \<br />

30416 | [ -d lib ]<br />

30417 |then<br />

30418 | OS16PATH=‘pwd‘<br />

30419 | main<br />

30420 |else<br />

30421 | echo "[$0] Running from a wrong directory!"<br />

30422 |fi<br />

104.2 os16: «kernel/devices.h»<br />

Si veda la sezione 103.1.<br />

40001 |#ifndef _KERNEL_DEVICES_H<br />

40002 |#define _KERNEL_DEVICES_H 1<br />

40003 |<br />

40004 |#include <br />

40005 |#include <br />

40006 |//----------------------------------------------------------------------<br />

40007 |#define DEV_READ 0<br />

40008 |#define DEV_WRITE 1<br />

40009 |ssize_t dev_io (pid_t pid, dev_t device, int rw, off_t offset,<br />

40010 | void *buffer, size_t size, int *eof);<br />

40011 |//----------------------------------------------------------------------<br />

40012 |// The following functions are used only by ‘dev_io()’.<br />

40013 |//----------------------------------------------------------------------<br />

40014 |ssize_t dev_mem (pid_t pid, dev_t device, int rw, off_t offset,<br />

40015 | void *buffer, size_t size, int *eof);<br />

40016 |ssize_t dev_tty (pid_t pid, dev_t device, int rw, off_t offset,<br />

40017 | void *buffer, size_t size, int *eof);<br />

40018 |ssize_t dev_dsk (pid_t pid, dev_t device, int rw, off_t offset,<br />

40019 | void *buffer, size_t size, int *eof);<br />

40020 |ssize_t dev_kmem (pid_t pid, dev_t device, int rw, off_t offset,<br />

40021 | void *buffer, size_t size, int *eof);<br />

40022 |//----------------------------------------------------------------------<br />

40023 |<br />

40024 |#endif<br />

104.2.1 kernel/devices/dev_dsk.c<br />

Si veda la sezione 103.1.2.<br />

50001 |#include <br />

50002 |#include <br />

50003 |#include <br />

50004 |#include <br />

50005 |#include <br />

50006 |#include <br />

50007 |#include <br />

50008 |#include <br />

50009 |#include <br />

50010 |#include <br />

50011 |#include <br />

50012 |#include <br />

50013 |//----------------------------------------------------------------------<br />

50014 |ssize_t<br />

50015 |dev_dsk (pid_t pid, dev_t device, int rw, off_t offset, void *buffer,<br />

50016 | size_t size, int *eof)<br />

50017 |{<br />

50018 | ssize_t n;<br />

50019 | int dev_minor = minor (device);<br />

50020 |<br />

50021 | if (rw == DEV_READ)<br />

50022 | {<br />

50023 | n = dsk_read_bytes (dev_minor, offset, buffer, size);<br />

50024 | }<br />

50025 | else<br />

50026 | {<br />

50027 | n = dsk_write_bytes (dev_minor, offset, buffer, size);<br />

50028 | }<br />

50029 | return (n);<br />

50030 |}<br />

«<br />

«

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

Saved successfully!

Ooh no, something went wrong!