优化项目结构
This commit is contained in:
parent
e700ab2dea
commit
9144d9f3bf
43
build.py
43
build.py
@ -21,6 +21,7 @@ if check_os() == "Windows":
|
|||||||
cd = os.getcwd() # 获取当前执行目录 'D:\CrashPowerDOS-main\'
|
cd = os.getcwd() # 获取当前执行目录 'D:\CrashPowerDOS-main\'
|
||||||
out = "target"
|
out = "target"
|
||||||
dir_ = "\\"
|
dir_ = "\\"
|
||||||
|
src = "src\\"
|
||||||
elif check_os() == "Linux":
|
elif check_os() == "Linux":
|
||||||
gcc = 'gcc.exe -w -std=gnu99 -I include/ -std=gnu99 -ffreestanding -c -Wincompatible-pointer-types '
|
gcc = 'gcc.exe -w -std=gnu99 -I include/ -std=gnu99 -ffreestanding -c -Wincompatible-pointer-types '
|
||||||
asm = 'gcc.exe'
|
asm = 'gcc.exe'
|
||||||
@ -29,6 +30,7 @@ elif check_os() == "Linux":
|
|||||||
cd = os.getcwd() # 获取当前执行目录 '\mnt\d\CrashPowerDOS-main\'
|
cd = os.getcwd() # 获取当前执行目录 '\mnt\d\CrashPowerDOS-main\'
|
||||||
out = "target"
|
out = "target"
|
||||||
dir_ = "/"
|
dir_ = "/"
|
||||||
|
src = "./src/"
|
||||||
|
|
||||||
|
|
||||||
def clean():
|
def clean():
|
||||||
@ -41,13 +43,13 @@ def clean():
|
|||||||
def build_boot(): # 构建引导程序
|
def build_boot(): # 构建引导程序
|
||||||
print("Building boot source code...")
|
print("Building boot source code...")
|
||||||
status = True
|
status = True
|
||||||
for file in os.listdir(cd + dir_ + 'boot'):
|
for file in os.listdir(cd + dir_ + src + 'boot'):
|
||||||
if status and file == 'boot.asm':
|
if status and file == 'boot.asm':
|
||||||
cmd = cd + asm + " " + cd + dir_ + "boot" + dir_ + file + " -o " + cd + dir_ + "target" + dir_ + \
|
cmd = cd + asm + " " + cd + dir_ + src + "boot" + dir_ + file + " -o " + cd + dir_ + "target" + dir_ + \
|
||||||
file.split(".")[0] + ".o"
|
file.split(".")[0] + ".o"
|
||||||
status = False
|
status = False
|
||||||
else:
|
else:
|
||||||
cmd = nasm + " " + cd + dir_ + "boot" + dir_ + file + " -o " + cd + dir_ + "target" + dir_ + \
|
cmd = nasm + " " + cd + dir_ + src + "boot" + dir_ + file + " -o " + cd + dir_ + "target" + dir_ + \
|
||||||
file.split(".")[0] + ".o"
|
file.split(".")[0] + ".o"
|
||||||
e = os.system(cmd) # os.system 执行命令 e为返回值(非0即不正常退出,可做判断终止构建流程)
|
e = os.system(cmd) # os.system 执行命令 e为返回值(非0即不正常退出,可做判断终止构建流程)
|
||||||
if e != 0:
|
if e != 0:
|
||||||
@ -57,8 +59,17 @@ def build_boot(): # 构建引导程序
|
|||||||
|
|
||||||
def build_driver(): # 构建内置驱动程序
|
def build_driver(): # 构建内置驱动程序
|
||||||
print("Building driver source code...")
|
print("Building driver source code...")
|
||||||
for file in os.listdir(cd + dir_ + 'driver'):
|
status_pci = True
|
||||||
cmd = cd + gcc + "-O2 " + "driver" + dir_ + file + " -o " + "target" + dir_ + file.split(".")[0] + ".o"
|
status_ide = True
|
||||||
|
for file in os.listdir(cd + dir_ + src + 'driver'):
|
||||||
|
if status_pci and (file == 'pci.c'):
|
||||||
|
cmd = cd + gcc + "-O0 " + src + "driver" + dir_ + file + " -o " + "target" + dir_ + file.split(".")[0] + ".o"
|
||||||
|
status_pci = False
|
||||||
|
elif status_ide and (file == 'ide.c'):
|
||||||
|
cmd = cd + gcc + "-O0 " + src + "driver" + dir_ + file + " -o " + "target" + dir_ + file.split(".")[0] + ".o"
|
||||||
|
status_ide = False
|
||||||
|
else:
|
||||||
|
cmd = cd + gcc + "-O0 " + src + "driver" + dir_ + file + " -o " + "target" + dir_ + file.split(".")[0] + ".o"
|
||||||
e = os.system(cmd)
|
e = os.system(cmd)
|
||||||
if e != 0:
|
if e != 0:
|
||||||
return -1
|
return -1
|
||||||
@ -67,8 +78,8 @@ def build_driver(): # 构建内置驱动程序
|
|||||||
|
|
||||||
def build_kernel(): # 构建内核本体
|
def build_kernel(): # 构建内核本体
|
||||||
print("Building kernel source code...")
|
print("Building kernel source code...")
|
||||||
for file in os.listdir(cd + dir_ + 'kernel'):
|
for file in os.listdir(cd + dir_ + src + 'kernel'):
|
||||||
cmd = cd + gcc + "-O2 " + "kernel" + dir_ + file + " -o " + "target" + dir_ + file.split(".")[0] + ".o"
|
cmd = cd + gcc + "-O0 " + src + "kernel" + dir_ + file + " -o " + "target" + dir_ + file.split(".")[0] + ".o"
|
||||||
e = os.system(cmd)
|
e = os.system(cmd)
|
||||||
if e != 0:
|
if e != 0:
|
||||||
return -1
|
return -1
|
||||||
@ -77,8 +88,8 @@ def build_kernel(): # 构建内核本体
|
|||||||
|
|
||||||
def build_data(): # 构建常用工具
|
def build_data(): # 构建常用工具
|
||||||
print("Building util source code...")
|
print("Building util source code...")
|
||||||
for file in os.listdir(cd + dir_ + 'util'):
|
for file in os.listdir(cd + dir_ + src + 'util'):
|
||||||
cmd = cd + gcc + "-O2 " + "util" + dir_ + file + " -o " + "target" + dir_ + file.split(".")[0] + ".o"
|
cmd = cd + gcc + "-O2 " + src + "util" + dir_ + file + " -o " + "target" + dir_ + file.split(".")[0] + ".o"
|
||||||
e = os.system(cmd)
|
e = os.system(cmd)
|
||||||
if e != 0:
|
if e != 0:
|
||||||
return -1
|
return -1
|
||||||
@ -87,8 +98,8 @@ def build_data(): # 构建常用工具
|
|||||||
|
|
||||||
def build_sysapp(): # 构建内置系统应用
|
def build_sysapp(): # 构建内置系统应用
|
||||||
print("Building sysapp source code...")
|
print("Building sysapp source code...")
|
||||||
for file in os.listdir(cd + dir_ + 'sysapp'):
|
for file in os.listdir(cd + dir_ + src + 'sysapp'):
|
||||||
cmd = cd + gcc + "-O2 " + "sysapp" + dir_ + file + " -o " + "target" + dir_ + file.split(".")[0] + ".o"
|
cmd = cd + gcc + "-O0 " + src + "sysapp" + dir_ + file + " -o " + "target" + dir_ + file.split(".")[0] + ".o"
|
||||||
e = os.system(cmd)
|
e = os.system(cmd)
|
||||||
if e != 0:
|
if e != 0:
|
||||||
return -1
|
return -1
|
||||||
@ -97,8 +108,8 @@ def build_sysapp(): # 构建内置系统应用
|
|||||||
|
|
||||||
def build_network(): # 构建网络系统
|
def build_network(): # 构建网络系统
|
||||||
print("Building network source code...")
|
print("Building network source code...")
|
||||||
for file in os.listdir(cd + dir_ + 'network'):
|
for file in os.listdir(cd + dir_ + src + 'network'):
|
||||||
cmd = cd + gcc + "-O2 " + "network" + dir_ + file + " -o " + "target" + dir_ + file.split(".")[0] + ".o"
|
cmd = cd + gcc + "-O0 " + src + "network" + dir_ + file + " -o " + "target" + dir_ + file.split(".")[0] + ".o"
|
||||||
e = os.system(cmd)
|
e = os.system(cmd)
|
||||||
if e != 0:
|
if e != 0:
|
||||||
return -1
|
return -1
|
||||||
@ -107,8 +118,8 @@ def build_network(): # 构建网络系统
|
|||||||
|
|
||||||
def build_fs(): # 构建文件系统
|
def build_fs(): # 构建文件系统
|
||||||
print("Building fs source code...")
|
print("Building fs source code...")
|
||||||
for file in os.listdir(cd + dir_ + 'fs'):
|
for file in os.listdir(cd + dir_ + src + 'fs'):
|
||||||
cmd = cd + gcc + " " + "fs" + dir_ + file + " -o " + "target" + dir_ + file.split(".")[0] + ".o"
|
cmd = cd + gcc + " " + src + "fs" + dir_ + file + " -o " + "target" + dir_ + file.split(".")[0] + ".o"
|
||||||
e = os.system(cmd)
|
e = os.system(cmd)
|
||||||
if e != 0:
|
if e != 0:
|
||||||
return -1
|
return -1
|
||||||
@ -162,3 +173,5 @@ a = linker()
|
|||||||
if a != 0:
|
if a != 0:
|
||||||
exit(-1)
|
exit(-1)
|
||||||
print("Launching i386 vm...")
|
print("Launching i386 vm...")
|
||||||
|
|
||||||
|
# launch()
|
||||||
|
@ -1,7 +0,0 @@
|
|||||||
#ifndef CRASHPOWEROS_DATE_H
|
|
||||||
#define CRASHPOWEROS_DATE_H
|
|
||||||
|
|
||||||
int setup_date();
|
|
||||||
void launch_date();
|
|
||||||
|
|
||||||
#endif //CRASHPOWEROS_DATE_H
|
|
@ -1,17 +0,0 @@
|
|||||||
#ifndef CRASHPOWEROS_PCAT_H
|
|
||||||
#define CRASHPOWEROS_PCAT_H
|
|
||||||
|
|
||||||
#include "task.h"
|
|
||||||
|
|
||||||
struct pcat_process{
|
|
||||||
uint32_t line;
|
|
||||||
uint32_t chars;
|
|
||||||
uint32_t buf_x,buf_y;
|
|
||||||
uint32_t buffer_screen;
|
|
||||||
int keys;
|
|
||||||
struct File *file;
|
|
||||||
};
|
|
||||||
|
|
||||||
void pcat_launch(struct File *file);
|
|
||||||
|
|
||||||
#endif
|
|
@ -105,6 +105,7 @@ void pci_config(unsigned int bus, unsigned int f, unsigned int equipment, unsign
|
|||||||
|
|
||||||
void init_pci(){
|
void init_pci(){
|
||||||
printf("[\035kernel\036]: Loading pci device...\n");
|
printf("[\035kernel\036]: Loading pci device...\n");
|
||||||
|
int PCI_NUM = 0;
|
||||||
|
|
||||||
PCI_ADDR_BASE = kmalloc(1 * 1024 * 1024);
|
PCI_ADDR_BASE = kmalloc(1 * 1024 * 1024);
|
||||||
unsigned int i, BUS, Equipment, F, ADDER, *i1;
|
unsigned int i, BUS, Equipment, F, ADDER, *i1;
|
||||||
@ -144,7 +145,7 @@ void init_pci(){
|
|||||||
PCI_DATA1 += 4;
|
PCI_DATA1 += 4;
|
||||||
int i = ((uint32_t)(bar.address));
|
int i = ((uint32_t)(bar.address));
|
||||||
memcpy(PCI_DATA1, &i, 4);
|
memcpy(PCI_DATA1, &i, 4);
|
||||||
printf("[pci]: Device Address: %08x Size: %d\n",bar.address,bar.size);
|
PCI_NUM++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
PCI_DATA = PCI_DATA + 0x110 + 4;
|
PCI_DATA = PCI_DATA + 0x110 + 4;
|
||||||
@ -154,4 +155,6 @@ void init_pci(){
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
printf("[pci]: Device Loaded: %d\n",PCI_NUM);
|
||||||
}
|
}
|
@ -17,12 +17,35 @@ extern uint8_t plfont[];
|
|||||||
|
|
||||||
bool vbe_status;
|
bool vbe_status;
|
||||||
|
|
||||||
|
static void copy_char(uint32_t *vram, int off_x, int off_y, int x, int y, int x1,
|
||||||
|
int y1, int xsize) {
|
||||||
|
for (int i = 0; i < 16; i++) {
|
||||||
|
for (int j = 0; j < 8; j++) {
|
||||||
|
vram[(y + i + off_y) * xsize + (j + x + off_x)] =
|
||||||
|
vram[(y1 + i + off_y) * xsize + (j + x1 + off_x)];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void vbe_scroll() {
|
void vbe_scroll() {
|
||||||
if (cx > c_width) {
|
if (cx > c_width) {
|
||||||
cx = 0;
|
cx = 0;
|
||||||
cy++;
|
cy++;
|
||||||
} else cx++;
|
} else cx++;
|
||||||
|
|
||||||
|
if (cy >= c_height){
|
||||||
|
cy = c_height - 1;
|
||||||
|
memcpy((void *)screen,
|
||||||
|
(void *)screen + width * 16 * sizeof(uint32_t),
|
||||||
|
width * (height - 16) * sizeof(uint32_t));
|
||||||
|
for (int i = (width * (height - 16));
|
||||||
|
i != (width * height); i++) {
|
||||||
|
screen[i] = back_color;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
if (cy >= c_height) {
|
if (cy >= c_height) {
|
||||||
cy = c_height - 1;
|
cy = c_height - 1;
|
||||||
for (int i = 0; i < height; i++) {
|
for (int i = 0; i < height; i++) {
|
||||||
@ -44,6 +67,7 @@ void vbe_scroll() {
|
|||||||
screen[height * (width + j) + i] = back_color;
|
screen[height * (width + j) + i] = back_color;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
void vbe_draw_char(char c, int32_t x, int32_t y) {
|
void vbe_draw_char(char c, int32_t x, int32_t y) {
|
||||||
@ -56,8 +80,9 @@ void vbe_draw_char(char c, int32_t x, int32_t y) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned char *font;
|
|
||||||
font = plfont;
|
uint8_t *font = ascfont;
|
||||||
|
|
||||||
font += c * 16;
|
font += c * 16;
|
||||||
for (int i = 0; i < 16; i++) {
|
for (int i = 0; i < 16; i++) {
|
||||||
for (int j = 0; j < 9; j++) {
|
for (int j = 0; j < 9; j++) {
|
||||||
@ -95,6 +120,10 @@ void vbe_putchar(char ch) {
|
|||||||
return;
|
return;
|
||||||
} else if (ch == '\r') {
|
} else if (ch == '\r') {
|
||||||
cx = 0;
|
cx = 0;
|
||||||
|
return;
|
||||||
|
} else if(ch == '\t'){
|
||||||
|
vbe_putchar(" ");
|
||||||
|
return;
|
||||||
} else if (ch == '\b' && cx > 0) {
|
} else if (ch == '\b' && cx > 0) {
|
||||||
cx -= 1;
|
cx -= 1;
|
||||||
if (cx == 0) {
|
if (cx == 0) {
|
||||||
@ -139,19 +168,10 @@ void initVBE(multiboot_t *info) {
|
|||||||
screen = (uint32_t) info->framebuffer_addr;
|
screen = (uint32_t) info->framebuffer_addr;
|
||||||
width = info->framebuffer_width;
|
width = info->framebuffer_width;
|
||||||
height = info->framebuffer_height;
|
height = info->framebuffer_height;
|
||||||
color = 0xFFFFFF;
|
color = 0xc6c6c6;
|
||||||
back_color = 0x310924;
|
back_color = 0x191f42;
|
||||||
c_width = width / 9;
|
c_width = width / 9;
|
||||||
c_height = height / 16;
|
c_height = height / 16;
|
||||||
|
|
||||||
vbe_clear();
|
vbe_clear();
|
||||||
|
|
||||||
/*
|
|
||||||
for (int i = 0; i < c_height; i++){
|
|
||||||
vbe_putchar('A');
|
|
||||||
vbe_putchar('\n');
|
|
||||||
}
|
|
||||||
|
|
||||||
while (1) io_hlt();
|
|
||||||
*/
|
|
||||||
}
|
}
|
@ -47,7 +47,7 @@ typedef union header {
|
|||||||
|
|
||||||
uint32_t memory_usage();
|
uint32_t memory_usage();
|
||||||
|
|
||||||
void *memcpy(void *dst_, const void *src_, uint32_t size);
|
void* memcpy(void* s, const void* ct, size_t n);
|
||||||
|
|
||||||
int memcmp(const void *a_, const void *b_, uint32_t size);
|
int memcmp(const void *a_, const void *b_, uint32_t size);
|
||||||
|
|
||||||
@ -89,6 +89,8 @@ void memclean(char *s, int len);
|
|||||||
|
|
||||||
void *realloc(void *ptr, uint32_t size);
|
void *realloc(void *ptr, uint32_t size);
|
||||||
|
|
||||||
page_t *get_phy_page(uint32_t address, int make, page_directory_t *dir);
|
void alloc_frame_line(page_t *page, unsigned line,int is_kernel, int is_writable);
|
||||||
|
|
||||||
|
void free_frame(page_t *page);
|
||||||
|
|
||||||
#endif //CRASHPOWEROS_MEMORY_H
|
#endif //CRASHPOWEROS_MEMORY_H
|
@ -1,7 +1,7 @@
|
|||||||
#ifndef CRASHPOWEROS_NET_H
|
#ifndef CRASHPOWEROS_NET_H
|
||||||
#define CRASHPOWEROS_NET_H
|
#define CRASHPOWEROS_NET_H
|
||||||
|
|
||||||
#include "../include/common.h"
|
#include "common.h"
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
bool (*find)();
|
bool (*find)();
|
4
src/include/panic.h
Normal file
4
src/include/panic.h
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
#ifndef CRASHPOWEROS_PANIC_H
|
||||||
|
#define CRASHPOWEROS_PANIC_H
|
||||||
|
|
||||||
|
#endif
|
@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
#define SECTORS_ONCE 8
|
#define SECTORS_ONCE 8
|
||||||
|
|
||||||
#include "../include/common.h"
|
#include "common.h"
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
void (*Read)(char drive, unsigned char *buffer, unsigned int number,
|
void (*Read)(char drive, unsigned char *buffer, unsigned int number,
|
@ -9,7 +9,6 @@
|
|||||||
#include "../include/cmos.h"
|
#include "../include/cmos.h"
|
||||||
#include "../include/keyboard.h"
|
#include "../include/keyboard.h"
|
||||||
#include "../include/shell.h"
|
#include "../include/shell.h"
|
||||||
#include "../include/date.h"
|
|
||||||
#include "../include/acpi.h"
|
#include "../include/acpi.h"
|
||||||
#include "../include/syscall.h"
|
#include "../include/syscall.h"
|
||||||
#include "../include/vdisk.h"
|
#include "../include/vdisk.h"
|
||||||
@ -85,7 +84,7 @@ void kernel_main(multiboot_t *multiboot) {
|
|||||||
printf("[kernel]: Keyboard driver load success!\n");
|
printf("[kernel]: Keyboard driver load success!\n");
|
||||||
io_sti();
|
io_sti();
|
||||||
|
|
||||||
kernel_thread(cur_task,NULL,"CPOS-VBE-SERVICE");
|
//kernel_thread(cur_task,NULL,"CPOS-VBE-SERVICE");
|
||||||
|
|
||||||
init_pit();
|
init_pit();
|
||||||
init_pci();
|
init_pci();
|
||||||
@ -99,22 +98,17 @@ void kernel_main(multiboot_t *multiboot) {
|
|||||||
vfs_mount_disk('A','A');
|
vfs_mount_disk('A','A');
|
||||||
if(vfs_change_disk('A'))
|
if(vfs_change_disk('A'))
|
||||||
printf("[FileSystem]: Change disk win!\n");
|
printf("[FileSystem]: Change disk win!\n");
|
||||||
else {
|
|
||||||
for(;;);
|
|
||||||
}
|
|
||||||
if(pcnet_find_card()){
|
if(pcnet_find_card()){
|
||||||
//init_pcnet_card();
|
//init_pcnet_card();
|
||||||
} else printf("[kernel]: Cannot found pcnet.\n");
|
} else printf("[kernel]: Cannot found pcnet.\n");
|
||||||
|
|
||||||
print_cpu_id();
|
print_cpu_id();
|
||||||
|
|
||||||
//printf("Memory: %dMB.",(multiboot->mem_upper + multiboot->mem_lower)/1024/1024);
|
|
||||||
|
|
||||||
clock_sleep(25);
|
clock_sleep(25);
|
||||||
|
|
||||||
int pid = kernel_thread(setup_shell, NULL, "CPOS-Shell");
|
int pid = kernel_thread(setup_shell, NULL, "CPOS-Shell");
|
||||||
kernel_thread(check_task,&pid,"CPOS-SHELL-CHECK");
|
kernel_thread(check_task,&pid,"CPOS-SHELL-CHECK");
|
||||||
launch_date();
|
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
io_hlt();
|
io_hlt();
|
@ -9,11 +9,12 @@ void memclean(char *s, int len) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
void *memcpy(void *dst_, const void *src_, uint32_t size) {
|
void* memcpy(void* s, const void* ct, size_t n) {
|
||||||
uint8_t *dst = dst_;
|
if (NULL == s || NULL == ct || n <= 0)
|
||||||
const uint8_t *src = src_;
|
return NULL;
|
||||||
while (size-- > 0) *dst++ = *src++;
|
while (n--)
|
||||||
return (void *) src_;
|
*(char*)s++ = *(char*)ct++;
|
||||||
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
int memcmp(const void *a_, const void *b_, uint32_t size) {
|
int memcmp(const void *a_, const void *b_, uint32_t size) {
|
@ -76,6 +76,7 @@ void alloc_frame_line(page_t *page, unsigned line,int is_kernel, int is_writable
|
|||||||
page->frame = line / 0x1000;
|
page->frame = line / 0x1000;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void free_frame(page_t *page) {
|
void free_frame(page_t *page) {
|
||||||
uint32_t frame = page->frame;
|
uint32_t frame = page->frame;
|
||||||
if (!frame) return;
|
if (!frame) return;
|
||||||
@ -211,6 +212,8 @@ void init_page(multiboot_t *mboot) {
|
|||||||
alloc_frame_line(get_page(j,1,kernel_directory),j,0,0);
|
alloc_frame_line(get_page(j,1,kernel_directory),j,0,0);
|
||||||
j += 0x1000;
|
j += 0x1000;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
for (int i = KHEAP_START; i < KHEAP_START + KHEAP_INITIAL_SIZE; i++) {
|
for (int i = KHEAP_START; i < KHEAP_START + KHEAP_INITIAL_SIZE; i++) {
|
||||||
alloc_frame(get_page(i, 1, kernel_directory), 0, 0);
|
alloc_frame(get_page(i, 1, kernel_directory), 0, 0);
|
||||||
}
|
}
|
@ -1,4 +1,5 @@
|
|||||||
#include "../include/syscall.h"
|
#include "../include/syscall.h"
|
||||||
|
#include "../include/printf.h"
|
||||||
#include "../include/isr.h"
|
#include "../include/isr.h"
|
||||||
|
|
||||||
void syscall_handler(registers_t *regs){
|
void syscall_handler(registers_t *regs){
|
||||||
@ -7,6 +8,8 @@ void syscall_handler(registers_t *regs){
|
|||||||
|
|
||||||
void *location = NULL;//syscalls[regs->eax];
|
void *location = NULL;//syscalls[regs->eax];
|
||||||
|
|
||||||
|
printf("Syscall Win: %08x\n",regs->eax);
|
||||||
|
|
||||||
int ret;
|
int ret;
|
||||||
asm volatile (" \
|
asm volatile (" \
|
||||||
push %1; \
|
push %1; \
|
@ -159,7 +159,6 @@ void change_task_to(struct task_struct *next) {
|
|||||||
|
|
||||||
switch_page_directory(current->pgd_dir);
|
switch_page_directory(current->pgd_dir);
|
||||||
switch_to(&(prev->context), &(current->context));
|
switch_to(&(prev->context), &(current->context));
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
1
src/sysapp/panic.c
Normal file
1
src/sysapp/panic.c
Normal file
@ -0,0 +1 @@
|
|||||||
|
#include "../include/panic.h"
|
@ -213,6 +213,27 @@ void cmd_cd(int argc, char **argv) {
|
|||||||
if (vfs_change_path(argv[1]) == 0) printf("Invalid path.\n");
|
if (vfs_change_path(argv[1]) == 0) printf("Invalid path.\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void cmd_type(int argc,char ** argv){
|
||||||
|
if (argc == 1) {
|
||||||
|
print("[Shell-TYPE]: If there are too few parameters, please specify the path.\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
char *buffer;
|
||||||
|
buffer = (char*) kmalloc(vfs_filesize(argv[1]));
|
||||||
|
|
||||||
|
if(buffer == NULL){
|
||||||
|
printf("Cannot read file.\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(vfs_readfile(argv[1],buffer))
|
||||||
|
printf("%s",buffer);
|
||||||
|
else printf("Cannot read file.\n");
|
||||||
|
|
||||||
|
kfree(buffer);
|
||||||
|
print("\n");
|
||||||
|
}
|
||||||
|
|
||||||
void cmd_disk(int argc, char **argv) {
|
void cmd_disk(int argc, char **argv) {
|
||||||
if (argc > 1) {
|
if (argc > 1) {
|
||||||
if (!strcmp("list", argv[1])) {
|
if (!strcmp("list", argv[1])) {
|
||||||
@ -285,6 +306,7 @@ char *user() {
|
|||||||
|
|
||||||
void setup_shell() {
|
void setup_shell() {
|
||||||
char *user1 = "default";//user();
|
char *user1 = "default";//user();
|
||||||
|
|
||||||
screen_clear();
|
screen_clear();
|
||||||
|
|
||||||
printf("Welcome to %s %s (CPOS Kernel x86_64)\n"
|
printf("Welcome to %s %s (CPOS Kernel x86_64)\n"
|
||||||
@ -324,8 +346,8 @@ void setup_shell() {
|
|||||||
|
|
||||||
if (!strcmp("version", argv[0]))
|
if (!strcmp("version", argv[0]))
|
||||||
printf("%s for x86 [%s]\n", OS_NAME, OS_VERSION);
|
printf("%s for x86 [%s]\n", OS_NAME, OS_VERSION);
|
||||||
else if (!strcmp("echo", argv[0]))
|
else if (!strcmp("type", argv[0]))
|
||||||
cmd_echo(argc, argv);
|
cmd_type(argc, argv);
|
||||||
else if (!strcmp("clear", argv[0]))
|
else if (!strcmp("clear", argv[0]))
|
||||||
screen_clear();
|
screen_clear();
|
||||||
else if (!strcmp("proc", argv[0]))
|
else if (!strcmp("proc", argv[0]))
|
||||||
@ -352,7 +374,7 @@ void setup_shell() {
|
|||||||
print("-=[CoolPotShell Helper]=-\n");
|
print("-=[CoolPotShell Helper]=-\n");
|
||||||
print("help ? h Print shell help info.\n");
|
print("help ? h Print shell help info.\n");
|
||||||
print("version Print os version.\n");
|
print("version Print os version.\n");
|
||||||
print("echo <msg> Print message.\n");
|
print("type <name> Read a file.\n");
|
||||||
print("ls List all files.\n");
|
print("ls List all files.\n");
|
||||||
print("mkdir <name> Make a directory.\n");
|
print("mkdir <name> Make a directory.\n");
|
||||||
print("del rm <name> Delete a file.\n");
|
print("del rm <name> Delete a file.\n");
|
@ -1,32 +0,0 @@
|
|||||||
#include "../include/date.h"
|
|
||||||
#include "../include/cmos.h"
|
|
||||||
#include "../include/graphics.h"
|
|
||||||
#include "../include/timer.h"
|
|
||||||
#include "../include/common.h"
|
|
||||||
|
|
||||||
extern uint16_t *terminal_buffer;
|
|
||||||
extern uint8_t terminal_color;
|
|
||||||
extern bool vbe_status;
|
|
||||||
|
|
||||||
int date_pid;
|
|
||||||
|
|
||||||
void launch_date(){
|
|
||||||
if(!vbe_status)
|
|
||||||
date_pid = kernel_thread(setup_date, NULL, "CPOS-Date");
|
|
||||||
}
|
|
||||||
|
|
||||||
int setup_date(){
|
|
||||||
char* date_info;
|
|
||||||
int i;
|
|
||||||
while (1){
|
|
||||||
clock_sleep(5);
|
|
||||||
date_info = get_date_time(); //11
|
|
||||||
i = 0;
|
|
||||||
for(size_t x = VGA_WIDTH - 19; x < VGA_WIDTH ; x++){
|
|
||||||
const size_t index = (VGA_HEIGHT - 1) * VGA_WIDTH + x;
|
|
||||||
terminal_buffer[index] = vga_entry(date_info[i],terminal_color);
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
126
sysapp/pcat.c
126
sysapp/pcat.c
@ -1,126 +0,0 @@
|
|||||||
#include "../include/pcat.h"
|
|
||||||
#include "../include/graphics.h"
|
|
||||||
#include "../include/keyboard.h"
|
|
||||||
#include "../include/date.h"
|
|
||||||
#include "../include/shell.h"
|
|
||||||
#include "../include/common.h"
|
|
||||||
|
|
||||||
struct task_struct *father_pcat;
|
|
||||||
struct pcat_process *this_process;
|
|
||||||
uint32_t pid_pcat;
|
|
||||||
extern KEY_STATUS *key_status;
|
|
||||||
extern uint16_t *terminal_buffer;
|
|
||||||
extern uint16_t cursor_x, cursor_y; // 光标位置
|
|
||||||
extern int date_pid;
|
|
||||||
|
|
||||||
static void pcat_movcur(){
|
|
||||||
cursor_x = this_process->buf_x;
|
|
||||||
cursor_y = this_process->buf_y;
|
|
||||||
move_cursor();
|
|
||||||
}
|
|
||||||
|
|
||||||
static void pcat_char(char c){
|
|
||||||
uint16_t *location;
|
|
||||||
uint8_t attribute = vga_entry_color(VGA_COLOR_DARK_GREY,VGA_COLOR_BLACK);
|
|
||||||
if(c == '\n'){
|
|
||||||
this_process->buf_y++;
|
|
||||||
this_process->buf_x = 0;
|
|
||||||
pcat_movcur();
|
|
||||||
return;
|
|
||||||
} else if (c == 0x09) {
|
|
||||||
location = terminal_buffer + (this_process->buf_y * 80 + this_process->buf_x);
|
|
||||||
*location = ' ' | attribute;
|
|
||||||
this_process->buf_x = (this_process->buf_x + 8) & ~(8 - 1);
|
|
||||||
pcat_movcur();
|
|
||||||
return;
|
|
||||||
} else if (c == '\b') {
|
|
||||||
if(this_process->buf_x){
|
|
||||||
this_process->buf_x--;
|
|
||||||
location = terminal_buffer + (this_process->buf_y * 80 + this_process->buf_x);
|
|
||||||
*location = ' ' | attribute;
|
|
||||||
} else{
|
|
||||||
if(this_process->buf_y){
|
|
||||||
this_process->buf_y--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
char* cc = (char*) this_process->buffer_screen;
|
|
||||||
int i = (this_process->chars)--;
|
|
||||||
cc[i] = '\0';
|
|
||||||
pcat_movcur();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
vga_putentryat(c, attribute,this_process->buf_x,this_process->buf_y);
|
|
||||||
this_process->buf_x++;
|
|
||||||
if (this_process->buf_x >= 80) {
|
|
||||||
this_process->buf_x = 0;
|
|
||||||
this_process->buf_y++;
|
|
||||||
}
|
|
||||||
pcat_movcur();
|
|
||||||
char* cc = (char*) this_process->buffer_screen;
|
|
||||||
int i = (this_process->chars)++;
|
|
||||||
cc[i] = c;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void draw_string(const char *data){
|
|
||||||
size_t size = strlen(data);
|
|
||||||
for (size_t i = 0; i < size; i++)
|
|
||||||
pcat_char(data[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void draw_menu(){
|
|
||||||
for (size_t x = 0; x < VGA_WIDTH; x++) {
|
|
||||||
vga_putentryat(' ',vga_entry_color(VGA_COLOR_BLACK,VGA_COLOR_LIGHT_GREY),x,(VGA_HEIGHT - 1));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static int input_handler(){
|
|
||||||
int index = 0;
|
|
||||||
char c;
|
|
||||||
while (1) {
|
|
||||||
c = getc();
|
|
||||||
|
|
||||||
if(c == 27){
|
|
||||||
this_process->keys = 1;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (c == '\b') {
|
|
||||||
if (index > 0) {
|
|
||||||
index--;
|
|
||||||
draw_string("\b \b");
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
index++;
|
|
||||||
pcat_char(c);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static int check_exit(){
|
|
||||||
return this_process->keys;
|
|
||||||
}
|
|
||||||
|
|
||||||
void pcat_launch(struct File *file){
|
|
||||||
screen_clear(); task_kill(date_pid); vga_clear();
|
|
||||||
this_process = (struct pcat_process*) kmalloc(sizeof(struct pcat_process));
|
|
||||||
this_process->buf_x = this_process->buf_y = 0;
|
|
||||||
this_process->line = 1;
|
|
||||||
this_process->chars = 0;
|
|
||||||
this_process->buffer_screen = (uint16_t) kmalloc(VGA_WIDTH * (VGA_HEIGHT - 1));
|
|
||||||
this_process->file = file;
|
|
||||||
this_process->keys = 0;
|
|
||||||
|
|
||||||
int pid = kernel_thread(input_handler,NULL,"CPOS-pcat");
|
|
||||||
|
|
||||||
while (1){
|
|
||||||
if(check_exit()){
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
draw_menu();
|
|
||||||
input_handler();
|
|
||||||
}
|
|
||||||
task_kill(pid);
|
|
||||||
screen_clear();
|
|
||||||
date_pid = kernel_thread(setup_date, NULL, "CPOS-Date");
|
|
||||||
}
|
|
Loading…
Reference in New Issue
Block a user