course 5 and some old slides
authorMinep <zelong56@gmail.com>
Sat, 12 Feb 2022 17:18:57 +0000 (17:18 +0000)
committerMinep <zelong56@gmail.com>
Sat, 12 Feb 2022 17:18:57 +0000 (17:18 +0000)
32 files changed:
lunaix-os/.gitignore
lunaix-os/.vscode/settings.json [new file with mode: 0644]
lunaix-os/arch/x86/boot.S
lunaix-os/arch/x86/gdt.c [new file with mode: 0644]
lunaix-os/build/bin/lunaix.bin
lunaix-os/build/iso/boot/lunaix.bin
lunaix-os/build/lunaix.iso
lunaix-os/build/obj/arch/x86/boot.S.o
lunaix-os/build/obj/arch/x86/gdt.c.o [new file with mode: 0644]
lunaix-os/build/obj/kernel/kernel.c.o
lunaix-os/build/obj/kernel/tty/tty.c.o
lunaix-os/build/obj/libs/libc/string/mem.c.o [new file with mode: 0644]
lunaix-os/build/obj/libs/libc/string/strlen.c.o [new file with mode: 0644]
lunaix-os/includes/libc/string.h [new file with mode: 0644]
lunaix-os/includes/lunaix/arch/gdt.h [new file with mode: 0644]
lunaix-os/includes/lunaix/tty/tty.h
lunaix-os/kernel/kernel.c
lunaix-os/kernel/tty/tty.c
lunaix-os/libs/libc/string/mem.c [new file with mode: 0755]
lunaix-os/libs/libc/string/strlen.c [new file with mode: 0644]
lunaix-os/makefile
practice-c4/.~lock.slides.odp# [new file with mode: 0644]
practice-c4/slides.odp [new file with mode: 0644]
previous-slides/介绍.pptx [new file with mode: 0755]
previous-slides/保护模式.pptx [new file with mode: 0755]
previous-slides/保护模式下的内存.pptx [new file with mode: 0755]
previous-slides/初识汇编.pptx [new file with mode: 0755]
previous-slides/实模式寻址.pptx [new file with mode: 0755]
previous-slides/操作系统架构.pptx [new file with mode: 0755]
previous-slides/汇编简介.pptx [new file with mode: 0755]
previous-slides/磁盘操作.pptx [new file with mode: 0755]
previous-slides/计算机架构.pptx [new file with mode: 0755]

index 995bba6cb2c9b014ea4ea5187ebe086d8c848f3d..2de16c8ec5bd13cafc8c3239ebf6a4a46c856f77 100644 (file)
@@ -1 +1 @@
-dump
+dump*
diff --git a/lunaix-os/.vscode/settings.json b/lunaix-os/.vscode/settings.json
new file mode 100644 (file)
index 0000000..55dd62f
--- /dev/null
@@ -0,0 +1,6 @@
+{
+    "files.associations": {
+        "string.h": "c",
+        "stdint.h": "c"
+    }
+}
\ No newline at end of file
index 29746eefd052fd4c36f8d51c2f6f58449b35e638..1eddb52c1af6b97a0663b6773689f59e21aa9907 100644 (file)
@@ -14,7 +14,9 @@
 
 .section .text
     .global start_
-    .type start_, @function
+    .type start_, @function     /* Optional, this just give the 
+                                 * linker more knowledge about the label 
+                                 */
     start_:
         movl $stack_top, %esp
         /* 
                 3. Enable paging
         */
         call _kernel_init
+        
+        subl $0x6, %esp
+        movl $_gdt, 2(%esp)
+        movw _gdt_limit, %ax
+        movw %ax, (%esp)
+        lgdt (%esp)
+        addl $0x6, %esp
 
+        movw $0x10, %cx
+        movw %cx, %es
+        movw %cx, %ds
+        movw %cx, %fs
+        movw %cx, %gs
+        movw %cx, %ss
+
+        pushw $0x08
+        pushl $_after_gdt
+        retf
+
+    _after_gdt:
         pushl %ebx
         call _kernel_main
 
diff --git a/lunaix-os/arch/x86/gdt.c b/lunaix-os/arch/x86/gdt.c
new file mode 100644 (file)
index 0000000..a59f3d2
--- /dev/null
@@ -0,0 +1,22 @@
+#include <lunaix/arch/gdt.h>
+#include <stdint.h>
+
+#define GDT_ENTRY 5
+
+uint64_t _gdt[GDT_ENTRY];
+uint16_t _gdt_limit = sizeof(_gdt);
+
+void _set_gdt_entry(uint32_t index, uint32_t base, uint32_t limit, uint32_t flags) {
+    _gdt[index] = SEG_BASE_H(base) | flags | SEG_LIM_H(limit) | SEG_BASE_M(base);
+    _gdt[index] <<= 32;
+    _gdt[index] |= SEG_BASE_L(base) | SEG_LIM_L(limit);
+}
+// 
+void
+_init_gdt() {
+    _set_gdt_entry(0, 0, 0, 0);
+    _set_gdt_entry(1, 0, 0xfffff, SEG_R0_CODE);
+    _set_gdt_entry(2, 0, 0xfffff, SEG_R0_DATA);
+    _set_gdt_entry(3, 0, 0xfffff, SEG_R3_CODE);
+    _set_gdt_entry(4, 0, 0xfffff, SEG_R3_DATA);
+}
\ No newline at end of file
index 45dc7395a2f145afbffbec01de26f90f4febd260..9c090b731c5d14bb61e19c188a73ef5548e46c70 100755 (executable)
Binary files a/lunaix-os/build/bin/lunaix.bin and b/lunaix-os/build/bin/lunaix.bin differ
index 45dc7395a2f145afbffbec01de26f90f4febd260..9c090b731c5d14bb61e19c188a73ef5548e46c70 100755 (executable)
Binary files a/lunaix-os/build/iso/boot/lunaix.bin and b/lunaix-os/build/iso/boot/lunaix.bin differ
index 4ce0616613f263316a26d2879965e08145f104aa..bd5ca47ace31cf52a9b73793c697342137358647 100644 (file)
Binary files a/lunaix-os/build/lunaix.iso and b/lunaix-os/build/lunaix.iso differ
index 3eafda4ce9d0b48fae46365eb110566ff20e08ad..d2dcbc2079f11986635335c4c7ad4a83c974ae1e 100644 (file)
Binary files a/lunaix-os/build/obj/arch/x86/boot.S.o and b/lunaix-os/build/obj/arch/x86/boot.S.o differ
diff --git a/lunaix-os/build/obj/arch/x86/gdt.c.o b/lunaix-os/build/obj/arch/x86/gdt.c.o
new file mode 100644 (file)
index 0000000..e413f5e
Binary files /dev/null and b/lunaix-os/build/obj/arch/x86/gdt.c.o differ
index 3bcce395d3393a2426c6b907829ea725e395fb39..575799c5060d625a0f769747f7b64f9561a9cdc4 100644 (file)
Binary files a/lunaix-os/build/obj/kernel/kernel.c.o and b/lunaix-os/build/obj/kernel/kernel.c.o differ
index f60101239973bb1613164103be6950a0f82eaeb6..ad73e428806b2bfb4b233ec4e6804d51459c5564 100644 (file)
Binary files a/lunaix-os/build/obj/kernel/tty/tty.c.o and b/lunaix-os/build/obj/kernel/tty/tty.c.o differ
diff --git a/lunaix-os/build/obj/libs/libc/string/mem.c.o b/lunaix-os/build/obj/libs/libc/string/mem.c.o
new file mode 100644 (file)
index 0000000..2de8f3f
Binary files /dev/null and b/lunaix-os/build/obj/libs/libc/string/mem.c.o differ
diff --git a/lunaix-os/build/obj/libs/libc/string/strlen.c.o b/lunaix-os/build/obj/libs/libc/string/strlen.c.o
new file mode 100644 (file)
index 0000000..5870329
Binary files /dev/null and b/lunaix-os/build/obj/libs/libc/string/strlen.c.o differ
diff --git a/lunaix-os/includes/libc/string.h b/lunaix-os/includes/libc/string.h
new file mode 100644 (file)
index 0000000..eeade75
--- /dev/null
@@ -0,0 +1,21 @@
+#ifndef _STRING_H
+#define _STRING_H 1
+
+#include <stddef.h>
+
+int
+memcmp(const void*, const void*, size_t);
+
+void*
+memcpy(void* __restrict, const void* __restrict, size_t);
+
+void*
+memmove(void*, const void*, size_t);
+
+void*
+memset(void*, int, size_t);
+
+size_t
+strlen(const char* str);
+
+#endif
\ No newline at end of file
diff --git a/lunaix-os/includes/lunaix/arch/gdt.h b/lunaix-os/includes/lunaix/arch/gdt.h
new file mode 100644 (file)
index 0000000..b680f6f
--- /dev/null
@@ -0,0 +1,51 @@
+#define SD_TYPE(x)              (x << 8)
+#define SD_CODE_DATA(x)         (x << 12)
+#define SD_DPL(x)               (x << 13)
+#define SD_PRESENT(x)           (x << 15)
+#define SD_AVL(x)               (x << 20)
+#define SD_64BITS(x)            (x << 21)
+#define SD_32BITS(x)            (x << 22)
+#define SD_4K_GRAN(x)           (x << 23)
+
+#define SEG_LIM_L(x)            (x & 0x0ffff)
+#define SEG_LIM_H(x)            (x & 0xf0000)
+#define SEG_BASE_L(x)           ((x & 0x0000ffff) << 16)
+#define SEG_BASE_M(x)           ((x & 0x00ff0000) >> 16)
+#define SEG_BASE_H(x)            (x & 0xff000000)
+
+#define SEG_DATA_RD         0x00 // Read-Only
+#define SEG_DATA_RDA        0x01 // Read-Only, accessed
+#define SEG_DATA_RDWR       0x02 // Read/Write
+#define SEG_DATA_RDWRA      0x03 // Read/Write, accessed
+#define SEG_DATA_RDEXPD     0x04 // Read-Only, expand-down
+#define SEG_DATA_RDEXPDA    0x05 // Read-Only, expand-down, accessed
+#define SEG_DATA_RDWREXPD   0x06 // Read/Write, expand-down
+#define SEG_DATA_RDWREXPDA  0x07 // Read/Write, expand-down, accessed
+#define SEG_CODE_EX         0x08 // Execute-Only
+#define SEG_CODE_EXA        0x09 // Execute-Only, accessed
+#define SEG_CODE_EXRD       0x0A // Execute/Read
+#define SEG_CODE_EXRDA      0x0B // Execute/Read, accessed
+#define SEG_CODE_EXC        0x0C // Execute-Only, conforming
+#define SEG_CODE_EXCA       0x0D // Execute-Only, conforming, accessed
+#define SEG_CODE_EXRDC      0x0E // Execute/Read, conforming
+#define SEG_CODE_EXRDCA     0x0F // Execute/Read, conforming, accessed
+
+#define SEG_R0_CODE         SD_TYPE(SEG_CODE_EXRD) | SD_CODE_DATA(1) | SD_DPL(0) | \
+                            SD_PRESENT(1) | SD_AVL(0) | SD_64BITS(0) | SD_32BITS(1) | \
+                            SD_4K_GRAN(1)
+
+#define SEG_R0_DATA         SD_TYPE(SEG_DATA_RDWR) | SD_CODE_DATA(1) | SD_DPL(0) | \
+                            SD_PRESENT(1) | SD_AVL(0) | SD_64BITS(0) | SD_32BITS(1) | \
+                            SD_4K_GRAN(1)
+
+#define SEG_R3_CODE         SD_TYPE(SEG_CODE_EXRD) | SD_CODE_DATA(1) | SD_DPL(3) | \
+                            SD_PRESENT(1) | SD_AVL(0) | SD_64BITS(0) | SD_32BITS(1) | \
+                            SD_4K_GRAN(1)
+
+#define SEG_R3_DATA         SD_TYPE(SEG_DATA_RDWR) | SD_CODE_DATA(1) | SD_DPL(3) | \
+                            SD_PRESENT(1) | SD_AVL(0) | SD_64BITS(0) | SD_32BITS(1) | \
+                            SD_4K_GRAN(1)
+                            
+
+void
+_init_gdt();
\ No newline at end of file
index b470fdc501152d8eede0cd836fd1fbfa8bb4964b..c1a9a92a258fe9f11aa12db353532ff84f68f26e 100644 (file)
@@ -1,4 +1,4 @@
-typedef unsigned short vga_atrributes; 
+typedef unsigned short vga_attribute;
 
 #define VGA_COLOR_BLACK 0
 #define VGA_COLOR_BLUE 1
@@ -17,8 +17,17 @@ typedef unsigned short vga_atrributes;
 #define VGA_COLOR_LIGHT_BROWN 14
 #define VGA_COLOR_WHITE 15
 
-void tty_set_theme(vga_atrributes fg, vga_atrributes bg);
-void tty_put_char(char chr);
-void tty_put_str(char* str);
-void tty_scroll_up();
-void tty_clear();
\ No newline at end of file
+void
+tty_set_theme(vga_attribute fg, vga_attribute bg);
+
+void
+tty_put_char(char chr);
+
+void
+tty_put_str(char* str);
+
+void
+tty_scroll_up();
+
+void
+tty_clear();
\ No newline at end of file
index f9c7c4c5379d429186f4e5cff01e67dc468854e3..b0ef73053d186b44b600d5f7551fa6f11670bee7 100644 (file)
@@ -1,10 +1,18 @@
 #include <lunaix/tty/tty.h>
+#include <lunaix/arch/gdt.h>
 
-void _kernel_init() {
+void
+_kernel_init()
+{
     // TODO
+    _init_gdt();
 }
 
-void _kernel_main(void* info_table) {
+void
+_kernel_main(void* info_table)
+{
+    // remove the warning
+    (void)info_table;
     // TODO
     tty_set_theme(VGA_COLOR_GREEN, VGA_COLOR_BLACK);
     tty_put_str("Hello kernel world!\nThis is second line.");
index cb4f1b4bc76cc69f8ea68a1e4ba2136bf0c0143a..db9c28b572decbe640339f229156da15816a0755 100644 (file)
@@ -1,58 +1,76 @@
+#include <libc/string.h>
 #include <lunaix/tty/tty.h>
 #include <stdint.h>
 
 #define TTY_WIDTH 80
 #define TTY_HEIGHT 25
 
-vga_atrributes *buffer = 0xB8000;
+vga_attribute* buffer = (vga_attribute*)0xB8000;
 
-vga_atrributes theme_color = VGA_COLOR_BLACK;
+vga_attribute theme_color = VGA_COLOR_BLACK;
 
-uint32_t TTY_COLUMN = 0;
-uint16_t TTY_ROW = 0;
+uint32_t tty_x = 0;
+uint16_t tty_y = 0;
 
-void tty_set_theme(vga_atrributes fg, vga_atrributes bg) {
+void
+tty_set_theme(vga_attribute fg, vga_attribute bg)
+{
     theme_color = (bg << 4 | fg) << 8;
 }
 
-void tty_put_char(char chr) {
-    if (chr == '\n') {
-        TTY_COLUMN = 0;
-        TTY_ROW++;
-    }
-    else if (chr == '\r') {
-        TTY_COLUMN = 0;
-    }
-    else {
-        *(buffer + TTY_COLUMN + TTY_ROW * TTY_WIDTH) = (theme_color | chr);
-        TTY_COLUMN++;
-        if (TTY_COLUMN >= TTY_WIDTH) {
-            TTY_COLUMN = 0;
-            TTY_ROW++;
-        }
+void
+tty_put_char(char chr)
+{
+    switch (chr) {
+        case '\t':
+            tty_x += 4;
+            break;
+        case '\n':
+            tty_x = 0;
+            tty_y++;
+            break;
+        case '\r':
+            tty_x = 0;
+            break;
+        default:
+            *(buffer + tty_x + tty_y * TTY_WIDTH) = (theme_color | chr);
+            tty_x++;
+            break;
     }
 
-    if (TTY_ROW >= TTY_HEIGHT) {
+    if (tty_x >= TTY_WIDTH) {
+        tty_x = 0;
+        tty_y++;
+    }
+    if (tty_y >= TTY_HEIGHT) {
         tty_scroll_up();
-        TTY_ROW--;
-    } 
+    }
 }
 
-void tty_put_str(char* str) {
+void
+tty_put_str(char* str)
+{
     while (*str != '\0') {
         tty_put_char(*str);
         str++;
     }
 }
 
-void tty_scroll_up() {
-    // TODO use memcpy
+void
+tty_scroll_up()
+{
+    size_t last_line = TTY_WIDTH * (TTY_HEIGHT - 1);
+    memcpy(buffer, buffer + TTY_WIDTH, last_line);
+    for (size_t i = 0; i < TTY_WIDTH; i++) {
+        *(buffer + i + last_line) = theme_color;
+    }
+    tty_y = tty_y == 0 ? 0 : tty_y - 1;
 }
 
-void tty_clear() {
-    for (uint32_t x = 0; x < TTY_WIDTH; x++) {
-        for (uint32_t y = 0; y < TTY_HEIGHT; y++) {
-            *(buffer + x + y * TTY_WIDTH) = theme_color;
-        }
+void
+tty_clear()
+{
+    for (uint32_t i = 0; i < TTY_WIDTH * TTY_HEIGHT; i++) {
+        *(buffer + i) = theme_color;
     }
 }
\ No newline at end of file
diff --git a/lunaix-os/libs/libc/string/mem.c b/lunaix-os/libs/libc/string/mem.c
new file mode 100755 (executable)
index 0000000..7b20725
--- /dev/null
@@ -0,0 +1,54 @@
+#include <stdint.h>
+#include <libc/string.h>
+
+void*
+memcpy(void* dest, const void* src, size_t num)
+{
+    uint8_t* dest_ptr = (uint8_t*)dest;
+    const uint8_t* src_ptr = (const uint8_t*)src;
+    for (size_t i = 0; i < num; i++) {
+        *(dest_ptr + i) = *(src_ptr + i);
+    }
+    return dest;
+}
+
+void*
+memmove(void* dest, const void* src, size_t num)
+{
+    uint8_t* dest_ptr = (uint8_t*)dest;
+    const uint8_t* src_ptr = (const uint8_t*)src;
+    if (dest_ptr < src_ptr) {
+        for (size_t i = 0; i < num; i++) {
+            *(dest_ptr + i) = *(src_ptr + i);
+        }
+    } else {
+        for (size_t i = num; i != 0; i--) {
+            *(dest_ptr + i - 1) = *(src_ptr + i - 1);
+        }
+    }
+    return dest;
+}
+
+void*
+memset(void* ptr, int value, size_t num)
+{
+    uint8_t* c_ptr = (uint8_t*)ptr;
+    for (size_t i = 0; i < num; i++) {
+        *(c_ptr + i) = (uint8_t)value;
+    }
+    return ptr;
+}
+
+int
+memcmp(const void* ptr1, const void* ptr2, size_t num)
+{
+    uint8_t* p1 = (uint8_t*)ptr1;
+    uint8_t* p2 = (uint8_t*)ptr2;
+    for (size_t i = 0; i < num; i++) {
+        int diff = *(p1 + i) - *(p2 + i);
+        if (diff != 0) {
+            return diff;
+        }
+    }
+    return 0;
+}
\ No newline at end of file
diff --git a/lunaix-os/libs/libc/string/strlen.c b/lunaix-os/libs/libc/string/strlen.c
new file mode 100644 (file)
index 0000000..8b26def
--- /dev/null
@@ -0,0 +1,10 @@
+#include <libc/string.h>
+
+size_t
+strlen(const char* str)
+{
+    size_t len = 0;
+    while (str[len])
+        len++;
+    return len;
+}
\ No newline at end of file
index 2ffc9304c692e0d72bc252a331c4945907c0dc81..c7531fb2cad3549fe9e8ba339e58ab84d590edda 100644 (file)
@@ -18,7 +18,7 @@ OS_ISO = $(OS_NAME).iso
 CC := i686-elf-gcc
 AS := i686-elf-as
 
-O := -O3
+O := -O2
 W := -Wall -Wextra
 CFLAGS := -std=gnu99 -ffreestanding $(O) $(W)
 LDFLAGS := -ffreestanding $(O) -nostdlib -lgcc
diff --git a/practice-c4/.~lock.slides.odp# b/practice-c4/.~lock.slides.odp#
new file mode 100644 (file)
index 0000000..2039466
--- /dev/null
@@ -0,0 +1 @@
+,lxsky,lunaixsky-PC,12.02.2022 15:08,file:///home/lxsky/.config/libreoffice/4;
\ No newline at end of file
diff --git a/practice-c4/slides.odp b/practice-c4/slides.odp
new file mode 100644 (file)
index 0000000..8b8f9b0
Binary files /dev/null and b/practice-c4/slides.odp differ
diff --git a/previous-slides/介绍.pptx b/previous-slides/介绍.pptx
new file mode 100755 (executable)
index 0000000..daf3735
Binary files /dev/null and "b/previous-slides/\344\273\213\347\273\215.pptx" differ
diff --git a/previous-slides/保护模式.pptx b/previous-slides/保护模式.pptx
new file mode 100755 (executable)
index 0000000..a2784bd
Binary files /dev/null and "b/previous-slides/\344\277\235\346\212\244\346\250\241\345\274\217.pptx" differ
diff --git a/previous-slides/保护模式下的内存.pptx b/previous-slides/保护模式下的内存.pptx
new file mode 100755 (executable)
index 0000000..5fbdfe9
Binary files /dev/null and "b/previous-slides/\344\277\235\346\212\244\346\250\241\345\274\217\344\270\213\347\232\204\345\206\205\345\255\230.pptx" differ
diff --git a/previous-slides/初识汇编.pptx b/previous-slides/初识汇编.pptx
new file mode 100755 (executable)
index 0000000..db28661
Binary files /dev/null and "b/previous-slides/\345\210\235\350\257\206\346\261\207\347\274\226.pptx" differ
diff --git a/previous-slides/实模式寻址.pptx b/previous-slides/实模式寻址.pptx
new file mode 100755 (executable)
index 0000000..47c5465
Binary files /dev/null and "b/previous-slides/\345\256\236\346\250\241\345\274\217\345\257\273\345\235\200.pptx" differ
diff --git a/previous-slides/操作系统架构.pptx b/previous-slides/操作系统架构.pptx
new file mode 100755 (executable)
index 0000000..42e0aac
Binary files /dev/null and "b/previous-slides/\346\223\215\344\275\234\347\263\273\347\273\237\346\236\266\346\236\204.pptx" differ
diff --git a/previous-slides/汇编简介.pptx b/previous-slides/汇编简介.pptx
new file mode 100755 (executable)
index 0000000..c1f2ad5
Binary files /dev/null and "b/previous-slides/\346\261\207\347\274\226\347\256\200\344\273\213.pptx" differ
diff --git a/previous-slides/磁盘操作.pptx b/previous-slides/磁盘操作.pptx
new file mode 100755 (executable)
index 0000000..eceac1d
Binary files /dev/null and "b/previous-slides/\347\243\201\347\233\230\346\223\215\344\275\234.pptx" differ
diff --git a/previous-slides/计算机架构.pptx b/previous-slides/计算机架构.pptx
new file mode 100755 (executable)
index 0000000..bcdce68
Binary files /dev/null and "b/previous-slides/\350\256\241\347\256\227\346\234\272\346\236\266\346\236\204.pptx" differ