[okl4-developer] newbie guide (was: no subject)
Carl van Schaik
carl at ok-labs.com
Tue Jul 3 14:25:26 EST 2007
Hi Jorge,
Thanks for the great work you have done on this, it will certainly
become a useful document!
Some minor comments are inline below.
regards,
Carl
Jorge Torres wrote:
> Hi okl4.org <http://okl4.org>,
>
> I'm writing this OKL4 newbie guide, and I thought interesting
> describing from switch on to wombat init process, here is what I have,
> but I might be wrong or incomplete, so please if any of you have the
> time to correct me if I'm wrong, I'll be very happy to receive some
> feedback:
>
>
> Boot-Loader
> ---------------
> As almost allways for operating systems, there must be an specific
> boot sequence, un-
> derstood as the set of operations performed to load an operating
> system after computer's
> switch on, since most computers can only execute code stored on
> system's ROM
> or RAM, and computer's hardware alone cannot load a program from a
> disk or other
> removable media, therefore a sort of operating system itself might be
> needed to load
> another much more complex operating system, such process was called
> bootstrapping,
> out of the legend of a man flying by pulling himself up from his own
> bootstraps. As so,
> a very small program or set of programs called bootstrap-loader or
> bootloader is used
> to load into memory the necessary software for an operative system to
> start, OKL4 is
> no exemption; it all starts with a bootloader, which is on user hands
> to chose, in this
> specific case the GRUB bootloader. Whatever the chosen may be, must
> boot the L4
> kernel image image.elf built by the SCons Build system. More
> information about this
> can be found at the tools/doc directory.
>
> L4 u-kernel
> ---------------
> Inside code; kernel's entry point is architecture dependent.
> Generally, one may think at
> first; main() function to be the first function to receive control,
> just as in applications,
> but the real entry function is called _start(), which commonly sets up
> the environment,
> opens descriptors, and then invokes that main() we all know. So kernel
> has to define its
> _start function, since Boot loader expects from first loaded file a
> declaration of it.
The entry point is typically located in the "start address" field of the
ELF file kernel image, or a hardcoded address when not using an
ELF/equivalent compatible bootloader.
>
> • L4's u-kernel _start is defined at assembly code file (for ia32 pc99):
> pistachio/platform/pc99/src/startup.spp
> where paging is set up, and then a jump to what the top-level main in
> this case
> will be: the startup_system function.
>
> • Architecture dependent startup_system() function located at:
> pistachio/arch/ia32/src/init.cc:
> Where spaceids, kernel space, KIP, IRQ Hardware, global_timing, Global
> De-
> scriptor table, processor(s), timer, and scheduler are initialized.
you are missing exception/irq handling support is initialised?
>
> • Timer initialization is done by first calling
> get_timer()->init_global() method,
> which assigns IRQ time tick interrupt to the timer_interrupt function,
> both found
> on file pistachio/arch/ia32/src/timer.cc, therefore if a time tick
> interrupt occurs, timer_interrupt ACKs and then triggers
> the scheduler's handle_timer_interrupt method.
> pistachio/src/schedule.cc.
>
> • (startup_scheduler) function located at:
> pistachio/src/init.cc
> Allocates Kernel's stacks, initializes the scheduler, which
> initializes the priorities
> queue, then idle_thread is created, after that scheduler is started
> where idle_thread
> is scheduled and switched to, finally an infinite loop starts to
> prevent termination
> of kernel execution.
The idle thread has had some startup code "notified" and its
continuation points to the further init code
>
> • (root_task); at startup_scheduler init_all_threads is called, where
> interrupt threads,
> kernel threads and root server thread are initialized. Root server or
> root task runs
> in the root address space, giving it special access rights. It is
> initialized with the
> init_root_servers() found at:
> pistachio/src/thread.cc
> There is a root_server structure on the kernel interface page class,
> holding in-
> formation about root_task instruction pointer, stack pointer and
> memory region
> occupied by the server, this addresses are set by elfweaver. Last on
> initializa-
> tion; kernel jumps to the idle_thread that will also be executed
> whenever no other
> threads are active, and whose job is to search for some thread ready
> to run, so
> root_task is the first found by idle and a context switch is performed
> to it.
The roottask thread is created, and its initial address space is mapped
from the info in the KIP memory-descriptors, which are provided by the
build system.
The idle thread runs the scheduler, which picks the first user thread
(roottask) to run.
>
>
> Iguana
> ---------
> If iguana is specified as the project to the build system, then iguana
> server is set to be
> µ-kernel's root task.
>
> • (main), located at iguana/server/src/main.c Initializes iguana by
> initializing UTCB areas and sizes (utcb_init()), then spaces are
> initialized, and it creates a protection domain with itself as a
> parent (init_pd()), threads parameters
> are initialized, and finally before entering into its loop state;
> based on boot infor-
> mation server threads are created as well as iguana tasks
> (bi_execute()), servers
> and applications are specified at the iguana's SConstruct file on
> projects/iguana/SConstruct essentially servers are: naming which
> provides a sim-
> ple shared namespace, timer which as its name suggests is a timer
> server for
> Iguana, and serial server. This three are not optionally loaded by the
> build system,
> once project is set to Iguana they are automaticly added to the
> Applications.
>
> • (examples) Optionally there are two examples which can be specified
> as argu-
> ments to the build system, they are located at
> iguana/examples/<example>. they
> will help allot on iguana basic service understanding.
>
> • (wombat) If wombat build system argument is set to true, then Wombat
> Linux and
> bussybox are added as Iguana applications, note that examples and
> wombat cant
(busybox)
> go at the same time, since its restricted by the build.py
>
> Wombat
> -------------
> Deciding if wombat will be part of the system image, it's on user
> hands, by simply sending the wombat=True argument to the build system,
> if such thing
> happens, then Linux task is set for iguana.
>
> • (main) Linux entry point can be found at
> linux/kernel/arch/l4/kernel/main.c, where basicly a new thread is
> created called
> the main_thread and labeled L_Syscall, which is in charge of starting
> the Linux
> kernel almost just as its original _start entry point. The linux
> initial thread labels
> it self as L_timer, who will be responsably of acting as Linux's ISR.
>
> • (L_timer) code can be found in interrupt_loop() function, located at
> linux/kernel/arch/l4/kernel/sys_iguana.c which initially is waked up
> by the main_thread,
> then timer is initialized and enters to an infinite loop which handle
> interrupts, for-
> ward them to the main_thread if necessary and signal linux scheduler
> when timer
> interrupts occur.
ISRs run in the context of L_timer most of the time, unless they are
defered (IRQ can when L_syscall has interrupts disabled, in which case,
L_syscall will run the ISR when re-enabling interrupts).
>
> • (main_thread) code begins with the start_kernel function at
> linux/kernel/init/main.c, there from scheduler to signals, page
> writebacks, and
> many others are initialized, and also, L_timer thread waked up, and
> finally init
> thread with rest_init function where /sbin/init, /etc/init, bin/init,
> /bin/sh init pro-
> cesses are runned with run_init_process() function. And as many say:
> the rest is
> history!.
>
L_syscall eventually gets to syscall_loop(), which switches to
Linux-user threads, and receives events back from then (pagefaults,
exceptions, syscalls etc). Also L_timer calls L_syscall - which it
detected in the syscall_loop to enable pre-emption of user-threads.
>
>
> Thank you,
>
> Jorge
> ------------------------------------------------------------------------
>
> _______________________________________________
> Developer mailing list
> Developer at okl4.org
> https://lists.okl4.org/mailman/listinfo/developer
>
More information about the Developer
mailing list