Skip to content

Commit

Permalink
更新最小内存检测机制
Browse files Browse the repository at this point in the history
  • Loading branch information
xiaoyi1212 committed Dec 6, 2024
1 parent 61dbc7c commit 644b08d
Show file tree
Hide file tree
Showing 12 changed files with 574 additions and 264 deletions.
125 changes: 125 additions & 0 deletions src/core/dlinker.c
Original file line number Diff line number Diff line change
@@ -1,4 +1,129 @@
#include "dlinker.h"
#include "elf_util.h"
#include "klog.h"

void list_dynamic_library_function(const char* path){
vfs_node_t file = vfs_open(path);
if(file == NULL){
printk("Error: Cannot open file '%s'.\n",path);
return;
}
Elf32_Ehdr *ehdr = kmalloc(file->size);
if(vfs_read(file,ehdr,0,file->size) == -1){
kfree(ehdr);
vfs_close(file);
printk("Error: Cannot read file.\n");
return;
}
if(check_elf_magic(ehdr)){
if(ehdr->e_type == ET_DYN){
Elf32_Phdr *phdr = (Elf32_Phdr *)((char *)ehdr + ehdr->e_phoff);
Elf32_Phdr *dynamic_phdr = NULL;

for (int i = 0; i < ehdr->e_phnum; i++) { //查找动态段
if (phdr[i].p_type == PT_DYNAMIC) {
dynamic_phdr = &phdr[i];
break;
}
}

if(dynamic_phdr){
printk("Error: No has dynamic segment.\n");
kfree(ehdr);
vfs_close(file);
return;
}

Elf32_Dyn *dyn = (Elf32_Dyn *)(dynamic_phdr->p_vaddr);
Elf32_Sym *symtab = NULL; // 符号表
const char *strtab = NULL; // 字符串表
size_t symtab_size = 0;

// 遍历动态段,找到符号表和字符串表
while (dyn->d_tag != DT_NULL) {
if (dyn->d_tag == DT_SYMTAB) {
symtab = (Elf32_Sym *)dyn->d_un.d_ptr;
} else if (dyn->d_tag == DT_STRTAB) {
strtab = (const char *)dyn->d_un.d_ptr;
} else if (dyn->d_tag == DT_SYMENT) {
symtab_size = dyn->d_un.d_val;
}
dyn++;
}

if (!symtab || !strtab || !symtab_size){
printk("Error: No has symbol table or string table.\n");
kfree(ehdr);
vfs_close(file);
return;
}
size_t sym_count = symtab_size / sizeof(Elf32_Sym);
for (size_t i = 0; i < sym_count; i++) {
Elf32_Sym *sym = &symtab[i];

// 仅输出类型为函数的符号
if (ELF32_ST_TYPE(sym->st_info) == STT_FUNC && sym->st_name != 0) {
printk("Export function: %s\n", strtab + sym->st_name);
}
}

kfree(ehdr);
vfs_close(file);
} else printk("Error: not a dynamic library\n");
} else printk("Error: not a elf file\n");
}

void link_dynamic_library(const char* path,pcb_t task){
vfs_node_t file = vfs_open(path);
if(file == NULL){
return;
}
Elf32_Ehdr *ehdr = kmalloc(file->size);
if(vfs_read(file,ehdr,0,file->size) == -1){
kfree(ehdr);
return;
}
if(check_elf_magic(ehdr)){
if(ehdr->e_type == ET_DYN){
Elf32_Phdr *phdr = (Elf32_Phdr *)((char *)ehdr + ehdr->e_phoff);
Elf32_Phdr *dynamic_phdr = NULL;

for (int i = 0; i < ehdr->e_phnum; i++) { //查找动态段
if (phdr[i].p_type == PT_DYNAMIC) {
dynamic_phdr = &phdr[i];
break;
}
}

if(dynamic_phdr) return;

Elf32_Dyn *dyn = (Elf32_Dyn *)(dynamic_phdr->p_vaddr);
Elf32_Sym *symtab = NULL; // 符号表
const char *strtab = NULL; // 字符串表
size_t symtab_size = 0;

// 遍历动态段,找到符号表和字符串表
while (dyn->d_tag != DT_NULL) {
if (dyn->d_tag == DT_SYMTAB) {
symtab = (Elf32_Sym *)dyn->d_un.d_ptr;
} else if (dyn->d_tag == DT_STRTAB) {
strtab = (const char *)dyn->d_un.d_ptr;
} else if (dyn->d_tag == DT_SYMENT) {
symtab_size = dyn->d_un.d_val;
}
dyn++;
}

if (!symtab || !strtab || !symtab_size) return;
size_t sym_count = symtab_size / sizeof(Elf32_Sym);
for (size_t i = 0; i < sym_count; i++) {
Elf32_Sym *sym = &symtab[i];

// 仅输出类型为函数的符号
if (ELF32_ST_TYPE(sym->st_info) == STT_FUNC && sym->st_name != 0) {
printk("Function: %s\n", strtab + sym->st_name);
}
}
}
}
}
5 changes: 5 additions & 0 deletions src/core/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,11 @@ _Noreturn void kernel_main(multiboot_t *multiboot, uint32_t kernel_stack) {
tty_init(); //tty 设备初始化

init_vbe(multiboot);

default_terminal_setup();
extern void check_memory(multiboot_t *multiboot);
check_memory(multiboot);

page_init(multiboot); //分页开启
setup_free_page();
terminal_setup(false);
Expand Down
15 changes: 13 additions & 2 deletions src/core/mboot/memory_map.c
Original file line number Diff line number Diff line change
@@ -1,9 +1,21 @@
#include "multiboot.h"
#include "ctypes.h"
#include "klog.h"
#include "io.h"
#include "video.h"

uint32_t phy_mem_size;

void check_memory(multiboot_t *multiboot){
if ((multiboot->mem_upper + multiboot->mem_lower) / 1024 + 1 < 30) {
printk("CP_Kernel bootloader panic info:\n");
printk("\033ff0000;Minimal RAM amount for CP_Kernel is 30 MB, but you have only %d MB.\033c6c6c6;\n",
(multiboot->mem_upper + multiboot->mem_lower) / 1024 + 1);
printk("Please check your memory size, and restart CP_Kernel.\n");
while (1) io_hlt();
}
phy_mem_size = (multiboot->mem_upper + multiboot->mem_lower) / 1024;
}

void show_memory_map(multiboot_t *mboot) {
uint32_t mmap_addr = mboot->mmap_addr;
uint32_t mmap_length = mboot->mmap_length;
Expand All @@ -29,6 +41,5 @@ void show_memory_map(multiboot_t *mboot) {
}

void init_mmap(multiboot_t *multiboot){
phy_mem_size = (multiboot->mem_upper + multiboot->mem_lower) / 1024;
show_memory_map(multiboot);
}
1 change: 1 addition & 0 deletions src/core/vsound.c
Original file line number Diff line number Diff line change
Expand Up @@ -345,6 +345,7 @@ void wav_player(const char* path){
}
vsound_write(snd, data, 1024);
}

vsound_close(snd);
kfree(buf1);
}
Expand Down
7 changes: 6 additions & 1 deletion src/driver/acpi.c
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,11 @@ static int AcpiSysInit() {
if (!AcpiCheckHeader(facp->DSDT, "DSDT")) {
S5Addr = &(facp->DSDT->definition_block);
dsdtlen = facp->DSDT->length - HEADER_SIZE;

for (uint32_t i = (uint32_t)S5Addr; i <((uint32_t)S5Addr) + dsdtlen; i+=PAGE_SIZE) {
alloc_frame_line(get_page(i,1,get_current_directory()),i,1,1);
}

while (dsdtlen--) {
if (!memcmp(S5Addr, "_S5_", 4)) {
break;
Expand Down Expand Up @@ -343,7 +348,7 @@ void hpet_clock_init(){
void hpet_initialize() {
HPET *hpet = (HPET *)acpi_find_table("HPET");
if (!hpet) {
printk("can not found acpi hpet table\n");
printk("\033[31mCannot found acpi hpet table\033[0m\n");
}

hpetInfo = (HpetInfo *) hpet->hpetAddress.address;
Expand Down
2 changes: 1 addition & 1 deletion src/driver/video/vbe.c
Original file line number Diff line number Diff line change
Expand Up @@ -54,5 +54,5 @@ void init_vbe(multiboot_t *multiboot) {
screen = videoArea.screen = (uint32_t *) multiboot->framebuffer_addr;
width = videoArea.width = multiboot->framebuffer_width;
height = videoArea.height = multiboot->framebuffer_height;
vbe_clear(0xc6c6c6);
vbe_clear(0x000000);
}
5 changes: 5 additions & 0 deletions src/include/dlinker.h
Original file line number Diff line number Diff line change
@@ -1 +1,6 @@
#pragma once

#include "pcb.h"

void list_dynamic_library_function(const char* path);
void link_dynamic_library(const char* path,pcb_t task);
3 changes: 3 additions & 0 deletions src/include/video.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,3 +30,6 @@ void init_vbe(multiboot_t *multiboot);
uint32_t *get_vbe_screen();
uint32_t get_vbe_width();
uint32_t get_vbe_height();

void default_terminal_setup();
void default_writestring(const char *data);
12 changes: 12 additions & 0 deletions src/sysapp/shell.c
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
#include "video.h"
#include "scheduler.h"
#include "speaker.h"
#include "dlinker.h"

static inline int isprint_syshell(int c) {
return (c > 0x1F && c < 0x7F);
Expand Down Expand Up @@ -203,6 +204,14 @@ static void sys_info(){
printk(" -*&@@@&+: \n");
}

static void dlinfo(int argc,char** argv){
if (argc == 1) {
printk("[Shell-DLINFO]: If there are too few parameters.\n");
return;
}
list_dynamic_library_function(argv[1]);
}

static void print_help(){
printk("Usage <command|app_path> [argument...]\n");
printk("help h ? Get shell command help.\n");
Expand All @@ -214,6 +223,7 @@ static void print_help(){
printk("sysinfo Get os system information.\n");
printk("clear Clear terminal screen.\n");
printk("ps List all processes info.\n");
printk("dlinfo <path> List dynamic library export functions.\n");
}

void setup_shell(){
Expand Down Expand Up @@ -258,6 +268,8 @@ void setup_shell(){
sys_info();
else if(!strcmp("ps",argv[0]))
ps();
else if(!strcmp("dlinfo",argv[0]))
dlinfo(argc,argv);
else if(!strcmp("clear",argv[0]))
get_current_proc()->tty->clear(get_current_proc()->tty);
else{
Expand Down
Loading

0 comments on commit 644b08d

Please sign in to comment.