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 />
«