basic process support and some syscalls
[lunaix-os.git] / lunaix-os / kernel / lxinit.c
1 #include <hal/cpu.h>
2 #include <lunaix/syslog.h>
3 #include <lunaix/mm/kalloc.h>
4 #include <lunaix/mm/vmm.h>
5 #include <lunaix/spike.h>
6 #include <lunaix/clock.h>
7 #include <lunaix/timer.h>
8 #include <lunaix/keyboard.h>
9 #include <lunaix/tty/tty.h>
10 #include <lunaix/lunistd.h>
11 #include <lunaix/proc.h>
12
13 extern uint8_t __kernel_start;
14
15 LOG_MODULE("INIT")
16
17 void 
18 test_timer(void* payload);
19
20 void
21 _lxinit_main()
22 {
23     // 这里是就是LunaixOS的第一个进程了!
24     for (size_t i = 0; i < 10; i++)
25     {
26         pid_t pid = 0;
27         if (!(pid = fork())) {
28             while (1)
29             {
30                 // kprintf(KINFO "Process %d\n", i);
31                 tty_put_char('0'+i);
32                 yield();
33             }
34         }
35         kprintf(KINFO "Forked %d\n", pid);
36     }
37
38     // FIXME: 这里fork会造成下面lxmalloc产生Heap corruption,需要实现COW和加入mutex
39     // fork();
40       
41
42     char buf[64];
43
44     kprintf(KINFO "Hello higher half kernel world!\nWe are now running in virtual "
45            "address space!\n\n");
46
47     cpu_get_brand(buf);
48     kprintf("CPU: %s\n\n", buf);
49
50     void* k_start = vmm_v2p(&__kernel_start);
51     kprintf(KINFO "The kernel's base address mapping: %p->%p\n", &__kernel_start, k_start);
52
53     // test malloc & free
54
55     uint8_t** arr = (uint8_t**)lxmalloc(10 * sizeof(uint8_t*));
56
57     for (size_t i = 0; i < 10; i++) {
58         arr[i] = (uint8_t*)lxmalloc((i + 1) * 2);
59     }
60
61     for (size_t i = 0; i < 10; i++) {
62         lxfree(arr[i]);
63     }
64
65     uint8_t* big_ = lxmalloc(8192);
66     big_[0] = 123;
67     big_[1] = 23;
68     big_[2] = 3;
69
70     kprintf(KINFO "%u, %u, %u\n", big_[0], big_[1], big_[2]);
71
72     // good free
73     lxfree(arr);
74     lxfree(big_);
75
76     // timer_run_second(1, test_timer, NULL, TIMER_MODE_PERIODIC);
77
78     struct kdb_keyinfo_pkt keyevent;
79     while (1)
80     {
81         if (!kbd_recv_key(&keyevent)) {
82             continue;
83         }
84         if ((keyevent.state & KBD_KEY_FPRESSED) && (keyevent.keycode & 0xff00) <= KEYPAD) {
85             tty_put_char((char)(keyevent.keycode & 0x00ff));
86             tty_sync_cursor();
87         }
88     }
89     
90
91     spin();
92 }
93
94 static datetime_t datetime;
95
96 void test_timer(void* payload) {
97     clock_walltime(&datetime);
98
99     kprintf(KWARN "%u/%02u/%02u %02u:%02u:%02u\r",
100            datetime.year,
101            datetime.month,
102            datetime.day,
103            datetime.hour,
104            datetime.minute,
105            datetime.second);
106 }