/tmp/sos-code-article7.5/bootstrap/multiboot.h (2005-04-27 20:17:12.000000000 +0200 )
../sos-code-article7.5/bootstrap/multiboot.h (2005-06-06 20:47:18.000000000 +0200 )
Line 47 
Line 47 
  
 #include <sos/types.h> #include <sos/types.h>
  
  
 /* The address of the stack of the bootstrap thread */ /* The address of the stack of the bootstrap thread */
 extern sos_vaddr_t bootstrap_stack_bottom; extern sos_vaddr_t bootstrap_stack_bottom;
 extern sos_size_t bootstrap_stack_size; extern sos_size_t bootstrap_stack_size;
  
  
 /* Types.  */ /* Types.  */
  
 /* The Multiboot header.  */ /* The Multiboot header.  */
  
 

/tmp/sos-code-article7.5/drivers/zero.c (2005-04-27 20:17:13.000000000 +0200 )
../sos-code-article7.5/drivers/zero.c (2005-06-06 20:47:20.000000000 +0200 )
Line 109 
Line 109 
   zero_resource   zero_resource
     = (struct zero_mapped_resource*)     = (struct zero_mapped_resource*)
     sos_umem_vmm_get_mapped_resource_of_vr(vr)->custom_data;     sos_umem_vmm_get_mapped_resource_of_vr(vr)->custom_data;
    
   SOS_ASSERT_FATAL(zero_resource->ref_cnt > 0);   SOS_ASSERT_FATAL(zero_resource->ref_cnt > 0);
   zero_resource->ref_cnt --;   zero_resource->ref_cnt --;
Line 121 
Line 121 
       struct zero_mapped_page *zmp;       struct zero_mapped_page *zmp;
       list_collapse(zero_resource->list_mapped_pages, zmp)       list_collapse(zero_resource->list_mapped_pages, zmp)
         {         {
           /* No need to free the underlying physical pages, since they           /* Unreference the underlying physical page */
              should have been unmapped just before this unref is           sos_physmem_unref_physpage(zmp->ppage_paddr);
              called */ 
         }         }
  
Line 169 
Line 168 
                                   SOS_PAGE_ALIGN_INF(uaddr),                                   SOS_PAGE_ALIGN_INF(uaddr),
                                   TRUE,                                   TRUE,
                                   vr_prot);                                   vr_prot);
  
           return retval;           return retval;
         }         }
     }     }
Line 182 
Line 182 
       ppage_paddr = sos_physmem_ref_physpage_new(FALSE);       ppage_paddr = sos_physmem_ref_physpage_new(FALSE);
       if (! ppage_paddr)       if (! ppage_paddr)
         return -SOS_ENOMEM;         return -SOS_ENOMEM;
        
                               SOS_PAGE_ALIGN_INF(uaddr),                               SOS_PAGE_ALIGN_INF(uaddr),
                               TRUE,                               TRUE,
Line 286 
Line 286 
   zmp->ppage_paddr = ppage_paddr;   zmp->ppage_paddr = ppage_paddr;
  
   list_add_head(mr->list_mapped_pages, zmp);   list_add_head(mr->list_mapped_pages, zmp);
    sos_physmem_ref_physpage_at(ppage_paddr);
   return SOS_OK;   return SOS_OK;
 } }
  
  
 

/tmp/sos-code-article7.5/extra/bootsect.S (2005-04-27 20:17:13.000000000 +0200 )
../sos-code-article7.5/extra/bootsect.S (2005-06-06 20:47:22.000000000 +0200 )
Line 1 
Line 1 
  
 /* /*
  * @(#) $Id: bootsect.S,v 1.8 2004/11/20 16:00:11 d2 Exp $  * @(#) $Id: bootsect.S,v 1.11 2005/04/28 21:55:35 d2 Exp $
  * Auteurs : Thomas Petazzoni & Fabrice Gautier & Emmanuel Marty  * Auteurs : Thomas Petazzoni & Fabrice Gautier & Emmanuel Marty
  *           Jerome Petazzoni & Bernard Cassagne & coffeeman  *           Jerome Petazzoni & Bernard Cassagne & coffeeman
  *           David Decotigny  *           David Decotigny (SOS integration for kernel size detection)
   *           Christopher Goyet (RAM size determination through BIOS int 15H)
  */  */
  
Line 37 
Line 38 
   *   valide   *   valide
   * - Le bootsect verifie que le processeur est du type 386+   * - Le bootsect verifie que le processeur est du type 386+
   * - Il charge le noyau depuis la disquette en memoire a partir de   * - Il charge le noyau depuis la disquette en memoire a partir de
   *   0x1000 (LOAD_ADRESS). Le noyau peut au max tenir sur   *   0x1000 (LOAD_ADRESS). La place dispo est donc 0x9f000 - 0x1000 , soit
   *   SECTORS_TO_LOAD secteurs   *   0x9E000, soit encore 1264 secteurs de 512 octets
   * - Il recopie le noyau (situe en LOAD_ADRESS) vers son adresse   * - Il recopie le noyau (situe en LOAD_ADRESS) vers son adresse
   *   finale (FINAL_ADDRESS = 2Mo). La recopie se fait sur tout l'espace   *   finale (FINAL_ADDRESS = 2Mo). La recopie se fait sur tout l'espace
Line 67 
Line 68 
         /* Pour que gas genere du 16bits, afin que ca marche en realm */         /* Pour que gas genere du 16bits, afin que ca marche en realm */
         .code16         .code16
  
 #define SECTORS_TO_LOAD 128 /* 64 ko */ /* MAX=1264 */ 
  
  * Parametres de la disquette. Comme c'est chiant de faire une  * Parametres de la disquette. Comme c'est chiant de faire une
  * procedure de detection auto, et que ca prend de la place, on fait  * procedure de detection auto, et que ca prend de la place, on fait
Line 88 
Line 87 
                                           copier le bootsecteur */                                           copier le bootsecteur */
 #define LOAD_ADRESS 0x01000            /* 1er chargement du systeme */ #define LOAD_ADRESS 0x01000            /* 1er chargement du systeme */
 #define LOAD_SEG (LOAD_ADRESS>>4)      /* Segment du 1er chargement du */ #define LOAD_SEG (LOAD_ADRESS>>4)      /* Segment du 1er chargement du */
 #define MAX_KERN_LEN COPY_ADRESS-LOAD_ADRESS /* Taille noyau maxi */ #define MAX_KERN_LEN (COPY_ADRESS-LOAD_ADRESS) /* Taille noyau maxi */
  #define MAX_KERN_SECTS ((MAX_KERN_LEN + 511) / 512) /* Nbre de secteurs maxi */
 /* IMPORTANT : Cette valeur DOIT etre identique a l'adresse presente /* IMPORTANT : Cette valeur DOIT etre identique a l'adresse presente
                dans sos.lds ! */                dans sos.lds ! */
Line 150 
Line 150 
         /* Efface l'ecran */         /* Efface l'ecran */
         movb $0x0, %ah         movb $0x0, %ah
         movb $0x3, %al         movb $0x3, %al
         int         $0x10         int  $0x10
  
          /* Verifie que le noyau n'est pas trop gros a charger */
          cmpw $MAX_KERN_SECTS, (load_size)
          jb sizeOk
          movw $toobig, %si
          call message
          call halt
  
  sizeOk: 
          /* Recupere la taille de la RAM */
          mov $0xE801, %ax
          int $0x15
          movw %ax, (memsize1)
          movw %bx, (memsize2)
         /* Affiche les messages d'attente */         /* Affiche les messages d'attente */
         movw $loadkern, %si         movw $loadkern, %si
Line 313 
Line 327 
         movl %eax, %ss         movl %eax, %ss
         movl $(stack + BOOT_STACK_SIZE), %ebp         movl $(stack + BOOT_STACK_SIZE), %ebp
         movl %ebp, %esp         movl %ebp, %esp
  
  /* passe les arguments a sos */                                       
          xor %eax, %eax
          xor %ebx, %ebx
          movw (COPY_ADRESS+(memsize2)), %ax /*eax = num de block de 64KB apres 16MB*/
          movw (COPY_ADRESS+(memsize1)), %bx /*ebx = num de block de 1KB entre 1MB et 16MB*/
          movl $0x40, %ecx /*ecx=64 */
          mul %ecx
          add %ebx, %eax
          pushl %eax  /* valeur de addr */
          pushl $0x42244224 /* valeur de magic pour indiquer qu'on a pousse
                               la taille de la RAM sur la pile */
          pushl $0 /* normalement call fait un push eip, mais la on a un jmp*/
                  
         /* Saut vers le noyau. La GDT est en place (flat mode), les         /* Saut vers le noyau. La GDT est en place (flat mode), les
          * selecteurs aussi, a20 est ouverte, et les interruptions sont          * selecteurs aussi, a20 est ouverte, et les interruptions sont
Line 373 
Line 400 
  
      /* quelques messages */      /* quelques messages */
  
 loadkern:  .string      "-= S O S =- : The Simple Operating System \r\n" loadkern:  .string      "This is SOS\r\n"
 check:     .string      "Checking for a 386+ processor... " toobig:    .string        "Image too big\r\n"
  check:     .string      "Checking 386+ processor... "
 need386:   .string      " [FAILED]\r\n" need386:   .string      " [FAILED]\r\n"
 diskerror: .string      "Disk Error\r\n" diskerror: .string      "Disk Error\r\n"
 loading:   .string      "Loading... " loading:   .string      "Loading... "
 haltmsg:   .string      "System Halted\r\n" haltmsg:   .string      "System Halted\r\n"
  
       /* Variables pour stocker la taille de la RAM (int 0x15) */
  memsize1:  .long        0
  memsize2:  .long        0
  
 /*** Les code/données du boot secteur se terminent ICI. le marqueur de /*** Les code/données du boot secteur se terminent ICI. le marqueur de
  * fin (aa55) est ajouté automatiquement par le script ld  * fin (aa55) est ajouté automatiquement par le script ld
  * sos_bsect.lds ***/  * sos_bsect.lds ***/
  
 

/tmp/sos-code-article7.5/extra/Makefile (2005-04-27 20:17:13.000000000 +0200 )
../sos-code-article7.5/extra/Makefile (2005-06-06 20:47:21.000000000 +0200 )
Line 1 
Line 1 
 OBJCOPY=objcopy OBJCOPY=objcopy
  LIBGCC := $(shell $(CC) -print-libgcc-file-name) # To benefit from FP/64bits artihm.
  EXTRA := $(shell [ -f ../userland/userprogs.kimg ] && echo ../userland/userprogs.kimg)
  
 all: sos_qemu.img all: sos_qemu.img
  
Line 31 
Line 33 
 # above) because they share some symbol definitions # above) because they share some symbol definitions
 sos_bsect.elf: bootsect.o compile_kernel sos_bsect.elf: bootsect.o compile_kernel
         $(LD) --warn-common -T ./sos_bsect.lds -o $@ \         $(LD) --warn-common -T ./sos_bsect.lds -o $@ \
                 bootsect.o $(wildcard ../hwcore/*.o ../drivers/*.o ../sos/*.o)                 bootsect.o $(wildcard ../hwcore/*.o ../drivers/*.o ../sos/*.o)\
                  $(EXTRA) $(LIBGCC)
 compile_kernel: compile_kernel:
         $(MAKE) -C ..         $(MAKE) -C ..
  
 

/tmp/sos-code-article7.5/extra/README (2005-04-27 20:17:13.000000000 +0200 )
../sos-code-article7.5/extra/README (2005-06-06 20:47:22.000000000 +0200 )
Line 65 
Line 65 
  - for cross-architecture compilation: see above  - for cross-architecture compilation: see above
  - cd to this extra/ directory  - cd to this extra/ directory
  - run 'make'  - run 'make'
  - the floppy image is: sos_bsect.img  - the floppy image is: sos_bsect.img for use with bochs or on a real
  NOTE : SOS will not boot correctly this way after article 2 !    floppy disk
     to use the image under qemu: use sos_qemu.img
  
   NOTE : From article 2 onward, be warned that using this bootsect
          might lead to system crashes. This would be because the
          solution we use to retrieve the RAM size might not work
          properly on some systems (BIOS buggy or more than 1G RAM). THE
          best way to boot SOS is always to use Grub.
  
 -- --
  
 

/tmp/sos-code-article7.5/extra/sos_bsect.lds (2005-04-27 20:17:14.000000000 +0200 )
../sos-code-article7.5/extra/sos_bsect.lds (2005-06-06 20:47:24.000000000 +0200 )
Line 37 
Line 37 
       /* The load_size symbol contains the size of the area (in       /* The load_size symbol contains the size of the area (in
        * sectors, aka 512 Bytes) that the boot sector should copy from        * sectors, aka 512 Bytes) that the boot sector should copy from
        * the disk. The bss section is not included since it uses 0        * the disk. The bss section is not included since it uses 0
        * bytes on disk */        * bytes on disk. This variable is short (16b) because it is used
         * by the bootsector in real mode, and this is enough because
         * our boot sector cannot transfer more than 1264 sectors (see
         * bootsector sources) */
       LONG((__e_load - __b_load + 511) >> 9);       SHORT((__e_load - __b_load + 511) >> 9);
  
       /* At offsets 511 and 512, we set the boot sector signature (AA55h) */       /* At offsets 511 and 512, we set the boot sector signature (AA55h) */
  
 

/tmp/sos-code-article7.5/hwcore/i8254.h (2005-04-27 20:17:15.000000000 +0200 )
../sos-code-article7.5/hwcore/i8254.h (2005-06-06 20:47:28.000000000 +0200 )
Line 15 
Line 15 
    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
    USA.     USA. 
 */ */
 #ifndef _SOS_i8259_H_ #ifndef _SOS_i8254_H_
 #define _SOS_i8259_H_ #define _SOS_i8254_H_
 #include <sos/errno.h> #include <sos/errno.h>
  
Line 32 
Line 32 
 /** Change timer interrupt (IRQ 0) frequency */ /** Change timer interrupt (IRQ 0) frequency */
 sos_ret_t sos_i8254_set_frequency(unsigned int freq); sos_ret_t sos_i8254_set_frequency(unsigned int freq);
  
 #endif /* _SOS_i8259_H_ */ #endif /* _SOS_i8254_H_ */
 

/tmp/sos-code-article7.5/hwcore/ioports.h (2005-04-27 20:17:15.000000000 +0200 )
../sos-code-article7.5/hwcore/ioports.h (2005-06-06 20:47:29.000000000 +0200 )
Line 43 
Line 43 
   _v;                                                           \   _v;                                                           \
 }) })
  
  // write value (word) on port
  #define outw(value, port)                                       \
    __asm__ volatile (                                                   \
          "outw %w0,%w1"                                                \
          ::"a" (value),"Nd" (port)                                \
          )                                                        \
  
  // read one word from port
  #define inw(port)                                               \
  ({                                                              \
    unsigned int _v;                                              \
    __asm__ volatile (                                            \
          "inw %w1,%w0"                                                \
          :"=a" (_v)                                                \
          :"Nd" (port)                                                \
          );                                                        \
    _v;                                                           \
  })
  
 #endif /* _SOS_IOPORTS_H_ */ #endif /* _SOS_IOPORTS_H_ */
  
 

/tmp/sos-code-article7.5/hwcore/mm_context.c (2005-04-27 20:17:15.000000000 +0200 )
../sos-code-article7.5/hwcore/mm_context.c (2005-06-06 20:47:32.000000000 +0200 )
Line 152 
Line 152 
   mmctxt->paddr_PD = sos_paging_get_paddr(mmctxt->vaddr_PD);   mmctxt->paddr_PD = sos_paging_get_paddr(mmctxt->vaddr_PD);
   if (mmctxt->paddr_PD == 0)   if (mmctxt->paddr_PD == 0)
     {     {
        sos_kmem_cache_free((sos_vaddr_t) mmctxt->vaddr_PD);
       sos_kmem_cache_free((sos_vaddr_t) mmctxt);       sos_kmem_cache_free((sos_vaddr_t) mmctxt);
       return NULL;       return NULL;
     }     }
Line 160 
Line 161 
   if (SOS_OK != sos_paging_copy_kernel_space(mmctxt->vaddr_PD,   if (SOS_OK != sos_paging_copy_kernel_space(mmctxt->vaddr_PD,
                                              current_mm_context->vaddr_PD))                                              current_mm_context->vaddr_PD))
     {     {
        sos_kmem_cache_free((sos_vaddr_t) mmctxt->vaddr_PD);
       sos_kmem_cache_free((sos_vaddr_t) mmctxt);       sos_kmem_cache_free((sos_vaddr_t) mmctxt);
       return NULL;       return NULL;
     }     }
  
 

/tmp/sos-code-article7.5/hwcore/swintr.h (2005-04-27 20:17:16.000000000 +0200 )
../sos-code-article7.5/hwcore/swintr.h (2005-06-06 20:47:33.000000000 +0200 )
Line 31 
Line 31 
  */  */
 #define SOS_SWINTR_SOS_SYSCALL  0x42 #define SOS_SWINTR_SOS_SYSCALL  0x42
  
  
  
 #include <hwcore/cpu_context.h> #include <hwcore/cpu_context.h>
  
 

/tmp/sos-code-article7.5/INSTALL (2005-04-27 20:17:12.000000000 +0200 )
../sos-code-article7.5/INSTALL (2005-06-06 20:47:17.000000000 +0200 )
Line 64 
Line 64 
       copy the file 'fd.img' to a floppy, and boot from it       copy the file 'fd.img' to a floppy, and boot from it
  
  2nd method  2nd method
    => see extra/README to compile with the boot sector we provide (up to    => see extra/README to compile with the boot sector we provide,
       article 2 only), copy the file 'extra/sos_bsect.img' to a floppy,       copy the file 'extra/sos_bsect.img' to a floppy, and boot from
       and boot from it       it
  
 Inside a PC emulator (x86 and non-x86 hosts) Inside a PC emulator (x86 and non-x86 hosts)
Line 78 
Line 78 
 installed: 'apt-get install libsdl1.2-dev' on debian installed: 'apt-get install libsdl1.2-dev' on debian
 testing/unstable). testing/unstable).
  
  
  1/ Grub is installed on the host (x86 hosts only)  1/ Grub is installed on the host (x86 hosts only)
  - - - - - - - - - - - - - - - - - - - - - - - - -  - - - - - - - - - - - - - - - - - - - - - - - - -
  
Line 90 
Line 91 
    qemu: run 'qemu -fda fd.img'    qemu: run 'qemu -fda fd.img'
      If grub hangs while loading the kernel, please go to method 2/      If grub hangs while loading the kernel, please go to method 2/
  
  
  2/ Grub is not installed (all hosts)  2/ Grub is not installed (all hosts)
  - - - - - - - - - - - - - - - - - -  - - - - - - - - - - - - - - - - - -
  
Line 100 
Line 102 
  
    qemu: run 'qemu -fda fd.img'    qemu: run 'qemu -fda fd.img'
  
  3/ Bonus: boot with the bootsector we provide (all hosts, up to art. 2 ONLY !) 
  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  3/ Bonus: boot with the bootsector we provide (all hosts)
   - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
   See extra/README to generate a floppy image with the boot sector we   See extra/README to generate a floppy image with the boot sector we
   provide, and:   provide, and:
Line 110 
Line 113 
  
    qemu: run 'qemu -fda extra/sos_qemu.img'    qemu: run 'qemu -fda extra/sos_qemu.img'
  
   NOTE: After article 2, this way of booting is not supported: please   NOTE: This technique assumes that INT 15H is supported by the
   use the method 2/ above.   machine's BIOS. This should be OK for the vast majority of targets
    (bochs, qemu, recent machines), but we do not guarantee it. In case
    of doubt, please use Grub.
  
 NOTE : recommended versions of the tools NOTE : recommended versions of the tools
 ---------------------------------------- ----------------------------------------
  - OS           : Linux 2.6.11.7-d2-1 i686  - OS           : Linux 2.6.11.7 i686
  - gcc          : gcc (GCC) 3.3.5 (Debian 1:3.3.5-8)  - gcc          : gcc (GCC) 3.3.5 (Debian 1:3.3.5-12)
  - GNU make     : GNU Make 3.80  - GNU make     : GNU Make 3.80
  
  
 

/tmp/sos-code-article7.5/Makefile (2005-04-27 20:17:12.000000000 +0200 )
../sos-code-article7.5/Makefile (2005-06-06 20:47:16.000000000 +0200 )
Line 17 
Line 17 
  
 CC=gcc CC=gcc
 LD=ld LD=ld
  CP=cp
  STRIP=strip
 CFLAGS  = -Wall -nostdinc -ffreestanding -DKERNEL_SOS CFLAGS  = -Wall -nostdinc -ffreestanding -DKERNEL_SOS
 LIBGCC := $(shell $(CC) -print-libgcc-file-name) # To benefit from FP/64bits artihm. LIBGCC  = $(shell $(CC) -print-libgcc-file-name) # To benefit from FP/64bits artihm.
 OBJECTS = bootstrap/multiboot.o                                 \ OBJECTS = bootstrap/multiboot.o                                 \
           hwcore/idt.o hwcore/gdt.o                             \           hwcore/idt.o hwcore/gdt.o                             \
           hwcore/swintr.o hwcore/swintr_wrappers.o                \           hwcore/swintr.o hwcore/swintr_wrappers.o                \
           hwcore/exception.o hwcore/exception_wrappers.o        \           hwcore/exception.o hwcore/exception_wrappers.o        \
           hwcore/irq.o hwcore/irq_wrappers.o hwcore/i8259.o        \           hwcore/irq.o hwcore/irq_wrappers.o hwcore/i8259.o        \
           hwcore/paging.o                                        \           hwcore/paging.o                                         \
           hwcore/cpu_context.o hwcore/cpu_context_switch.o        \           hwcore/cpu_context.o hwcore/cpu_context_switch.o        \
           hwcore/mm_context.o                                        \           hwcore/mm_context.o                                        \
Line 41 
Line 43 
           userland/userprogs.kimg           userland/userprogs.kimg
  
 KERNEL_OBJ   = sos.elf KERNEL_OBJ   = sos.elf
  KERNEL_LOAD  = sos.gz
 MULTIBOOT_IMAGE = fd.img MULTIBOOT_IMAGE = fd.img
 PWD := $(shell pwd) PWD := $(shell pwd)
  
 # Main target # Main target
 all: $(MULTIBOOT_IMAGE) all: $(MULTIBOOT_IMAGE)
  
 $(MULTIBOOT_IMAGE): $(KERNEL_OBJ) $(MULTIBOOT_IMAGE): $(KERNEL_LOAD)
  
  $(KERNEL_LOAD): $(KERNEL_OBJ)
          $(CP) $< $<.strip && $(STRIP) -sx $<.strip
          gzip < $<.strip > $@
  
 $(KERNEL_OBJ): $(OBJECTS) ./support/sos.lds $(KERNEL_OBJ): $(OBJECTS) ./support/sos.lds
         $(LD) $(LDFLAGS) -T ./support/sos.lds -o $@ $(OBJECTS) $(LIBGCC)         $(LD) $(LDFLAGS) -T ./support/sos.lds -o $@ $(OBJECTS) $(LIBGCC)
         -nm -C $@ | cut -d ' ' -f 1,3 > sos.map         -nm -C $@ | cut -d ' ' -f 1,3 > sos.map
Line 74 
Line 81 
  
 # Clean directory # Clean directory
 clean: clean:
         $(RM) *.img *.o mtoolsrc *~ menu.txt *.img *.elf *.bin *.map         $(RM) *.img *.o mtoolsrc *~ menu.txt *.img *.elf *.bin *.strip *.map
         $(RM) *.log *.out bochs*         $(RM) *.log *.out bochs* sos.gz
         $(RM) drivers/*.o drivers/*~         $(RM) drivers/*.o drivers/*~
         $(RM) hwcore/*.o hwcore/*~         $(RM) hwcore/*.o hwcore/*~
  
 

/tmp/sos-code-article7.5/README (2005-04-27 20:17:12.000000000 +0200 )
../sos-code-article7.5/README (2005-06-06 20:47:18.000000000 +0200 )
Line 33 
Line 33 
    i586-gnu) is available. Can be tested on real i486/pentium    i586-gnu) is available. Can be tested on real i486/pentium
    hardware, or on any host that can run an i486/pentium PC emulator    hardware, or on any host that can run an i486/pentium PC emulator
    (bochs or qemu)    (bochs or qemu)
  - kernel loaded by grub, or by a sample bootsector (up to article 2  - kernel loaded by grub or by a sample bootsector
    ONLY) 
    even inside the kernel: no identity-mapping of the physical memory    even inside the kernel: no identity-mapping of the physical memory
    inside the kernel (allows to move virtual mappings of kernel pages    inside the kernel (allows to move virtual mappings of kernel pages
Line 54 
Line 53 
    'all' and 'clean'    'all' and 'clean'
  - bootstrap/ directory: code to load the kernel. Both the stuff  - bootstrap/ directory: code to load the kernel. Both the stuff
    needed for a multiboot-compliant loader (eg grub) AND a bootsector    needed for a multiboot-compliant loader (eg grub) AND a bootsector
    are provided. The bootsector may only be used up to article 2.    are provided.
    systemwide header files, a set of common useful C routines    systemwide header files, a set of common useful C routines
    ("nano-klibc"), and kernel subsystems (kernel memory management,    ("nano-klibc"), and kernel subsystems (kernel memory management,
  
 

/tmp/sos-code-article7.5/sos/errno.h (2005-04-27 20:17:16.000000000 +0200 )
../sos-code-article7.5/sos/errno.h (2005-06-06 20:47:34.000000000 +0200 )
Line 25 
Line 25 
  */  */
  
 /* Positive values of the error codes */ /* Positive values of the error codes */
 #define SOS_OK     0   /* No error */ #define SOS_OK            0   /* No error */
 #define SOS_EINVAL 1   /* Invalid argument */ #define SOS_EINVAL        1   /* Invalid argument */
 #define SOS_ENOSUP 2   /* Operation not supported */ #define SOS_ENOSUP        2   /* Operation not supported */
 #define SOS_ENOMEM 3   /* No available memory */ #define SOS_ENOMEM        3   /* No available memory */
 #define SOS_EBUSY  4   /* Object or device still in use */ #define SOS_EBUSY         4   /* Object or device still in use */
 #define SOS_EINTR  5   /* Wait/Sleep has been interrupted */ #define SOS_EINTR         5   /* Wait/Sleep has been interrupted */
 #define SOS_EPERM  6   /* Mutex/files ownership error */ #define SOS_EPERM         6   /* Mutex/files ownership error */
 #define SOS_EFAULT 7   /* Unresolved virtual memory fault */ #define SOS_EFAULT        7   /* Unresolved virtual memory fault */
 #define SOS_ENOENT 8   /* No such file or directory */ #define SOS_ENOENT        8   /* No such file or directory */
 #define SOS_EFATAL 255 /* Internal fatal error */ #define SOS_EFATAL      255 /* Internal fatal error */
 /* A negative value means that an error occured.  For /* A negative value means that an error occured.  For
  *  example -SOS_EINVAL means that the error was "invalid  *  example -SOS_EINVAL means that the error was "invalid
  
 

/tmp/sos-code-article7.5/sos/main.c (2005-04-27 20:17:17.000000000 +0200 )
../sos-code-article7.5/sos/main.c (2005-06-06 20:47:35.000000000 +0200 )
Line 16 
Line 16 
    USA.     USA. 
 */ */
  
  #include <sos/errno.h>
  
 /* Include definitions of the multiboot standard */ /* Include definitions of the multiboot standard */
 #include <bootstrap/multiboot.h> #include <bootstrap/multiboot.h>
 #include <hwcore/idt.h> #include <hwcore/idt.h>
Line 64 
Line 66 
     }     }
 } }
  
  
 static void clk_it(int intid) static void clk_it(int intid)
 { {
Line 290 
Line 291 
       sos_process_unref(proc_init);       sos_process_unref(proc_init);
       return -SOS_ENOENT;       return -SOS_ENOENT;
     }     }
       
   ustack = (SOS_PAGING_TOP_USER_ADDRESS - SOS_DEFAULT_USER_STACK_SIZE) + 1;   ustack = (SOS_PAGING_TOP_USER_ADDRESS - SOS_DEFAULT_USER_STACK_SIZE) + 1;
   retval = sos_dev_zero_map(as_init, &ustack, SOS_DEFAULT_USER_STACK_SIZE,   retval = sos_dev_zero_map(as_init, &ustack, SOS_DEFAULT_USER_STACK_SIZE,
Line 298 
Line 299 
                             /* PRIVATE */ 0);                             /* PRIVATE */ 0);
   if (SOS_OK != retval)   if (SOS_OK != retval)
     {     {
       sos_bochs_printf("ici 2\n"); 
       return -SOS_ENOMEM;       return -SOS_ENOMEM;
     }     }
Line 312 
Line 312 
                                    SOS_SCHED_PRIO_TS_LOWEST);                                    SOS_SCHED_PRIO_TS_LOWEST);
   if (! new_thr)   if (! new_thr)
     {     {
       sos_bochs_printf("ici 3\n"); 
       return -SOS_ENOMEM;       return -SOS_ENOMEM;
     }     }
Line 325 
Line 324 
 /* ====================================================================== /* ======================================================================
  * The C entry point of our operating system  * The C entry point of our operating system
  */  */
 void sos_main(unsigned long magic, unsigned long addr) void sos_main(unsigned long magic, unsigned long arg)
   unsigned i;   unsigned i;
   sos_paddr_t sos_kernel_core_base_paddr, sos_kernel_core_top_paddr;   sos_paddr_t sos_kernel_core_base_paddr, sos_kernel_core_top_paddr;
   struct sos_time tick_resolution;   struct sos_time tick_resolution;
  
   /* Grub sends us a structure, called multiboot_info_t with a lot of   /* Size of RAM above 1MB. Might be undefined ! */
      precious informations about the system, see the multiboot   unsigned long int upper_mem = 0;
      documentation for more information. */ 
   multiboot_info_t *mbi; 
   mbi = (multiboot_info_t *) addr; 
   /* Setup bochs and console, and clear the console */   /* Setup bochs and console, and clear the console */
   sos_bochs_setup();   sos_bochs_setup();
Line 345 
Line 341 
  
   /* Greetings from SOS */   /* Greetings from SOS */
   if (magic == MULTIBOOT_BOOTLOADER_MAGIC)   if (magic == MULTIBOOT_BOOTLOADER_MAGIC)
     /* Loaded with Grub */     {
     sos_x86_videomem_printf(1, 0,       /* Grub sends us a structure, called multiboot_info_t with a lot of
                             SOS_X86_VIDEO_FG_YELLOW | SOS_X86_VIDEO_BG_BLUE,          precious informations about the system, see the multiboot
                             "Welcome From GRUB to %s%c RAM is %dMB (upper mem = 0x%x kB)",          documentation for more information. */
                             "SOS article 7.5", ',',       multiboot_info_t *mbi = (multiboot_info_t *) arg;
                             (unsigned)(mbi->mem_upper >> 10) + 1, 
                             (unsigned)mbi->mem_upper);       /* Multiboot says: "The value returned for upper memory is
           maximally the address of the first upper memory hole minus 1
           megabyte.". It also adds: "It is not guaranteed to be this
           value." aka "YMMV" ;) */
        upper_mem = mbi->mem_upper;
        sos_x86_videomem_printf(1, 0,
                                SOS_X86_VIDEO_FG_YELLOW | SOS_X86_VIDEO_BG_BLUE,
                                "Welcome From GRUB to %s%c RAM is %dMB (upper mem = 0x%x kB)",
                                "SOS article 7.5", ',',
                                (unsigned)(upper_mem >> 10) + 1,
                                (unsigned)upper_mem);
      }
    else if (magic == 0x42244224)
      {
        /* Loaded with SOS bootsect */
        upper_mem = arg;
        sos_x86_videomem_printf(1, 0,
                                SOS_X86_VIDEO_FG_YELLOW | SOS_X86_VIDEO_BG_BLUE,
                                "Welcome to %s%c RAM is %dMB (upper mem = 0x%x kB)",
                                "SOS article 7.5", ',',
                                (unsigned)(upper_mem >> 10) + 1,
                                (unsigned)upper_mem);
      }
     /* Not loaded with grub */     /* Not loaded with grub, not from an enhanced bootsect */
                             SOS_X86_VIDEO_FG_YELLOW | SOS_X86_VIDEO_BG_BLUE,                             SOS_X86_VIDEO_FG_YELLOW | SOS_X86_VIDEO_BG_BLUE,
                             "Welcome to SOS article 7.5");                             "Welcome to SOS article 7.5");
Line 376 
Line 394 
   tick_resolution = (struct sos_time) { .sec=0, .nanosec=10000000UL };   tick_resolution = (struct sos_time) { .sec=0, .nanosec=10000000UL };
   sos_time_subsysem_setup(& tick_resolution);   sos_time_subsysem_setup(& tick_resolution);
  
   /* We need a multiboot-compliant boot loader to get the size of the RAM */   /* We need to know the RAM size */
   if (magic != MULTIBOOT_BOOTLOADER_MAGIC)   if (upper_mem == 0)
       sos_x86_videomem_putstring(20, 0,       sos_x86_videomem_putstring(20, 0,
                                  SOS_X86_VIDEO_FG_LTRED                                  SOS_X86_VIDEO_FG_LTRED
                                    | SOS_X86_VIDEO_BG_BLUE                                    | SOS_X86_VIDEO_BG_BLUE
                                    | SOS_X86_VIDEO_FG_BLINKING,                                    | SOS_X86_VIDEO_FG_BLINKING,
                                  "I'm not loaded with Grub !");                                  "I don't know RAM size ! Load me with Grub...");
       for (;;)       for (;;)
         continue;         continue;
Line 401 
Line 419 
    * Setup physical memory management    * Setup physical memory management
    */    */
  
   /* Multiboot says: "The value returned for upper memory is maximally   SOS_ASSERT_FATAL(SOS_OK
      the address of the first upper memory hole minus 1 megabyte.". It                    == sos_physmem_subsystem_setup((upper_mem<<10) + (1<<20),
      also adds: "It is not guaranteed to be this value." aka "YMMV" ;) */                                                   &sos_kernel_core_base_paddr,
   sos_physmem_subsystem_setup((mbi->mem_upper<<10) + (1<<20),                                                   &sos_kernel_core_top_paddr));
                               & sos_kernel_core_base_paddr, 
                               & sos_kernel_core_top_paddr); 
   /*   /*
    * Switch to paged-memory mode    * Switch to paged-memory mode
Line 492 
Line 508 
      interrupt call the scheduler */      interrupt call the scheduler */
   asm volatile ("sti\n");   asm volatile ("sti\n");
  
  
   /* Start the 'init' process, which in turns launches the other   /* Start the 'init' process, which in turns launches the other
      programs */      programs */
   start_init();   start_init();
  
    * We can safely exit from this function now, for there is already    * We can safely exit from this function now, for there is already
    * an idle Kernel thread ready to make the CPU busy working...    * an idle Kernel thread ready to make the CPU busy working...
  
 

/tmp/sos-code-article7.5/sos/process.c (2005-04-27 20:17:18.000000000 +0200 )
../sos-code-article7.5/sos/process.c (2005-06-06 20:47:40.000000000 +0200 )
Line 26 
Line 26 
  
 #include "process.h" #include "process.h"
  
  #define SOS_PROCESS_MAX_NAMELEN       32
 #define SOS_PROCESS_MAX_NAMELEN 32 
  
 /** /**
  
 

/tmp/sos-code-article7.5/sos/process.h (2005-04-27 20:17:18.000000000 +0200 )
../sos-code-article7.5/sos/process.h (2005-06-06 20:47:40.000000000 +0200 )
Line 37 
Line 37 
  
 #include <sos/errno.h> #include <sos/errno.h>
  
  
  * The definition of an SOS process is opaque. @see process.c  * The definition of an SOS process is opaque. @see process.c
  */  */
  
 

/tmp/sos-code-article7.5/sos/sched.c (2005-04-27 20:17:17.000000000 +0200 )
../sos-code-article7.5/sos/sched.c (2005-06-06 20:47:38.000000000 +0200 )
Line 131 
Line 131 
     return SOS_OK;     return SOS_OK;
  
   /* Reset the CPU time used in the quantuum */   /* Reset the CPU time used in the quantuum */
   memset(& thr->running.user_time_spent_in_slice, 0x0, sizeof(struct sos_time));   memset(& thr->user_time_spent_in_slice, 0x0, sizeof(struct sos_time));
   if (SOS_SCHED_PRIO_IS_RT(sos_thread_get_priority(thr)))   if (SOS_SCHED_PRIO_IS_RT(sos_thread_get_priority(thr)))
     {     {
Line 185 
Line 185 
   /* Current (user) thread expired its time quantuum ?  A kernel   /* Current (user) thread expired its time quantuum ?  A kernel
      thread never expires because sos_sched_do_timer_tick() below      thread never expires because sos_sched_do_timer_tick() below
      won't update its user_time_spent_in_slice */      won't update its user_time_spent_in_slice */
   if (sos_time_cmp(& thr->running.user_time_spent_in_slice,   if (sos_time_cmp(& thr->user_time_spent_in_slice,
       return TRUE;       return TRUE;
  
Line 203 
Line 203 
   if (thread_expired_its_quantuum(current_thread))   if (thread_expired_its_quantuum(current_thread))
     {     {
       /* Reset the CPU time used in the quantuum */       /* Reset the CPU time used in the quantuum */
       memset(& current_thread->running.user_time_spent_in_slice,       memset(& current_thread->user_time_spent_in_slice,
  
       do_yield = TRUE;       do_yield = TRUE;
Line 290 
Line 290 
                    & tick_duration);                    & tick_duration);
  
       /* Update time spent is current timeslice ONLY for a user thread */       /* Update time spent is current timeslice ONLY for a user thread */
       sos_time_inc(& interrupted_thread->running.user_time_spent_in_slice,       sos_time_inc(& interrupted_thread->user_time_spent_in_slice,
     }     }
   else   else
  
 

/tmp/sos-code-article7.5/sos/syscall.c (2005-04-27 20:17:18.000000000 +0200 )
../sos-code-article7.5/sos/syscall.c (2005-06-06 20:47:40.000000000 +0200 )
Line 417 
Line 417 
             retval = -SOS_ENOMEM;             retval = -SOS_ENOMEM;
             break;                         break;            
           }           }
  
       }       }
       break;       break;
  
  
 

/tmp/sos-code-article7.5/sos/thread.h (2005-04-27 20:17:17.000000000 +0200 )
../sos-code-article7.5/sos/thread.h (2005-06-06 20:47:37.000000000 +0200 )
Line 136 
Line 136 
       struct sos_sched_queue *rdy_queue;       struct sos_sched_queue *rdy_queue;
       struct sos_thread     *rdy_prev, *rdy_next;       struct sos_thread     *rdy_prev, *rdy_next;
     } ready;     } ready;
  
     struct 
     { 
       struct sos_time user_time_spent_in_slice; 
     } running; 
  
    struct sos_time user_time_spent_in_slice;
  
  
   /**   /**
    * When a thread in kernel mode is accessing the user space, it may    * When a thread in kernel mode is accessing the user space, it may
  
 

/tmp/sos-code-article7.5/sos/types.h (2005-04-27 20:17:17.000000000 +0200 )
../sos-code-article7.5/sos/types.h (2005-06-06 20:47:36.000000000 +0200 )
Line 46 
Line 46 
  
 /** Generic count of objects */ /** Generic count of objects */
 typedef unsigned int           sos_count_t; typedef unsigned int           sos_count_t;
  /** Generic count of objects (LARGE) */
  typedef unsigned long long int sos_lcount_t;
  
 /* Low-level sizes */ /* Low-level sizes */
 typedef unsigned long long int sos_ui64_t; /**< 32b unsigned */ typedef unsigned long long int sos_ui64_t; /**< 32b unsigned */
  
 

/tmp/sos-code-article7.5/userland/init.c (2005-04-27 20:17:19.000000000 +0200 )
../sos-code-article7.5/userland/init.c (2005-06-06 20:47:44.000000000 +0200 )
Line 27 
Line 27 
  
 int main() int main()
 { {
  
   if (fork() == 0)   if (fork() == 0)
     exec("myprog7");     exec("myprog7");
  
 

/tmp/sos-code-article7.5/userland/Makefile (2005-04-27 20:17:19.000000000 +0200 )
../sos-code-article7.5/userland/Makefile (2005-06-06 20:47:43.000000000 +0200 )
Line 17 
Line 17 
  
 CC=gcc CC=gcc
 AR=ar AR=ar
  CP=cp
  STRIP=strip
 OBJCOPY=objcopy OBJCOPY=objcopy
 CFLAGS  = -Wall -nostdinc -ffreestanding -I. -I.. CFLAGS  = -Wall -nostdinc -ffreestanding -I. -I..
 LIBGCC := $(shell $(CC) -print-libgcc-file-name) # To benefit from FP/64bits artihm. LIBGCC  = $(shell $(CC) -print-libgcc-file-name) # To benefit from FP/64bits artihm.
  
 # Main target # Main target
Line 58 
Line 60 
            echo "  = { \"$$f\", &_begin_userprog$$i, &_end_userprog$$i };"  \            echo "  = { \"$$f\", &_begin_userprog$$i, &_end_userprog$$i };"  \
                 >> .userprog$$i.c ;                                         \                 >> .userprog$$i.c ;                                         \
            $(CC) $(CFLAGS) -c .userprog$$i.c -o .userprog$$i.o ;            \            $(CC) $(CFLAGS) -c .userprog$$i.c -o .userprog$$i.o ;            \
            $(OBJCOPY) --add-section .userprog$$i=$$f .userprog$$i.o         \            $(CP) $$f $$f.strip && $(STRIP) -sx $$f.strip ;                  \
             $(OBJCOPY) --add-section .userprog$$i=$$f.strip .userprog$$i.o   \
            echo "  . = ALIGN(4096);" >> .userprogs.lds ;                    \            echo "  . = ALIGN(4096);" >> .userprogs.lds ;                    \
            echo "  _begin_userprog$$i = .;" >> .userprogs.lds ;             \            echo "  _begin_userprog$$i = .;" >> .userprogs.lds ;             \
Line 87 
Line 90 
  
 # Clean directory # Clean directory
 clean: clean:
         $(RM) *.o *.a *~ $(PROGS) *.kimg         $(RM) *.o *.a *~ $(PROGS) *.kimg *.strip
  
 

/tmp/sos-code-article7.5/userland/myprog12.c (2005-04-27 20:17:20.000000000 +0200 )
../sos-code-article7.5/userland/myprog12.c (2005-06-06 20:47:44.000000000 +0200 )
Line 24 
Line 24 
  
  
 /** /**
  * @file myprog10.c  * @file myprog12.c
  * /dev/mem & /dev/kmem tests  * /dev/mem & /dev/kmem tests
  */  */
  
 

/tmp/sos-code-article7.5/userland/myprog9.c (2005-04-27 20:17:20.000000000 +0200 )
../sos-code-article7.5/userland/myprog9.c (2005-06-06 20:47:44.000000000 +0200 )
Line 22 
Line 22 
 #include <debug.h> #include <debug.h>
  
 /** /**
  * @file myprog7.c  * @file myprog9.c
  * mmap/munmap tests  * mmap/munmap tests
  *  *


Legend:
 
identical lines
Removed from old 
changed lines
 Added in new

File list:
    
../sos-code-article7.5/bootstrap/multiboot.h
    ../sos-code-article7.5/drivers/zero.c
    ../sos-code-article7.5/extra/bootsect.S
    ../sos-code-article7.5/extra/Makefile
    ../sos-code-article7.5/extra/README
    ../sos-code-article7.5/extra/sos_bsect.lds
    ../sos-code-article7.5/hwcore/i8254.h
    ../sos-code-article7.5/hwcore/ioports.h
    ../sos-code-article7.5/hwcore/mm_context.c
    ../sos-code-article7.5/hwcore/swintr.h
    ../sos-code-article7.5/INSTALL
    ../sos-code-article7.5/Makefile
    ../sos-code-article7.5/README
    ../sos-code-article7.5/sos/errno.h
    ../sos-code-article7.5/sos/main.c
    ../sos-code-article7.5/sos/process.c
    ../sos-code-article7.5/sos/process.h
    ../sos-code-article7.5/sos/sched.c
    ../sos-code-article7.5/sos/syscall.c
    ../sos-code-article7.5/sos/thread.h
    ../sos-code-article7.5/sos/types.h
    ../sos-code-article7.5/userland/init.c
    ../sos-code-article7.5/userland/Makefile
    ../sos-code-article7.5/userland/myprog12.c
    ../sos-code-article7.5/userland/myprog9.c