加入重启功能, 可以计算内存利用率
This commit is contained in:
parent
b197e88cb4
commit
048f85123d
@ -2,7 +2,7 @@
|
|||||||
#define CRASHPOWEROS_COMMON_H
|
#define CRASHPOWEROS_COMMON_H
|
||||||
|
|
||||||
#define OS_NAME "CrashPowerDOS"
|
#define OS_NAME "CrashPowerDOS"
|
||||||
#define OS_VERSION "v0.2.0"
|
#define OS_VERSION "v0.2.1"
|
||||||
|
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
@ -43,6 +43,8 @@ typedef union header {
|
|||||||
ALIGN stub;
|
ALIGN stub;
|
||||||
} header_t;
|
} header_t;
|
||||||
|
|
||||||
|
uint32_t memory_usage();
|
||||||
|
|
||||||
void *memcpy(void *dst_, const void *src_, uint32_t size);
|
void *memcpy(void *dst_, const void *src_, uint32_t size);
|
||||||
|
|
||||||
int memcmp(const void *a_, const void *b_, uint32_t size);
|
int memcmp(const void *a_, const void *b_, uint32_t size);
|
||||||
|
@ -12,5 +12,11 @@ void setup_shell();
|
|||||||
void cmd_echo(int argc,char **argv);
|
void cmd_echo(int argc,char **argv);
|
||||||
void cmd_proc();
|
void cmd_proc();
|
||||||
void cmd_date();
|
void cmd_date();
|
||||||
|
void cmd_reset();
|
||||||
|
void cmd_del(int argc, char **argv);
|
||||||
|
void cmd_mkdir(int argc, char **argv);
|
||||||
|
void cmd_read(int argc, char **argv);
|
||||||
|
void cmd_cat(int argc, char **argv);
|
||||||
|
void cmd_ls();
|
||||||
|
|
||||||
#endif //CRASHPOWEROS_SHELL_H
|
#endif //CRASHPOWEROS_SHELL_H
|
||||||
|
@ -21,17 +21,13 @@ struct context {
|
|||||||
uint32_t eflags;
|
uint32_t eflags;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct mm_struct {
|
|
||||||
page_directory_t *pgd_dir; // 进程页表
|
|
||||||
};
|
|
||||||
|
|
||||||
// 进程控制块 PCB
|
// 进程控制块 PCB
|
||||||
struct task_struct {
|
struct task_struct {
|
||||||
volatile task_state state; // 进程当前状态
|
volatile task_state state; // 进程当前状态
|
||||||
int pid; // 进程标识符
|
int pid; // 进程标识符
|
||||||
char *name; // 进程名
|
char *name; // 进程名
|
||||||
void *stack; // 进程的内核栈地址
|
void *stack; // 进程的内核栈地址
|
||||||
struct mm_struct *mm; // 当前进程的内存地址映像
|
page_directory_t *pgd_dir; // 进程页表
|
||||||
struct context context; // 进程切换需要的上下文信息
|
struct context context; // 进程切换需要的上下文信息
|
||||||
struct task_struct *next; // 链表指针
|
struct task_struct *next; // 链表指针
|
||||||
};
|
};
|
||||||
|
@ -13,7 +13,6 @@
|
|||||||
extern uint32_t end;
|
extern uint32_t end;
|
||||||
uint32_t placement_address = (uint32_t) & end;
|
uint32_t placement_address = (uint32_t) & end;
|
||||||
|
|
||||||
|
|
||||||
void kernel_main() {
|
void kernel_main() {
|
||||||
io_cli();
|
io_cli();
|
||||||
vga_install();
|
vga_install();
|
||||||
@ -28,6 +27,7 @@ void kernel_main() {
|
|||||||
printf("[kernel]: PCB load success!\n");
|
printf("[kernel]: PCB load success!\n");
|
||||||
init_keyboard();
|
init_keyboard();
|
||||||
printf("[kernel]: Keyboard driver load success!\n");
|
printf("[kernel]: Keyboard driver load success!\n");
|
||||||
|
|
||||||
print_cpu_id();
|
print_cpu_id();
|
||||||
io_sti();
|
io_sti();
|
||||||
|
|
||||||
|
@ -6,6 +6,18 @@ extern uint32_t end; // declared in linker.ld
|
|||||||
static uint32_t placement_address = (uint32_t) &end;
|
static uint32_t placement_address = (uint32_t) &end;
|
||||||
void *program_break, *program_break_end;
|
void *program_break, *program_break_end;
|
||||||
|
|
||||||
|
uint32_t memory_usage(){
|
||||||
|
header_t *curr = head;
|
||||||
|
uint32_t size;
|
||||||
|
while (curr) {
|
||||||
|
if(!curr->s.is_free){
|
||||||
|
size += curr->s.size;
|
||||||
|
}
|
||||||
|
curr = curr->s.next;
|
||||||
|
}
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
|
||||||
static uint32_t kmalloc_int(uint32_t sz, uint32_t align, uint32_t *phys) {
|
static uint32_t kmalloc_int(uint32_t sz, uint32_t align, uint32_t *phys) {
|
||||||
if (program_break) {
|
if (program_break) {
|
||||||
// 有内存堆
|
// 有内存堆
|
||||||
@ -24,6 +36,7 @@ static uint32_t kmalloc_int(uint32_t sz, uint32_t align, uint32_t *phys) {
|
|||||||
if (phys) *phys = placement_address;
|
if (phys) *phys = placement_address;
|
||||||
uint32_t tmp = placement_address;
|
uint32_t tmp = placement_address;
|
||||||
placement_address += sz;
|
placement_address += sz;
|
||||||
|
|
||||||
return tmp;
|
return tmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6,6 +6,8 @@ struct task_struct *running_proc_head = NULL;
|
|||||||
struct task_struct *wait_proc_head = NULL;
|
struct task_struct *wait_proc_head = NULL;
|
||||||
struct task_struct *current = NULL;
|
struct task_struct *current = NULL;
|
||||||
|
|
||||||
|
extern page_directory_t *kernel_directory;
|
||||||
|
|
||||||
extern void switch_to(struct context *prev, struct context *next);
|
extern void switch_to(struct context *prev, struct context *next);
|
||||||
|
|
||||||
int now_pid = 0;
|
int now_pid = 0;
|
||||||
@ -62,14 +64,18 @@ void print_proc(){
|
|||||||
|
|
||||||
void schedule() {
|
void schedule() {
|
||||||
if (current) {
|
if (current) {
|
||||||
|
volatile task_state state = current->next->state;
|
||||||
|
if(state == TASK_RUNNABLE || state == TASK_SLEEPING ){
|
||||||
change_task_to(current->next);
|
change_task_to(current->next);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void change_task_to(struct task_struct *next) {
|
void change_task_to(struct task_struct *next) {
|
||||||
if (current != next) {
|
if (current != next) {
|
||||||
struct task_struct *prev = current;
|
struct task_struct *prev = current;
|
||||||
current = next;
|
current = next;
|
||||||
|
//switch_page_directory(current->pgd_dir);
|
||||||
switch_to(&(prev->context), &(current->context));
|
switch_to(&(prev->context), &(current->context));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -84,7 +90,8 @@ int32_t kernel_thread(int (*fn)(void *), void *arg,char* name) {
|
|||||||
new_task->state = TASK_RUNNABLE;
|
new_task->state = TASK_RUNNABLE;
|
||||||
new_task->stack = current;
|
new_task->stack = current;
|
||||||
new_task->pid = now_pid++;
|
new_task->pid = now_pid++;
|
||||||
new_task->mm = NULL;
|
new_task->pgd_dir = (page_directory_t *) kmalloc_a(sizeof(page_directory_t));
|
||||||
|
|
||||||
new_task->name = name;
|
new_task->name = name;
|
||||||
|
|
||||||
uint32_t *stack_top = (uint32_t * )((uint32_t) new_task + STACK_SIZE);
|
uint32_t *stack_top = (uint32_t * )((uint32_t) new_task + STACK_SIZE);
|
||||||
@ -125,7 +132,7 @@ void init_sched() {
|
|||||||
current->state = TASK_RUNNABLE;
|
current->state = TASK_RUNNABLE;
|
||||||
current->pid = now_pid++;
|
current->pid = now_pid++;
|
||||||
current->stack = current; // 该成员指向栈低地址
|
current->stack = current; // 该成员指向栈低地址
|
||||||
current->mm = NULL; // 内核线程不需要该成员
|
current->pgd_dir = kernel_directory;
|
||||||
current->name = "CPOS-System";
|
current->name = "CPOS-System";
|
||||||
|
|
||||||
current->next = current;
|
current->next = current;
|
||||||
|
@ -13,7 +13,7 @@ int setup_date(){
|
|||||||
clock_sleep(5);
|
clock_sleep(5);
|
||||||
date_info = get_date_time(); //11
|
date_info = get_date_time(); //11
|
||||||
i = 0;
|
i = 0;
|
||||||
for(size_t x = VGA_WIDTH - 17; x < VGA_WIDTH ; x++){
|
for(size_t x = VGA_WIDTH - 19; x < VGA_WIDTH ; x++){
|
||||||
const size_t index = (VGA_HEIGHT - 1) * VGA_WIDTH + x;
|
const size_t index = (VGA_HEIGHT - 1) * VGA_WIDTH + x;
|
||||||
terminal_buffer[index] = vga_entry(date_info[i],terminal_color);
|
terminal_buffer[index] = vga_entry(date_info[i],terminal_color);
|
||||||
i++;
|
i++;
|
||||||
|
@ -2,17 +2,17 @@
|
|||||||
#include "../include/queue.h"
|
#include "../include/queue.h"
|
||||||
#include "../include/vga.h"
|
#include "../include/vga.h"
|
||||||
#include "../include/common.h"
|
#include "../include/common.h"
|
||||||
#include "../include/io.h"
|
|
||||||
#include "../include/task.h"
|
#include "../include/task.h"
|
||||||
#include "../include/cmos.h"
|
#include "../include/cmos.h"
|
||||||
#include "../include/fat16.h"
|
#include "../include/fat16.h"
|
||||||
|
#include "../include/timer.h"
|
||||||
|
#include "../include/io.h"
|
||||||
|
|
||||||
extern Queue *key_char_queue;
|
extern Queue *key_char_queue;
|
||||||
|
|
||||||
char getc() {
|
char getc() {
|
||||||
while (key_char_queue->size == 0x00) {
|
while (key_char_queue->size == 0x00) {
|
||||||
io_hlt();
|
printf("");
|
||||||
|
|
||||||
}
|
}
|
||||||
return queue_pop(key_char_queue);
|
return queue_pop(key_char_queue);
|
||||||
}
|
}
|
||||||
@ -73,7 +73,9 @@ void cmd_proc(){
|
|||||||
|
|
||||||
void cmd_date(){
|
void cmd_date(){
|
||||||
printf("System Time: %s\n",get_date_time());
|
printf("System Time: %s\n",get_date_time());
|
||||||
|
printf("Memory Usage: %dKB | All Size: %dMB\n",memory_usage()/1024,(KHEAP_START+KHEAP_INITIAL_SIZE)/1024/1024);
|
||||||
print_cpu_id();
|
print_cpu_id();
|
||||||
|
vga_writestring("\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
void cmd_ls() {
|
void cmd_ls() {
|
||||||
@ -161,6 +163,12 @@ void cmd_del(int argc, char **argv) {
|
|||||||
kfree(info);
|
kfree(info);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void cmd_reset(){
|
||||||
|
printf("Restart %s for x86...");
|
||||||
|
clock_sleep(10);
|
||||||
|
outb(0x64,0xfe);
|
||||||
|
}
|
||||||
|
|
||||||
void setup_shell(){
|
void setup_shell(){
|
||||||
vga_clear();
|
vga_clear();
|
||||||
printf("%s for x86 [Version %s] \n",OS_NAME, OS_VERSION);
|
printf("%s for x86 [Version %s] \n",OS_NAME, OS_VERSION);
|
||||||
@ -200,6 +208,8 @@ void setup_shell(){
|
|||||||
cmd_mkdir(argc, argv);
|
cmd_mkdir(argc, argv);
|
||||||
else if (!strcmp("del", argv[0]) || !strcmp("rm", argv[0]))
|
else if (!strcmp("del", argv[0]) || !strcmp("rm", argv[0]))
|
||||||
cmd_del(argc, argv);
|
cmd_del(argc, argv);
|
||||||
|
else if (!strcmp("reset", argv[0]))
|
||||||
|
cmd_reset();
|
||||||
else if (!strcmp("help", argv[0]) || !strcmp("?", argv[0]) || !strcmp("h", argv[0])) {
|
else if (!strcmp("help", argv[0]) || !strcmp("?", argv[0]) || !strcmp("h", argv[0])) {
|
||||||
vga_writestring("-=[CrashPowerShell Helper]=-\n");
|
vga_writestring("-=[CrashPowerShell Helper]=-\n");
|
||||||
vga_writestring("help ? h Print shell help info.\n");
|
vga_writestring("help ? h Print shell help info.\n");
|
||||||
@ -212,6 +222,7 @@ void setup_shell(){
|
|||||||
vga_writestring("del rm <name> Delete a file\n");
|
vga_writestring("del rm <name> Delete a file\n");
|
||||||
vga_writestring("sysinfo Print system info.\n");
|
vga_writestring("sysinfo Print system info.\n");
|
||||||
vga_writestring("proc Lists all running processes.\n");
|
vga_writestring("proc Lists all running processes.\n");
|
||||||
|
vga_writestring("reset Reset OS.\n");
|
||||||
} else printf("[Shell]: Unknown command '%s'.\n", argv[0]);
|
} else printf("[Shell]: Unknown command '%s'.\n", argv[0]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user