Initial import
This commit is contained in:
commit
c60f7450eb
131
INSTALL
Normal file
131
INSTALL
Normal file
@ -0,0 +1,131 @@
|
||||
|
||||
SOS: A Simple Operating System
|
||||
|
||||
Compilation/Installation/Test instructions
|
||||
|
||||
|
||||
Compilation
|
||||
===========
|
||||
|
||||
IMPORTANT
|
||||
---------
|
||||
|
||||
Don't forget to run 'make clean' before 'make' after you have modified
|
||||
any source or header file(s).
|
||||
|
||||
|
||||
On a x86 host where grub is correctly installed
|
||||
-----------------------------------------------
|
||||
|
||||
Simply run 'make'
|
||||
|
||||
|
||||
On a non-x86 host (without grub of course !)
|
||||
--------------------------------------------
|
||||
|
||||
See extra/README
|
||||
|
||||
|
||||
On an x86 host without Grub, or with a buggy Grub
|
||||
-------------------------------------------------
|
||||
|
||||
See extra/README
|
||||
|
||||
How do I know I have a buggy grub installation ? Answer: in the qemu
|
||||
PC emulator, Grub hangs while loading the kernel
|
||||
|
||||
|
||||
Installation
|
||||
============
|
||||
|
||||
Nothing special to do besides compiling
|
||||
|
||||
|
||||
Test the SOS Kernel
|
||||
===================
|
||||
|
||||
On a x86 real machine with Grub installed
|
||||
-----------------------------------------
|
||||
|
||||
1st method
|
||||
=> Boot the sos.elf file (append 'kernel=<path_to>sos.elf' in the
|
||||
menu.lst or type it on Grub's command line) from a hard disk, a
|
||||
floppy, or from the network
|
||||
|
||||
2nd method
|
||||
=> Copy the file 'fd.img' to a floppy and boot from it
|
||||
|
||||
|
||||
On a x86 real machine without Grub installed
|
||||
--------------------------------------------
|
||||
|
||||
1st method
|
||||
=> see extra/README to compile with the grub floppy image we provide,
|
||||
copy the file 'fd.img' to a floppy, and boot from it
|
||||
|
||||
2nd method
|
||||
=> see extra/README to compile with the boot sector we provide (up to
|
||||
article 2 only), copy the file 'extra/sos_bsect.img' to a floppy,
|
||||
and boot from it
|
||||
|
||||
|
||||
Inside a PC emulator (x86 and non-x86 hosts)
|
||||
--------------------------------------------
|
||||
|
||||
Tested on both the bochs emulator (x86/linux, sparc/solaris and
|
||||
ppc/linux hosts, 'apt-get install bochs-x vgabios' on debian
|
||||
testing/unstable), and the qemu system emulator (with libsdl
|
||||
installed: 'apt-get install libsdl1.2-dev' on debian
|
||||
testing/unstable).
|
||||
|
||||
1/ Grub is installed on the host (x86 hosts only)
|
||||
- - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
|
||||
bochs: boot from the file 'fd.img'. Example of a ~/.bochsrc:
|
||||
floppya: 1_44=/home/d2/sos/fd.img, status=inserted
|
||||
romimage: file=/usr/share/bochs/BIOS-bochs-latest, address=0xf0000
|
||||
vgaromimage: /usr/share/vgabios/vgabios.bin
|
||||
megs:63 # 63 Mo de RAM
|
||||
|
||||
qemu: run 'qemu -fda fd.img'
|
||||
If grub hangs while loading the kernel, please go to method 2/
|
||||
|
||||
2/ Grub is not installed (all hosts)
|
||||
- - - - - - - - - - - - - - - - - -
|
||||
|
||||
See extra/README to generate a floppy image with the Grub floppy
|
||||
image we provide, and:
|
||||
|
||||
bochs: boot from the file 'fd.img'
|
||||
|
||||
qemu: run 'qemu -fda fd.img'
|
||||
|
||||
3/ Bonus: boot with the bootsector we provide (all hosts, up to art. 2 ONLY !)
|
||||
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
|
||||
See extra/README to generate a floppy image with the boot sector we
|
||||
provide, and:
|
||||
|
||||
bochs: boot from the file 'extra/sos_bsect.img'
|
||||
|
||||
qemu: run 'qemu -fda extra/sos_qemu.img'
|
||||
|
||||
NOTE: After article 2, this way of booting is not supported: please
|
||||
use the method 2/ above.
|
||||
|
||||
|
||||
NOTE : recommended versions of the tools
|
||||
----------------------------------------
|
||||
- OS : Linux 2.6.11.7-d2-1 i686
|
||||
- gcc : gcc (GCC) 3.3.5 (Debian 1:3.3.5-8)
|
||||
- GNU binutils : GNU ld version 2.15
|
||||
- GNU make : GNU Make 3.80
|
||||
|
||||
Also tested with (on ppc/debian host):
|
||||
- OS : Linux 2.6.10-powerpc ppc
|
||||
- gcc : gcc (GCC) 3.2.2
|
||||
- GNU binutils : GNU ld version 2.13.2
|
||||
- GNU make : GNU Make 3.80
|
||||
|
||||
--
|
||||
David Decotigny
|
340
LICENSE
Normal file
340
LICENSE
Normal file
@ -0,0 +1,340 @@
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 2, June 1991
|
||||
|
||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
|
||||
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
|
||||
The licenses for most software are designed to take away your
|
||||
freedom to share and change it. By contrast, the GNU General Public
|
||||
License is intended to guarantee your freedom to share and change free
|
||||
software--to make sure the software is free for all its users. This
|
||||
General Public License applies to most of the Free Software
|
||||
Foundation's software and to any other program whose authors commit to
|
||||
using it. (Some other Free Software Foundation software is covered by
|
||||
the GNU Library General Public License instead.) You can apply it to
|
||||
your programs, too.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Our General Public Licenses are designed to make sure that you
|
||||
have the freedom to distribute copies of free software (and charge for
|
||||
this service if you wish), that you receive source code or can get it
|
||||
if you want it, that you can change the software or use pieces of it
|
||||
in new free programs; and that you know you can do these things.
|
||||
|
||||
To protect your rights, we need to make restrictions that forbid
|
||||
anyone to deny you these rights or to ask you to surrender the rights.
|
||||
These restrictions translate to certain responsibilities for you if you
|
||||
distribute copies of the software, or if you modify it.
|
||||
|
||||
For example, if you distribute copies of such a program, whether
|
||||
gratis or for a fee, you must give the recipients all the rights that
|
||||
you have. You must make sure that they, too, receive or can get the
|
||||
source code. And you must show them these terms so they know their
|
||||
rights.
|
||||
|
||||
We protect your rights with two steps: (1) copyright the software, and
|
||||
(2) offer you this license which gives you legal permission to copy,
|
||||
distribute and/or modify the software.
|
||||
|
||||
Also, for each author's protection and ours, we want to make certain
|
||||
that everyone understands that there is no warranty for this free
|
||||
software. If the software is modified by someone else and passed on, we
|
||||
want its recipients to know that what they have is not the original, so
|
||||
that any problems introduced by others will not reflect on the original
|
||||
authors' reputations.
|
||||
|
||||
Finally, any free program is threatened constantly by software
|
||||
patents. We wish to avoid the danger that redistributors of a free
|
||||
program will individually obtain patent licenses, in effect making the
|
||||
program proprietary. To prevent this, we have made it clear that any
|
||||
patent must be licensed for everyone's free use or not licensed at all.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. This License applies to any program or other work which contains
|
||||
a notice placed by the copyright holder saying it may be distributed
|
||||
under the terms of this General Public License. The "Program", below,
|
||||
refers to any such program or work, and a "work based on the Program"
|
||||
means either the Program or any derivative work under copyright law:
|
||||
that is to say, a work containing the Program or a portion of it,
|
||||
either verbatim or with modifications and/or translated into another
|
||||
language. (Hereinafter, translation is included without limitation in
|
||||
the term "modification".) Each licensee is addressed as "you".
|
||||
|
||||
Activities other than copying, distribution and modification are not
|
||||
covered by this License; they are outside its scope. The act of
|
||||
running the Program is not restricted, and the output from the Program
|
||||
is covered only if its contents constitute a work based on the
|
||||
Program (independent of having been made by running the Program).
|
||||
Whether that is true depends on what the Program does.
|
||||
|
||||
1. You may copy and distribute verbatim copies of the Program's
|
||||
source code as you receive it, in any medium, provided that you
|
||||
conspicuously and appropriately publish on each copy an appropriate
|
||||
copyright notice and disclaimer of warranty; keep intact all the
|
||||
notices that refer to this License and to the absence of any warranty;
|
||||
and give any other recipients of the Program a copy of this License
|
||||
along with the Program.
|
||||
|
||||
You may charge a fee for the physical act of transferring a copy, and
|
||||
you may at your option offer warranty protection in exchange for a fee.
|
||||
|
||||
2. You may modify your copy or copies of the Program or any portion
|
||||
of it, thus forming a work based on the Program, and copy and
|
||||
distribute such modifications or work under the terms of Section 1
|
||||
above, provided that you also meet all of these conditions:
|
||||
|
||||
a) You must cause the modified files to carry prominent notices
|
||||
stating that you changed the files and the date of any change.
|
||||
|
||||
b) You must cause any work that you distribute or publish, that in
|
||||
whole or in part contains or is derived from the Program or any
|
||||
part thereof, to be licensed as a whole at no charge to all third
|
||||
parties under the terms of this License.
|
||||
|
||||
c) If the modified program normally reads commands interactively
|
||||
when run, you must cause it, when started running for such
|
||||
interactive use in the most ordinary way, to print or display an
|
||||
announcement including an appropriate copyright notice and a
|
||||
notice that there is no warranty (or else, saying that you provide
|
||||
a warranty) and that users may redistribute the program under
|
||||
these conditions, and telling the user how to view a copy of this
|
||||
License. (Exception: if the Program itself is interactive but
|
||||
does not normally print such an announcement, your work based on
|
||||
the Program is not required to print an announcement.)
|
||||
|
||||
These requirements apply to the modified work as a whole. If
|
||||
identifiable sections of that work are not derived from the Program,
|
||||
and can be reasonably considered independent and separate works in
|
||||
themselves, then this License, and its terms, do not apply to those
|
||||
sections when you distribute them as separate works. But when you
|
||||
distribute the same sections as part of a whole which is a work based
|
||||
on the Program, the distribution of the whole must be on the terms of
|
||||
this License, whose permissions for other licensees extend to the
|
||||
entire whole, and thus to each and every part regardless of who wrote it.
|
||||
|
||||
Thus, it is not the intent of this section to claim rights or contest
|
||||
your rights to work written entirely by you; rather, the intent is to
|
||||
exercise the right to control the distribution of derivative or
|
||||
collective works based on the Program.
|
||||
|
||||
In addition, mere aggregation of another work not based on the Program
|
||||
with the Program (or with a work based on the Program) on a volume of
|
||||
a storage or distribution medium does not bring the other work under
|
||||
the scope of this License.
|
||||
|
||||
3. You may copy and distribute the Program (or a work based on it,
|
||||
under Section 2) in object code or executable form under the terms of
|
||||
Sections 1 and 2 above provided that you also do one of the following:
|
||||
|
||||
a) Accompany it with the complete corresponding machine-readable
|
||||
source code, which must be distributed under the terms of Sections
|
||||
1 and 2 above on a medium customarily used for software interchange; or,
|
||||
|
||||
b) Accompany it with a written offer, valid for at least three
|
||||
years, to give any third party, for a charge no more than your
|
||||
cost of physically performing source distribution, a complete
|
||||
machine-readable copy of the corresponding source code, to be
|
||||
distributed under the terms of Sections 1 and 2 above on a medium
|
||||
customarily used for software interchange; or,
|
||||
|
||||
c) Accompany it with the information you received as to the offer
|
||||
to distribute corresponding source code. (This alternative is
|
||||
allowed only for noncommercial distribution and only if you
|
||||
received the program in object code or executable form with such
|
||||
an offer, in accord with Subsection b above.)
|
||||
|
||||
The source code for a work means the preferred form of the work for
|
||||
making modifications to it. For an executable work, complete source
|
||||
code means all the source code for all modules it contains, plus any
|
||||
associated interface definition files, plus the scripts used to
|
||||
control compilation and installation of the executable. However, as a
|
||||
special exception, the source code distributed need not include
|
||||
anything that is normally distributed (in either source or binary
|
||||
form) with the major components (compiler, kernel, and so on) of the
|
||||
operating system on which the executable runs, unless that component
|
||||
itself accompanies the executable.
|
||||
|
||||
If distribution of executable or object code is made by offering
|
||||
access to copy from a designated place, then offering equivalent
|
||||
access to copy the source code from the same place counts as
|
||||
distribution of the source code, even though third parties are not
|
||||
compelled to copy the source along with the object code.
|
||||
|
||||
4. You may not copy, modify, sublicense, or distribute the Program
|
||||
except as expressly provided under this License. Any attempt
|
||||
otherwise to copy, modify, sublicense or distribute the Program is
|
||||
void, and will automatically terminate your rights under this License.
|
||||
However, parties who have received copies, or rights, from you under
|
||||
this License will not have their licenses terminated so long as such
|
||||
parties remain in full compliance.
|
||||
|
||||
5. You are not required to accept this License, since you have not
|
||||
signed it. However, nothing else grants you permission to modify or
|
||||
distribute the Program or its derivative works. These actions are
|
||||
prohibited by law if you do not accept this License. Therefore, by
|
||||
modifying or distributing the Program (or any work based on the
|
||||
Program), you indicate your acceptance of this License to do so, and
|
||||
all its terms and conditions for copying, distributing or modifying
|
||||
the Program or works based on it.
|
||||
|
||||
6. Each time you redistribute the Program (or any work based on the
|
||||
Program), the recipient automatically receives a license from the
|
||||
original licensor to copy, distribute or modify the Program subject to
|
||||
these terms and conditions. You may not impose any further
|
||||
restrictions on the recipients' exercise of the rights granted herein.
|
||||
You are not responsible for enforcing compliance by third parties to
|
||||
this License.
|
||||
|
||||
7. If, as a consequence of a court judgment or allegation of patent
|
||||
infringement or for any other reason (not limited to patent issues),
|
||||
conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot
|
||||
distribute so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you
|
||||
may not distribute the Program at all. For example, if a patent
|
||||
license would not permit royalty-free redistribution of the Program by
|
||||
all those who receive copies directly or indirectly through you, then
|
||||
the only way you could satisfy both it and this License would be to
|
||||
refrain entirely from distribution of the Program.
|
||||
|
||||
If any portion of this section is held invalid or unenforceable under
|
||||
any particular circumstance, the balance of the section is intended to
|
||||
apply and the section as a whole is intended to apply in other
|
||||
circumstances.
|
||||
|
||||
It is not the purpose of this section to induce you to infringe any
|
||||
patents or other property right claims or to contest validity of any
|
||||
such claims; this section has the sole purpose of protecting the
|
||||
integrity of the free software distribution system, which is
|
||||
implemented by public license practices. Many people have made
|
||||
generous contributions to the wide range of software distributed
|
||||
through that system in reliance on consistent application of that
|
||||
system; it is up to the author/donor to decide if he or she is willing
|
||||
to distribute software through any other system and a licensee cannot
|
||||
impose that choice.
|
||||
|
||||
This section is intended to make thoroughly clear what is believed to
|
||||
be a consequence of the rest of this License.
|
||||
|
||||
8. If the distribution and/or use of the Program is restricted in
|
||||
certain countries either by patents or by copyrighted interfaces, the
|
||||
original copyright holder who places the Program under this License
|
||||
may add an explicit geographical distribution limitation excluding
|
||||
those countries, so that distribution is permitted only in or among
|
||||
countries not thus excluded. In such case, this License incorporates
|
||||
the limitation as if written in the body of this License.
|
||||
|
||||
9. The Free Software Foundation may publish revised and/or new versions
|
||||
of the General Public License from time to time. Such new versions will
|
||||
be similar in spirit to the present version, but may differ in detail to
|
||||
address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the Program
|
||||
specifies a version number of this License which applies to it and "any
|
||||
later version", you have the option of following the terms and conditions
|
||||
either of that version or of any later version published by the Free
|
||||
Software Foundation. If the Program does not specify a version number of
|
||||
this License, you may choose any version ever published by the Free Software
|
||||
Foundation.
|
||||
|
||||
10. If you wish to incorporate parts of the Program into other free
|
||||
programs whose distribution conditions are different, write to the author
|
||||
to ask for permission. For software which is copyrighted by the Free
|
||||
Software Foundation, write to the Free Software Foundation; we sometimes
|
||||
make exceptions for this. Our decision will be guided by the two goals
|
||||
of preserving the free status of all derivatives of our free software and
|
||||
of promoting the sharing and reuse of software generally.
|
||||
|
||||
NO WARRANTY
|
||||
|
||||
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
||||
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
||||
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
||||
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
||||
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
||||
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
||||
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
||||
REPAIR OR CORRECTION.
|
||||
|
||||
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
||||
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
||||
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
||||
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
||||
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
||||
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGES.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Programs
|
||||
|
||||
If you develop a new program, and you want it to be of the greatest
|
||||
possible use to the public, the best way to achieve this is to make it
|
||||
free software which everyone can redistribute and change under these terms.
|
||||
|
||||
To do so, attach the following notices to the program. It is safest
|
||||
to attach them to the start of each source file to most effectively
|
||||
convey the exclusion of warranty; and each file should have at least
|
||||
the "copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the program's name and a brief idea of what it does.>
|
||||
Copyright (C) 19yy <name of author>
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
If the program is interactive, make it output a short notice like this
|
||||
when it starts in an interactive mode:
|
||||
|
||||
Gnomovision version 69, Copyright (C) 19yy name of author
|
||||
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||
This is free software, and you are welcome to redistribute it
|
||||
under certain conditions; type `show c' for details.
|
||||
|
||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||
parts of the General Public License. Of course, the commands you use may
|
||||
be called something other than `show w' and `show c'; they could even be
|
||||
mouse-clicks or menu items--whatever suits your program.
|
||||
|
||||
You should also get your employer (if you work as a programmer) or your
|
||||
school, if any, to sign a "copyright disclaimer" for the program, if
|
||||
necessary. Here is a sample; alter the names:
|
||||
|
||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
||||
`Gnomovision' (which makes passes at compilers) written by James Hacker.
|
||||
|
||||
<signature of Ty Coon>, 1 April 1989
|
||||
Ty Coon, President of Vice
|
||||
|
||||
This General Public License does not permit incorporating your program into
|
||||
proprietary programs. If your program is a subroutine library, you may
|
||||
consider it more useful to permit linking proprietary applications with the
|
||||
library. If this is what you want to do, use the GNU Library General
|
||||
Public License instead of this License.
|
83
Makefile
Normal file
83
Makefile
Normal file
@ -0,0 +1,83 @@
|
||||
## Copyright (C) 2004,2005 The SOS Team
|
||||
##
|
||||
## This program is free software; you can redistribute it and/or
|
||||
## modify it under the terms of the GNU General Public License
|
||||
## as published by the Free Software Foundation; either version 2
|
||||
## of the License, or (at your option) any later version.
|
||||
##
|
||||
## This program is distributed in the hope that it will be useful,
|
||||
## but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
## GNU General Public License for more details.
|
||||
##
|
||||
## You should have received a copy of the GNU General Public License
|
||||
## along with this program; if not, write to the Free Software
|
||||
## Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||
## USA.
|
||||
|
||||
CC=gcc
|
||||
LD=ld
|
||||
CFLAGS = -Wall -nostdinc -ffreestanding -DKERNEL_SOS
|
||||
LIBGCC := $(shell $(CC) -print-libgcc-file-name) # To benefit from FP/64bits artihm.
|
||||
LDFLAGS = --warn-common -nostdlib
|
||||
OBJECTS = bootstrap/multiboot.o \
|
||||
hwcore/idt.o hwcore/gdt.o \
|
||||
hwcore/swintr.o hwcore/swintr_wrappers.o \
|
||||
hwcore/exception.o hwcore/exception_wrappers.o \
|
||||
hwcore/irq.o hwcore/irq_wrappers.o hwcore/i8259.o \
|
||||
hwcore/paging.o \
|
||||
hwcore/i8254.o drivers/x86_videomem.o drivers/bochs.o \
|
||||
hwcore/cpu_context.o hwcore/cpu_context_switch.o \
|
||||
hwcore/mm_context.o \
|
||||
sos/kmem_vmm.o sos/kmem_slab.o sos/kmalloc.o \
|
||||
sos/physmem.o sos/klibc.o \
|
||||
sos/thread.o sos/kwaitq.o \
|
||||
sos/time.o sos/sched.o sos/ksynch.o \
|
||||
sos/process.o sos/syscall.o \
|
||||
sos/assert.o sos/main.o sos/mouse_sim.o \
|
||||
sos/uaccess.o sos/calcload.o \
|
||||
userland/userprogs.kimg sos/test-art7.o
|
||||
|
||||
KERNEL_OBJ = sos.elf
|
||||
MULTIBOOT_IMAGE = fd.img
|
||||
PWD := $(shell pwd)
|
||||
|
||||
# Main target
|
||||
all: $(MULTIBOOT_IMAGE)
|
||||
|
||||
$(MULTIBOOT_IMAGE): $(KERNEL_OBJ)
|
||||
./support/build_image.sh $@ $<
|
||||
|
||||
$(KERNEL_OBJ): $(OBJECTS) ./support/sos.lds
|
||||
$(LD) $(LDFLAGS) -T ./support/sos.lds -o $@ $(OBJECTS) $(LIBGCC)
|
||||
-nm -C $@ | cut -d ' ' -f 1,3 > sos.map
|
||||
size $@
|
||||
|
||||
-include .mkvars
|
||||
|
||||
# Create the userland programs to include in the kernel image
|
||||
userland/userprogs.kimg: FORCE
|
||||
$(MAKE) -C userland
|
||||
|
||||
# Create objects from C source code
|
||||
%.o: %.c
|
||||
$(CC) -I$(PWD) -c $< $(CFLAGS) -o $@
|
||||
|
||||
# Create objects from assembler (.S) source code
|
||||
%.o: %.S
|
||||
$(CC) -I$(PWD) -c $< $(CFLAGS) -DASM_SOURCE=1 -o $@
|
||||
|
||||
FORCE:
|
||||
@
|
||||
|
||||
# Clean directory
|
||||
clean:
|
||||
$(RM) *.img *.o mtoolsrc *~ menu.txt *.img *.elf *.bin *.map
|
||||
$(RM) *.log *.out bochs*
|
||||
$(RM) bootstrap/*.o bootstrap/*~
|
||||
$(RM) drivers/*.o drivers/*~
|
||||
$(RM) hwcore/*.o hwcore/*~
|
||||
$(RM) sos/*.o sos/*~
|
||||
$(RM) support/*~
|
||||
$(RM) extra/*~
|
||||
$(MAKE) -C userland clean
|
90
README
Normal file
90
README
Normal file
@ -0,0 +1,90 @@
|
||||
|
||||
SOS: A Simple Operating System
|
||||
|
||||
|
||||
This is SOS, a Simple Operating System for i386-family
|
||||
processors. This is as simple as possible to show a way to program a
|
||||
basic Operating System on real common hardware (PC). The code should
|
||||
be easily readable and understandable thanks to frequent comments, and
|
||||
references to external documentation. We chose to implement the basic
|
||||
features of an OS, thus making design decisions targetting towards
|
||||
simplicity of understanding, covering most of the OS classical
|
||||
concepts, but not aiming at proposing yet another full-fledged
|
||||
competitive OS (Linux is quite good at it). However, for those who
|
||||
would like to propose some enhancements, we are open to any code
|
||||
suggestions (patches only, please). And yes, there might be bugs in
|
||||
the code, so please send us any bug report, and/or patches !
|
||||
|
||||
The OS comes as a set of articles (in french) to be published in the
|
||||
journal "Linux Magazine France". Each month, the part of the code
|
||||
related to the current article's theme is released (see VERSION file),
|
||||
and the resulting OS can be successfully compiled and run, by booting
|
||||
it from a floppy on a real machine (tested AMD k7, Cyrix and Intel P4
|
||||
pentiums), or through an x86 emulator (bochs or qemu). The resulting
|
||||
OS is available as a multiboot compliant ELF kernel (sos.elf) and as a
|
||||
floppy image (fd.img). It provides a very very very basic demo whose
|
||||
aim is to understand how everything works, not to animate sprites on
|
||||
the screen with 5:1 dolby sound.
|
||||
|
||||
The initial technical features and lack-of-features of the OS are:
|
||||
- monolithic kernel, fully interruptible, non-preemptible (big kernel
|
||||
lock), target machines = i386 PC or better
|
||||
- compiles on any host where the gcc/binutils toolchain (target
|
||||
i586-gnu) is available. Can be tested on real i486/pentium
|
||||
hardware, or on any host that can run an i486/pentium PC emulator
|
||||
(bochs or qemu)
|
||||
- kernel loaded by grub, or by a sample bootsector (up to article 2
|
||||
ONLY)
|
||||
- clear separation of physical memory and virtual memory concepts,
|
||||
even inside the kernel: no identity-mapping of the physical memory
|
||||
inside the kernel (allows to move virtual mappings of kernel pages
|
||||
at run-time, eg to free ISA DMA pages, and to avercome the 4G RAM
|
||||
barrier)
|
||||
- slab-type kernel memory allocation
|
||||
- no swap, no reverse mapping
|
||||
- VERY simple drivers: keyboard, x86 video memory, IDE disks
|
||||
- logical devices: partitions, FAT filesystem, "hard-coded"
|
||||
mountpoints only (~ MSDOS)
|
||||
- no network stack
|
||||
- user-level features: ELF loader (no shared libraries), processes,
|
||||
user threads (kernel-level scheduling only), mmap API, basic VFS
|
||||
|
||||
To understand where to look at for what, here is a brief description:
|
||||
- Makefile: the (ONLY) makefile of the OS. Targets are basically
|
||||
'all' and 'clean'
|
||||
- bootstrap/ directory: code to load the kernel. Both the stuff
|
||||
needed for a multiboot-compliant loader (eg grub) AND a bootsector
|
||||
are provided. The bootsector may only be used up to article 2.
|
||||
- sos/ directory: the entry routine for the kernel (main.c), various
|
||||
systemwide header files, a set of common useful C routines
|
||||
("nano-klibc"), and kernel subsystems (kernel memory management,
|
||||
etc...)
|
||||
- hwcore/ directory: Low-level CPU- and kernel-related routines
|
||||
(interrupt/exception management, translation tables and segment
|
||||
registers, ...)
|
||||
- drivers/ directory: basic kernel drivers for various (non CPU)
|
||||
devices (keyboard, x86 video memory, bochs 0xe9 port, ...). Used
|
||||
mainly for debugging
|
||||
- support/ directory: scripts and configuration files to build the
|
||||
floppy images
|
||||
- extra/ directory: a set of configuration files to be customized for
|
||||
non-x86 host installations (yes, we primarily develop SOS on a ppc, for
|
||||
the x86 target of course), or for grub-less installations. See
|
||||
README file in this directory.
|
||||
|
||||
The code is licensed under the terms of the GNU GPL version 2 (see
|
||||
LICENSE file).
|
||||
|
||||
Enjoy !
|
||||
|
||||
David Decotigny, Thomas Petazzoni, the Kos team
|
||||
http://sos.enix.org/
|
||||
http://david.decotigny.free.fr/
|
||||
http://kos.enix.org/~thomas/
|
||||
http://kos.enix.org/
|
||||
|
||||
|
||||
--
|
||||
David Decotigny
|
||||
|
||||
PS: Made with a Mac.
|
11
VERSION
Normal file
11
VERSION
Normal file
@ -0,0 +1,11 @@
|
||||
SOS -- Simple OS
|
||||
Copyright (C) 2003,2004,2005 The SOS Team (David Decotigny & Thomas Petazzoni)
|
||||
|
||||
Version "Article 7 (1st part)" -- Basic user programs support
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
as published by the Free Software Foundation; either version 2
|
||||
of the License, or (at your option) any later version.
|
||||
|
||||
See the LICENSE file included in the distribution.
|
85
bootstrap/multiboot.S
Normal file
85
bootstrap/multiboot.S
Normal file
@ -0,0 +1,85 @@
|
||||
/* Copyright (C) 1999 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
as published by the Free Software Foundation; either version 2
|
||||
of the License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||
USA.
|
||||
*/
|
||||
|
||||
|
||||
/* The operating system is booted by Grub, so we almost have nothing
|
||||
to do to boot it. We only have to conform to the Multiboot
|
||||
standard, as defined by the Grub documentation */
|
||||
|
||||
#define ASM 1
|
||||
/* The multiboot.h header contains a lot of multiboot standard
|
||||
definitions */
|
||||
#include "multiboot.h"
|
||||
|
||||
/* The multiboot header itself. It must come first. */
|
||||
.section ".multiboot"
|
||||
/* Multiboot header must be aligned on a 4-byte boundary */
|
||||
.align 4
|
||||
multiboot_header:
|
||||
/* magic= */ .long MULTIBOOT_HEADER_MAGIC
|
||||
/* flags= */ .long MULTIBOOT_HEADER_FLAGS
|
||||
/* checksum= */ .long -(MULTIBOOT_HEADER_MAGIC \
|
||||
+MULTIBOOT_HEADER_FLAGS)
|
||||
/* header_addr= */ .long multiboot_header
|
||||
/* load_addr= */ .long __b_load
|
||||
/* load_end_addr=*/ .long __e_load
|
||||
/* bss_end_addr= */ .long __e_kernel
|
||||
/* entry_addr= */ .long multiboot_entry
|
||||
|
||||
/* Here is the beginning of the code of our operating system */
|
||||
.text
|
||||
|
||||
.globl start, _start
|
||||
start:
|
||||
_start:
|
||||
multiboot_entry:
|
||||
/* Set up a stack */
|
||||
movl $(stack + MULTIBOOT_STACK_SIZE), %ebp
|
||||
movl %ebp, %esp
|
||||
|
||||
/* Set EFLAGS to 0 */
|
||||
pushl $0
|
||||
/* pop stack into the EFLAGS register */
|
||||
popf
|
||||
|
||||
/* Push the magic and the address on the stack, so that they
|
||||
will be the parameters of the cmain function */
|
||||
pushl %ebx
|
||||
pushl %eax
|
||||
|
||||
/* Call the cmain function (os.c) */
|
||||
call EXT_C(sos_main)
|
||||
|
||||
/* Should never get there */
|
||||
loop:
|
||||
hlt
|
||||
jmp loop
|
||||
|
||||
/* Here is the stack */
|
||||
.section ".init_stack", "aw", @nobits
|
||||
.size stack, MULTIBOOT_STACK_SIZE
|
||||
stack:
|
||||
.space MULTIBOOT_STACK_SIZE
|
||||
|
||||
/* Some data characterizing the stack addresses */
|
||||
.data
|
||||
.globl bootstrap_stack_bottom
|
||||
bootstrap_stack_bottom: .long stack
|
||||
|
||||
.globl bootstrap_stack_size
|
||||
bootstrap_stack_size: .long MULTIBOOT_STACK_SIZE
|
133
bootstrap/multiboot.h
Normal file
133
bootstrap/multiboot.h
Normal file
@ -0,0 +1,133 @@
|
||||
#ifndef __MULTIBOOT_H__
|
||||
#define __MULTIBOOT_H__
|
||||
|
||||
/* multiboot.h - the header for Multiboot */
|
||||
/* Copyright (C) 1999 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||
|
||||
/* Macros. */
|
||||
|
||||
/* The magic number for the Multiboot header. */
|
||||
#define MULTIBOOT_HEADER_MAGIC 0x1BADB002
|
||||
|
||||
/* The flags for the Multiboot header. */
|
||||
#define MULTIBOOT_HEADER_FLAGS 0x00010003
|
||||
|
||||
/* The magic number passed by a Multiboot-compliant boot loader. */
|
||||
#define MULTIBOOT_BOOTLOADER_MAGIC 0x2BADB002
|
||||
|
||||
/* The size of our stack (16KB). */
|
||||
#define MULTIBOOT_STACK_SIZE 0x4000
|
||||
|
||||
#define MULTIBOOT_CMDLINE 4
|
||||
#define MULTIBOOT_MODS 8
|
||||
|
||||
/* C symbol format. HAVE_ASM_USCORE is defined by configure. */
|
||||
#ifdef HAVE_ASM_USCORE
|
||||
# define EXT_C(sym) _ ## sym
|
||||
#else
|
||||
# define EXT_C(sym) sym
|
||||
#endif
|
||||
|
||||
#ifndef ASM
|
||||
/* Do not include here in the assembler sources. */
|
||||
|
||||
#include <sos/types.h>
|
||||
|
||||
/* The address of the stack of the bootstrap thread */
|
||||
extern sos_vaddr_t bootstrap_stack_bottom;
|
||||
extern sos_size_t bootstrap_stack_size;
|
||||
|
||||
/* Types. */
|
||||
|
||||
/* The Multiboot header. */
|
||||
typedef struct multiboot_header
|
||||
{
|
||||
unsigned long magic;
|
||||
unsigned long flags;
|
||||
unsigned long checksum;
|
||||
unsigned long header_addr;
|
||||
unsigned long load_addr;
|
||||
unsigned long load_end_addr;
|
||||
unsigned long bss_end_addr;
|
||||
unsigned long entry_addr;
|
||||
} multiboot_header_t;
|
||||
|
||||
/* The symbol table for a.out. */
|
||||
typedef struct aout_symbol_table
|
||||
{
|
||||
unsigned long tabsize;
|
||||
unsigned long strsize;
|
||||
unsigned long addr;
|
||||
unsigned long reserved;
|
||||
} aout_symbol_table_t;
|
||||
|
||||
/* The section header table for ELF. */
|
||||
typedef struct elf_section_header_table
|
||||
{
|
||||
unsigned long num;
|
||||
unsigned long size;
|
||||
unsigned long addr;
|
||||
unsigned long shndx;
|
||||
} elf_section_header_table_t;
|
||||
|
||||
/* The Multiboot information. */
|
||||
typedef struct multiboot_info
|
||||
{
|
||||
unsigned long flags;
|
||||
unsigned long mem_lower;
|
||||
unsigned long mem_upper;
|
||||
unsigned long boot_device;
|
||||
unsigned long cmdline;
|
||||
unsigned long mods_count;
|
||||
unsigned long mods_addr;
|
||||
union
|
||||
{
|
||||
aout_symbol_table_t aout_sym;
|
||||
elf_section_header_table_t elf_sec;
|
||||
} u;
|
||||
unsigned long mmap_length;
|
||||
unsigned long mmap_addr;
|
||||
unsigned long drives_length;
|
||||
unsigned long drives_addr;
|
||||
} multiboot_info_t;
|
||||
|
||||
/* The module structure. */
|
||||
typedef struct module
|
||||
{
|
||||
unsigned long mod_start;
|
||||
unsigned long mod_end;
|
||||
unsigned long string;
|
||||
unsigned long reserved;
|
||||
} module_t;
|
||||
|
||||
/* The memory map. Be careful that the offset 0 is base_addr_low
|
||||
but no size. */
|
||||
typedef struct memory_map
|
||||
{
|
||||
unsigned long size;
|
||||
unsigned long base_addr_low;
|
||||
unsigned long base_addr_high;
|
||||
unsigned long length_low;
|
||||
unsigned long length_high;
|
||||
unsigned long type;
|
||||
} memory_map_t;
|
||||
|
||||
void dump_multiboot_info(multiboot_info_t *mbi);
|
||||
|
||||
#endif /* ! ASM */
|
||||
|
||||
#endif /* __MULTIBOOT_H__ */
|
123
drivers/bochs.c
Normal file
123
drivers/bochs.c
Normal file
@ -0,0 +1,123 @@
|
||||
/* Copyright (C) 2004 David Decotigny
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
as published by the Free Software Foundation; either version 2
|
||||
of the License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||
USA.
|
||||
*/
|
||||
#include <hwcore/ioports.h>
|
||||
#include <sos/klibc.h>
|
||||
|
||||
#include "bochs.h"
|
||||
|
||||
/* This is a special hack that is only useful when running the
|
||||
operating system under the Bochs emulator. */
|
||||
#define SOS_BOCHS_IOPORT 0xe9
|
||||
|
||||
sos_ret_t sos_bochs_setup(void)
|
||||
{
|
||||
return SOS_OK;
|
||||
}
|
||||
|
||||
#define _putchar(chr) \
|
||||
outb((chr), SOS_BOCHS_IOPORT)
|
||||
|
||||
sos_ret_t sos_bochs_putchar(char c)
|
||||
{
|
||||
_putchar(c);
|
||||
|
||||
return SOS_OK;
|
||||
}
|
||||
|
||||
sos_ret_t sos_bochs_putstring(const char* str)
|
||||
{
|
||||
for ( ; str && (*str != '\0') ; str++)
|
||||
_putchar(*str);
|
||||
|
||||
return SOS_OK;
|
||||
}
|
||||
|
||||
sos_ret_t sos_bochs_puthex(unsigned val, int nbytes)
|
||||
{
|
||||
unsigned c;
|
||||
|
||||
#define BOCHS_PRTHEX(q) \
|
||||
({ unsigned char r; if ((q) >= 10) r='a'+(q)-10; \
|
||||
else r='0'+(q); _putchar(r); })
|
||||
|
||||
switch (nbytes)
|
||||
{
|
||||
case 4:
|
||||
c = (val >> 24) & 0xff;
|
||||
BOCHS_PRTHEX((c >> 4)&0xf);
|
||||
BOCHS_PRTHEX(c&0xf);
|
||||
case 3:
|
||||
c = (val >> 16) & 0xff;
|
||||
BOCHS_PRTHEX((c >> 4)&0xf);
|
||||
BOCHS_PRTHEX(c&0xf);
|
||||
case 2:
|
||||
c = (val >> 8) & 0xff;
|
||||
BOCHS_PRTHEX((c >> 4)&0xf);
|
||||
BOCHS_PRTHEX(c&0xf);
|
||||
case 1:
|
||||
c = val & 0xff;
|
||||
BOCHS_PRTHEX((c >> 4)&0xf);
|
||||
BOCHS_PRTHEX(c&0xf);
|
||||
}
|
||||
|
||||
return SOS_OK;
|
||||
}
|
||||
|
||||
|
||||
sos_ret_t sos_bochs_hexdump(const void* addr, int nbytes)
|
||||
{
|
||||
int offs;
|
||||
for (offs = 0 ; offs < nbytes ; offs++)
|
||||
{
|
||||
const unsigned char *c;
|
||||
|
||||
if ((offs % 16) == 0)
|
||||
{
|
||||
sos_bochs_putstring("0x");
|
||||
sos_bochs_puthex(offs, 4);
|
||||
}
|
||||
|
||||
if ((offs % 8) == 0)
|
||||
sos_bochs_putstring(" ");
|
||||
|
||||
c = (const unsigned char*)(addr + offs);
|
||||
sos_bochs_puthex(*c, 1);
|
||||
sos_bochs_putstring(" ");
|
||||
|
||||
if (((offs + 1) % 16) == 0)
|
||||
sos_bochs_putstring("\n");
|
||||
}
|
||||
|
||||
if (offs % 16)
|
||||
sos_bochs_putstring("\n");
|
||||
|
||||
return SOS_OK;
|
||||
}
|
||||
|
||||
|
||||
sos_ret_t sos_bochs_printf(const char *format, /* args */...)
|
||||
{
|
||||
char buff[256];
|
||||
va_list ap;
|
||||
|
||||
va_start(ap, format);
|
||||
vsnprintf(buff, sizeof(buff), format, ap);
|
||||
va_end(ap);
|
||||
|
||||
return sos_bochs_putstring(buff);
|
||||
}
|
55
drivers/bochs.h
Normal file
55
drivers/bochs.h
Normal file
@ -0,0 +1,55 @@
|
||||
/* Copyright (C) 2004 David Decotigny
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
as published by the Free Software Foundation; either version 2
|
||||
of the License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||
USA.
|
||||
*/
|
||||
#ifndef _SOS_BOCHS_H_
|
||||
#define _SOS_BOCHS_H_
|
||||
|
||||
/**
|
||||
* @file bochs.h
|
||||
*
|
||||
* If you compiled Bochs with the --enable-e9-hack, then any character
|
||||
* printed to the 0xE9 I/O port is printed to the xterm that is
|
||||
* running Bochs. This may appear to be a detail, but in fact, this
|
||||
* functionnality is *VERY* precious for debugging purposes. This
|
||||
* """driver""" handles this feature.
|
||||
*/
|
||||
|
||||
#include <sos/errno.h>
|
||||
#include <sos/types.h>
|
||||
|
||||
sos_ret_t sos_bochs_setup(void);
|
||||
|
||||
sos_ret_t sos_bochs_putchar(char c);
|
||||
|
||||
sos_ret_t sos_bochs_putstring(const char* str);
|
||||
|
||||
/** Print the least signficant 32 (nbytes == 4), 24 (nbytes == 3), 16
|
||||
(nbytes == 2) or 8 (nbytes == 1) bits of val in hexadecimal. */
|
||||
sos_ret_t sos_bochs_puthex(unsigned val, int nbytes);
|
||||
|
||||
/** hexdump-style pretty printing */
|
||||
sos_ret_t sos_bochs_hexdump(const void* addr, int nbytes);
|
||||
|
||||
/**
|
||||
* Print the formatted string. Very restricted version of printf(3):
|
||||
* 1/ can print max 255 chars, 2/ supports only %d/%i, %c, %s, %x
|
||||
* without any support for flag charachters (eg %08x).
|
||||
*/
|
||||
sos_ret_t sos_bochs_printf(const char *format, /* args */...)
|
||||
__attribute__ ((format (printf, 1, 2)));
|
||||
|
||||
#endif
|
127
drivers/x86_videomem.c
Normal file
127
drivers/x86_videomem.c
Normal file
@ -0,0 +1,127 @@
|
||||
/* Copyright (C) 2004 David Decotigny
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
as published by the Free Software Foundation; either version 2
|
||||
of the License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||
USA.
|
||||
*/
|
||||
#include <sos/klibc.h>
|
||||
#include <hwcore/ioports.h>
|
||||
|
||||
#include "x86_videomem.h"
|
||||
|
||||
/* The text video memory starts at address 0xB8000. Odd bytes are the
|
||||
ASCII value of the character, even bytes are attribute for the
|
||||
preceding character. */
|
||||
#define VIDEO 0xb8000
|
||||
|
||||
|
||||
/* Console screen size */
|
||||
#define LINES 25
|
||||
#define COLUMNS 80
|
||||
|
||||
|
||||
/** The structure of a character element in the video memory. @see
|
||||
http://webster.cs.ucr.edu/AoA DOS edition chapter 23 */
|
||||
typedef struct {
|
||||
unsigned char character;
|
||||
unsigned char attribute;
|
||||
} __attribute__ ((packed)) x86_video_mem[LINES*COLUMNS];
|
||||
|
||||
|
||||
|
||||
/** The base pointer for the video memory */
|
||||
static volatile x86_video_mem *video = (volatile x86_video_mem*)VIDEO;
|
||||
|
||||
sos_ret_t sos_x86_videomem_setup(void)
|
||||
{
|
||||
/*
|
||||
* Hide cursor. @see Ralf Brown's interrupt (and port) list
|
||||
* http://www-2.cs.cmu.edu/~ralf/files.html
|
||||
*/
|
||||
#define CRT_REG_INDEX 0x3d4
|
||||
#define CRT_REG_DATA 0x3d5
|
||||
|
||||
/* CRT index port => ask for access to register 0xa ("cursor
|
||||
start") */
|
||||
outb(0x0a, CRT_REG_INDEX);
|
||||
|
||||
/* (RBIL Tables 708 & 654) CRT Register 0xa => bit 5 = cursor OFF */
|
||||
outb(1 << 5, CRT_REG_DATA);
|
||||
|
||||
return SOS_OK;
|
||||
}
|
||||
|
||||
|
||||
sos_ret_t sos_x86_videomem_cls(unsigned char attribute)
|
||||
{
|
||||
/* Clears the screen */
|
||||
int i;
|
||||
for(i = 0 ; i < LINES*COLUMNS ; i++)
|
||||
{
|
||||
(*video)[i].character = 0;
|
||||
(*video)[i].attribute = attribute;
|
||||
}
|
||||
|
||||
return SOS_OK;
|
||||
}
|
||||
|
||||
|
||||
sos_ret_t sos_x86_videomem_putstring(unsigned char row, unsigned char col,
|
||||
unsigned char attribute,
|
||||
const char *str)
|
||||
{
|
||||
unsigned video_offs = row*COLUMNS + col;
|
||||
|
||||
if (video_offs >= LINES*COLUMNS)
|
||||
return -SOS_EINVAL;
|
||||
|
||||
for ( ; str && *str && (video_offs < LINES*COLUMNS) ; str++, video_offs++)
|
||||
{
|
||||
(*video)[video_offs].character = (unsigned char)*str;
|
||||
(*video)[video_offs].attribute = attribute;
|
||||
}
|
||||
|
||||
return SOS_OK;
|
||||
}
|
||||
|
||||
|
||||
sos_ret_t sos_x86_videomem_putchar(unsigned char row, unsigned char col,
|
||||
unsigned char attribute,
|
||||
unsigned char c)
|
||||
{
|
||||
unsigned video_offs = row*COLUMNS + col;
|
||||
|
||||
if (video_offs >= LINES*COLUMNS)
|
||||
return -SOS_EINVAL;
|
||||
|
||||
(*video)[video_offs].character = c;
|
||||
(*video)[video_offs].attribute = attribute;
|
||||
|
||||
return SOS_OK;
|
||||
}
|
||||
|
||||
|
||||
sos_ret_t sos_x86_videomem_printf(unsigned char row, unsigned char col,
|
||||
unsigned char attribute,
|
||||
const char *format, /* args */...)
|
||||
{
|
||||
char buff[256];
|
||||
va_list ap;
|
||||
|
||||
va_start(ap, format);
|
||||
vsnprintf(buff, sizeof(buff), format, ap);
|
||||
va_end(ap);
|
||||
|
||||
return sos_x86_videomem_putstring(row, col, attribute, buff);
|
||||
}
|
97
drivers/x86_videomem.h
Normal file
97
drivers/x86_videomem.h
Normal file
@ -0,0 +1,97 @@
|
||||
/* Copyright (C) 2004 David Decotigny
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
as published by the Free Software Foundation; either version 2
|
||||
of the License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||
USA.
|
||||
*/
|
||||
#ifndef _SOS_X86_VIDEOMEM_H_
|
||||
#define _SOS_X86_VIDEOMEM_H_
|
||||
|
||||
/**
|
||||
* @file x86_videomem.h
|
||||
*
|
||||
* On x86 PC platforms, the text mode screen memory (and CGA/EGA/VGA
|
||||
* too) is mapped into physical memory. This file handles access to
|
||||
* this screen, supposed to be set in text-mode, through this memory
|
||||
* area. All the functions below print the characters directly to the
|
||||
* memory, without interpreting the escaped characters (such as \n,
|
||||
* \r...)
|
||||
*/
|
||||
|
||||
#include <sos/errno.h>
|
||||
|
||||
/**
|
||||
* x86 video attributes
|
||||
* See http://webster.cs.ucr.edu/AoA/DOS/ch23/CH23-1.html
|
||||
*/
|
||||
/* Normal and Dark/Light foreground */
|
||||
#define SOS_X86_VIDEO_FG_BLACK 0
|
||||
#define SOS_X86_VIDEO_FG_DKGRAY 8
|
||||
#define SOS_X86_VIDEO_FG_BLUE 1
|
||||
#define SOS_X86_VIDEO_FG_LTBLUE 9
|
||||
#define SOS_X86_VIDEO_FG_GREEN 2
|
||||
#define SOS_X86_VIDEO_FG_LTGREEN 10
|
||||
#define SOS_X86_VIDEO_FG_CYAN 3
|
||||
#define SOS_X86_VIDEO_FG_LTCYAN 11
|
||||
#define SOS_X86_VIDEO_FG_RED 4
|
||||
#define SOS_X86_VIDEO_FG_LTRED 12
|
||||
#define SOS_X86_VIDEO_FG_MAGENTA 5
|
||||
#define SOS_X86_VIDEO_FG_LTMAGENTA 13
|
||||
#define SOS_X86_VIDEO_FG_BROWN 6
|
||||
#define SOS_X86_VIDEO_FG_YELLOW 14
|
||||
#define SOS_X86_VIDEO_FG_LTGRAY 7
|
||||
#define SOS_X86_VIDEO_FG_WHITE 15
|
||||
/* Background */
|
||||
#define SOS_X86_VIDEO_BG_BLACK (0 << 4)
|
||||
#define SOS_X86_VIDEO_BG_BLUE (1 << 4)
|
||||
#define SOS_X86_VIDEO_BG_GREEN (2 << 4)
|
||||
#define SOS_X86_VIDEO_BG_CYAN (3 << 4)
|
||||
#define SOS_X86_VIDEO_BG_RED (4 << 4)
|
||||
#define SOS_X86_VIDEO_BG_MAGENTA (5 << 4)
|
||||
#define SOS_X86_VIDEO_BG_BROWN (6 << 4)
|
||||
#define SOS_X86_VIDEO_BG_LTGRAY (7 << 4)
|
||||
/* Blinking */
|
||||
#define SOS_X86_VIDEO_FG_BLINKING (1 << 7)
|
||||
|
||||
|
||||
/** Setup the video RAM mapping and clear the screen */
|
||||
sos_ret_t sos_x86_videomem_setup(void);
|
||||
|
||||
/** Clears the screen and set the background color as given by
|
||||
attribute */
|
||||
sos_ret_t sos_x86_videomem_cls(unsigned char attribute);
|
||||
|
||||
/** Print the string on the scren with the given attribute. Does not
|
||||
handle scrolling */
|
||||
sos_ret_t sos_x86_videomem_putstring(unsigned char row, unsigned char col,
|
||||
unsigned char attribute,
|
||||
const char *str);
|
||||
|
||||
/** Print the character on the scren with the given attribute. Does not
|
||||
handle scrolling */
|
||||
sos_ret_t sos_x86_videomem_putchar(unsigned char row, unsigned char col,
|
||||
unsigned char attribute,
|
||||
unsigned char c);
|
||||
|
||||
/**
|
||||
* Print the formatted string. Very restricted version of printf(3):
|
||||
* 1/ can print max 255 chars, 2/ supports only %d/%i, %c, %s, %x
|
||||
* without any support for flag charachters (eg %08x).
|
||||
*/
|
||||
sos_ret_t sos_x86_videomem_printf(unsigned char row, unsigned char col,
|
||||
unsigned char attribute,
|
||||
const char *format, /* args */...)
|
||||
__attribute__ ((format (printf, 4, 5)));
|
||||
|
||||
#endif /* _SOS_X86_VIDEOMEM_H_ */
|
40
extra/Makefile
Normal file
40
extra/Makefile
Normal file
@ -0,0 +1,40 @@
|
||||
OBJCOPY=objcopy
|
||||
|
||||
all: sos_qemu.img
|
||||
|
||||
-include ../.mkvars
|
||||
|
||||
# The image is the simple concatenation of the boot sector and the kernel
|
||||
# It may be use in bochs or on a real floppy, but NOT in qemu (see below)
|
||||
sos_bsect.img: bsect.bin sos.bin
|
||||
cat $^ > $@
|
||||
@echo "[31mYou can use the $@ image in bochs or on a real floppy (NOT qemu)[m"
|
||||
|
||||
# For qemu, the trick is to tell it we have *more* than 1440 sectors (720kB).
|
||||
# Rtherwise the qemu disk geometry will be configured to be that of a 720kB
|
||||
# floppy, while our boot sector assumes it to be 1.44MB
|
||||
sos_qemu.img: sos_bsect.img
|
||||
# Padding with 0s after the bsect/kernel image
|
||||
cat $< /dev/zero | dd of=$@ bs=1k count=1440
|
||||
@echo "[31mYou can use the $@ image in qemu, bochs, or on a real floppy[m"
|
||||
|
||||
# we extract the boot sector from the main ELF binary
|
||||
bsect.bin: sos_bsect.elf
|
||||
$(OBJCOPY) -v -O binary -j .bootsect $< $@
|
||||
|
||||
# we extract the kernel code from the main ELF binary
|
||||
sos.bin: sos_bsect.elf
|
||||
$(OBJCOPY) -v -O binary -R .bootsect $< $@
|
||||
|
||||
# The main ELF binary contains the boot sector and the kernel code
|
||||
# linked together (hence we deal with a SINGLE image that we split
|
||||
# above) because they share some symbol definitions
|
||||
sos_bsect.elf: bootsect.o compile_kernel
|
||||
$(LD) --warn-common -T ./sos_bsect.lds -o $@ \
|
||||
bootsect.o $(wildcard ../hwcore/*.o ../drivers/*.o ../sos/*.o)
|
||||
|
||||
compile_kernel:
|
||||
$(MAKE) -C ..
|
||||
|
||||
clean:
|
||||
$(RM) *.img *.elf *.bin *~ *.o *.out
|
73
extra/README
Normal file
73
extra/README
Normal file
@ -0,0 +1,73 @@
|
||||
|
||||
Contents of the extra/ directory
|
||||
================================
|
||||
|
||||
Data and configuration files to support generation of sos on non-x86
|
||||
and/or grub-less hosts:
|
||||
- dot.mkvars: file to copy as .mkvars in the root directory to
|
||||
compile on a non-x86 host, and to generate the grub floppy image on
|
||||
a grub-less host
|
||||
- grub.img.gz: compressed image of a Grub floppy (without any
|
||||
kernel). Used by dot.mkvars.
|
||||
- mtoolsrc: file needed by .mkvars to compile a the floppy image
|
||||
|
||||
Support of a sos-specific boot sector:
|
||||
- Makefile: rules to compile sos_bsect.img, the floppy image with the
|
||||
boot sector and the Sos
|
||||
- bootsect.S: x86 Sos boot sector (GNU as). Depends on sos_bsect.lds
|
||||
- sos_bsect.lds: ld script to bind the boot sector with the remaining
|
||||
of the kernel
|
||||
|
||||
Misc:
|
||||
- qemu-port-e9.diff: patch over qemu to support the bochs "port 0xe9 hack"
|
||||
|
||||
|
||||
What you can do with these files
|
||||
================================
|
||||
|
||||
|
||||
*** Compile SOS from another architecture:
|
||||
------------------------------------------
|
||||
- compile a cross-compiler for the i586-gnu target. This involves
|
||||
compiling the binutils and gcc. Here are example configuration
|
||||
options for them:
|
||||
binutils (replace sparc-cun-solaris with your arch):
|
||||
../binutils-2.13/configure --prefix=/udd/ddecotig/temp_dd/xgcc/host-sparc-solaris7/stow/binutils-2.11 --host=sparc-sun-solaris2.7 i586-gnu
|
||||
make && make install
|
||||
gcc (ditto):
|
||||
CFLAGS="-O2 -Dinhibit_libc" ../gcc-3.2/configure --target=i586-gnu --prefix=/udd/ddecotig/temp_dd/xgcc/host-sparc-solaris7/stow/gcc-3.2 --with-as=/udd/ddecotig/temp_dd/xgcc/host-sparc-solaris7/bin/as --with-ld=/udd/ddecotig/temp_dd/xgcc/host-sparc-solaris7/bin/ld --with-gnu-as --with-gnu-ld --enable-languages=c --disable-shared --disable-multilib --disable-nls --enable-threads=single
|
||||
make && make install
|
||||
- compile the mtools
|
||||
- copy dot.mkvars to the root directory of SOS, as ".mkvars"
|
||||
- customize the CC/LD/... variables to suit your cross-compiler
|
||||
installatioon
|
||||
- now you may run make from the SOS root directory, it should
|
||||
generate the Grub boot floppy image. The following warning is
|
||||
normal:
|
||||
.mkvars:16: attention : écrasement des commandes pour la cible « grub-sos.img »
|
||||
Makefile:92: attention : anciennes commandes ignorées pour la cible « grub-sos.img »
|
||||
|
||||
|
||||
*** To compile SOS from an x86 where grub is not or incorrectly installed:
|
||||
--------------------------------------------------------------------------
|
||||
- copy dot.mkvars to the root directory of SOS, as ".mkvars"
|
||||
- customize the CC/LD/... variables to suit your cross-compiler
|
||||
installatioon
|
||||
- now you may run make from the SOS root directory, it should
|
||||
generate the Grub boot floppy image. The following warning is
|
||||
normal:
|
||||
.mkvars:16: attention : écrasement des commandes pour la cible « grub-sos.img »
|
||||
Makefile:92: attention : anciennes commandes ignorées pour la cible « grub-sos.img »
|
||||
|
||||
|
||||
*** To compile SOS with its own bootloader:
|
||||
-------------------------------------------
|
||||
- for cross-architecture compilation: see above
|
||||
- cd to this extra/ directory
|
||||
- run 'make'
|
||||
- the floppy image is: sos_bsect.img
|
||||
NOTE : SOS will not boot correctly this way after article 2 !
|
||||
|
||||
|
||||
--
|
||||
David Decotigny
|
406
extra/bootsect.S
Normal file
406
extra/bootsect.S
Normal file
@ -0,0 +1,406 @@
|
||||
|
||||
/*
|
||||
* @(#) $Id: bootsect.S,v 1.8 2004/11/20 16:00:11 d2 Exp $
|
||||
* Description : Bootsecteur en syntaxe AT&T
|
||||
* Auteurs : Thomas Petazzoni & Fabrice Gautier & Emmanuel Marty
|
||||
* Jerome Petazzoni & Bernard Cassagne & coffeeman
|
||||
* David Decotigny
|
||||
* Bug reports to kos-misc@enix.org
|
||||
*/
|
||||
|
||||
/*
|
||||
* But global de ce bootsecteur :
|
||||
*
|
||||
* - Initialiser la becane
|
||||
* - Charger le kernel
|
||||
* - Passer en mode protege
|
||||
* - Executer le kernel
|
||||
*
|
||||
* Taille restante : Je vous rappelle qu'un bootsecteur ne peut faire
|
||||
* qu'au maximum 512 octets dont 2 octets obligatoires 0xAA55. Sur
|
||||
* les 510 octets reellement utilisables, il reste 3 octets dispo (60
|
||||
* si on decide d'enlever le BPB un jour) !!!
|
||||
*
|
||||
* thomas_petazzoni : - detection des codes d'erreurs de chargement
|
||||
* David_Decotigny : - Passage en GNU as
|
||||
* David_Decotigny : - Chargement du noyau au-dela du 1er Mega (taille
|
||||
* max = 0x9e000 octets = 632ko), pour avoir le
|
||||
* meme noyau sous grub et avec le bootsecteur
|
||||
*/
|
||||
|
||||
/*
|
||||
* Sequence d'operations :
|
||||
* - Le BIOS charge le bootsect en 0x7c00 (BOOT_ADRESS). On choisit
|
||||
* la representation 0x7c0:0000 pour que le .org 0 reste valide
|
||||
* - Le bootsect se deplace de lui-meme en 0x9f000 (COPY_ADRESS). On
|
||||
* choisit la representation 0x9f00:0000 pour que le .org 0 reste
|
||||
* valide
|
||||
* - Le bootsect verifie que le processeur est du type 386+
|
||||
* - Il charge le noyau depuis la disquette en memoire a partir de
|
||||
* 0x1000 (LOAD_ADRESS). Le noyau peut au max tenir sur
|
||||
* SECTORS_TO_LOAD secteurs
|
||||
* - Il passe en pmode flat (apres ouverture a20)
|
||||
* - Il recopie le noyau (situe en LOAD_ADRESS) vers son adresse
|
||||
* finale (FINAL_ADDRESS = 2Mo). La recopie se fait sur tout l'espace
|
||||
* LOAD_ADRESS ---> COPY_ADRESS, c'est a dire sur 0x9e000 octets =
|
||||
* 632ko. Le noyau peut donc au max faire 632ko. Le nombre max de
|
||||
* secteurs de disquette qu'on peut charger est donc 1264
|
||||
*/
|
||||
|
||||
|
||||
/* La taille de la pile */
|
||||
#define BOOT_STACK_SIZE 0x4000
|
||||
|
||||
.file "bootsect.S"
|
||||
|
||||
/* Tout est place dans une seule section */
|
||||
.section ".bootsect"
|
||||
|
||||
/* L'essentiel du bootsector (sauf les 1eres instructions)
|
||||
sont a un offset 0. On fait en sorte que le compilo soit
|
||||
d'accord la-dessus. Quand on a des adresse realm exotiques
|
||||
(0x7c00, 0x9f000, ...), on s'arrange toujours pour avoir un
|
||||
offset de 0 => on choisira le segment adapte (0x7c0,
|
||||
0x9f00, ...). Il ne faut pas oublier le ld -Ttext 0 */
|
||||
.org 0
|
||||
|
||||
/* Pour que gas genere du 16bits, afin que ca marche en realm */
|
||||
.code16
|
||||
|
||||
#define SECTORS_TO_LOAD 128 /* 64 ko */ /* MAX=1264 */
|
||||
|
||||
/*
|
||||
* Parametres de la disquette. Comme c'est chiant de faire une
|
||||
* procedure de detection auto, et que ca prend de la place, on fait
|
||||
* ca "a la main". Par exemple, une DD 720 Ko a 9 secteurs/piste, une
|
||||
* 1.44 Mo a 18 secteurs/pistes
|
||||
*/
|
||||
#define CYLS 80
|
||||
#define HEADS 1
|
||||
#define SECTS 18
|
||||
|
||||
#define BOOT_ADRESS 0x07C00 /* Adresse de demarrage (lineaire) */
|
||||
#define BOOT_SEG (BOOT_ADRESS>>4) /* Segment de Boot */
|
||||
#define BOOT_SIZE 512 /* Taille bu bootsecteur */
|
||||
#define COPY_ADRESS 0x9F000 /* La ou on va copier le
|
||||
bootsecteur (lineaire) */
|
||||
#define COPY_SEG (COPY_ADRESS>>4) /* Segment de la ou on va
|
||||
copier le bootsecteur */
|
||||
#define LOAD_ADRESS 0x01000 /* 1er chargement du systeme */
|
||||
#define LOAD_SEG (LOAD_ADRESS>>4) /* Segment du 1er chargement du */
|
||||
#define MAX_KERN_LEN COPY_ADRESS-LOAD_ADRESS /* Taille noyau maxi */
|
||||
|
||||
/* IMPORTANT : Cette valeur DOIT etre identique a l'adresse presente
|
||||
dans sos.lds ! */
|
||||
#define FINAL_ADDRESS 0x200000 /* Adresse finale (physique de 0 a 4G)
|
||||
ou est charge le noyau */
|
||||
|
||||
#define OP16 .byte 0x66 ;
|
||||
#define OP32 .byte 0x66 ;
|
||||
|
||||
/*
|
||||
* Procedure qui vide le buffer clavier.
|
||||