1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
|
Welcome to FoolOS
=================
Disclaimer
----------
THIS IS A WORK IN PROGRESS.
This is a simple and useless "operating system", with very basic
features, sorry. It is the fruit of my fundamental explorations of
the x86 architectures, 32-bit protected mode, interrupt handling,
memory management, networking and some other things.

Copyright M.Idziorek 2014 <m.i@gmx.at>
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
Issues
------
* memory map may be larger than mbr, but 0x0000 is used to check for end.
* memory map location is hardcoded
* the first ~4mb of physical mem are reserved by mem manager (hardcoded)
* bootloader loads only 50 sectors of kernel into mem. 25KB!
* Makefile is hardcoded and contains some mistakes too!
* size of bitmap to track free blocks of physical memory is hardcoded to max.
* physical memory manager allocator naively implemented.
* kernel should run in high memory (~3gb) virutal mem. why? except v86 tasks?
* redesign keyboard interrupt handler (faster!)
* redesign command handling (not inside the interrupt!!!)
* implement a real shell (in user mode)
REFERENCES
==========
* LINUX KERNEL
* GNU HURD
* MINIX
* FreeBSD etc.
* xv6
* distributed OS?
* e1000 driver
* http://www.brokenthorn.com/Resources/OSDev17.html
* http://www.jamesmolloy.co.uk/tutorial_html/9.-Multitasking.html
* http://pdos.csail.mit.edu/6.828/2011/labs/lab6/
* http://wiki.osdev.org/Virtual_8086_Mode
* http://pdos.csail.mit.edu/6.828/2011/xv6.html
* man syscalls (posix syscalls?)
MY NOTES BELOW THIS LINE
========================
Linux Startup x86
-----------------
~ ontogeny recapitulates phylogeny ~
Some notes on the Linux statup process, or at least how I understand it.
1. arch/x86/boot/header.S
Contains the header and linux 16 bit code.
This code should be entered with a bootloader at the address specified
within the header (as _start) which will put us at 'start_of_setup'
Direct loading will put us at 'start2' at the very start which will
show an error message
If everyhing goes right we will enter the 16-bit real mode C module
with:
call main ; should not return
2. arch/x86/boot/main.c
void main(void) will do some checks and detections (cpu,mem,..) and
invoke: go_to_protected_mode();
3. arch/x86/boot/pm.c
go_to_protected_mode() - will disable interrupts and set up the initial
idt and gdt descriptor tables before calling: protected_mode_jump() and
passing the address of code32_start.
4. arch/x86/boot/pmjump.S
back in assembly-world the actual transition is made inside
'protected_mode_jump' and we move on to 'in_pm32' where the data segment
is set up and we jmpl to the 32-bit entry point of the kernel.
5. arch/x86/kernel/head32.c (assumption!?)
void i386_start_kernel(void)
6. init/main.c
start_kernel(void)
setup_arch()!!
Interrupts
----------
arch/x86/include/asm/irq_vectors.h each entry is 8 bytes
ISA interrupts:
0x30 0x0000 0x0000 0x0000 0x0000
0x31
0x32
..
0x3f
|