b2a9d9b88af16bce71be4cbe937061b580ec2ba9
[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             sleep(i);
29             if (i == 3) {
30                 i = *(int*)0x400000;
31             }
32             tty_put_char('0'+i);
33             _exit(0);
34         }
35         kprintf(KINFO "Forked %d\n", pid);
36     }
37
38     char buf[64];
39
40     kprintf(KINFO "Hello higher half kernel world!\nWe are now running in virtual "
41            "address space!\n\n");
42
43     cpu_get_brand(buf);
44     kprintf("CPU: %s\n\n", buf);
45
46     void* k_start = vmm_v2p(&__kernel_start);
47     kprintf(KINFO "The kernel's base address mapping: %p->%p\n", &__kernel_start, k_start);
48
49     // no lxmalloc here! This can only be used within kernel, but here, we are in a dedicated process!
50     // any access to kernel method must be done via syscall
51
52     struct kdb_keyinfo_pkt keyevent;
53     while (1)
54     {
55         if (!kbd_recv_key(&keyevent)) {
56             // yield();
57             continue;
58         }
59         if ((keyevent.state & KBD_KEY_FPRESSED) && (keyevent.keycode & 0xff00) <= KEYPAD) {
60             tty_put_char((char)(keyevent.keycode & 0x00ff));
61             tty_sync_cursor();
62         }
63     }
64     
65
66     spin();
67 }
68
69 static datetime_t datetime;
70
71 void test_timer(void* payload) {
72     clock_walltime(&datetime);
73
74     kprintf(KWARN "%u/%02u/%02u %02u:%02u:%02u\r",
75            datetime.year,
76            datetime.month,
77            datetime.day,
78            datetime.hour,
79            datetime.minute,
80            datetime.second);
81 }