From 45eeaeab854db3e9994f1f10c56d1c906aa7a99a Mon Sep 17 00:00:00 2001 From: acevest Date: Sun, 9 Aug 2026 18:37:46 +0800 Subject: [PATCH] =?utf8?q?=E6=B7=BB=E5=8A=A0console=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- drivers/serial.c | 24 ++++++++++++++++++++++-- include/console.h | 13 +++++++++++++ kernel/console.c | 33 +++++++++++++++++++++++++++++++++ kernel/printk.c | 8 ++++---- 4 files changed, 72 insertions(+), 6 deletions(-) diff --git a/drivers/serial.c b/drivers/serial.c index 09c1786..1878976 100644 --- a/drivers/serial.c +++ b/drivers/serial.c @@ -8,6 +8,7 @@ */ #include "io.h" +#include "console.h" #define COMM1_PORT 0x3F8 #define COMM2_PORT 0x2F8 @@ -22,7 +23,14 @@ const uint32_t baud_rate = 115200; -void init_serial() { + +int serial_write(const char *buf, size_t size) { + return 0; +} + +int serial_setup(console_t *console) { + assert(console != NULL); + uint32_t port = SERIAL_PORT; outb(0x00, port + 1); // 禁用中断 outb(0x80, port + 3); @@ -31,6 +39,18 @@ void init_serial() { outb(0x03, port + 3); outb(0xC7, port + 2); outb(0x0B, port + 4); + + return 0; +} + +static console_t serial_console = { + .name = "SERIAL", + .write = serial_write, + .setup = serial_setup, +}; + +void init_serial() { + register_console(&serial_console); } void serial_putc(char c) { @@ -39,7 +59,7 @@ void serial_putc(char c) { outb(c, SERIAL_PORT); } -void serial_write(const char* buf, size_t size) { +void serial_old_write(const char* buf, size_t size) { // return 0; for (size_t i = 0; i < size; i++) { serial_putc(buf[i]); diff --git a/include/console.h b/include/console.h index 7e97e87..8dc26f0 100644 --- a/include/console.h +++ b/include/console.h @@ -11,6 +11,19 @@ #include +typedef struct console console_t; + +struct console { + const char *name; + int (*setup)(console_t *console); + int (*write)(const char *buf, size_t size); +}; + +void register_console(console_t *console); + + + + #define CNSL_QUEUE_SIZE 1024 typedef struct cnsl_queue { diff --git a/kernel/console.c b/kernel/console.c index 3f6645e..15e4283 100644 --- a/kernel/console.c +++ b/kernel/console.c @@ -14,6 +14,39 @@ #include #include + +#define MAX_CONSOLE_CNT 16 + +static console_t *console_list[MAX_CONSOLE_CNT] = {NULL}; + +void register_console(console_t *console) { + assert(console != NULL); + assert(console->name != NULL); + assert(console->write != NULL); + //assert(console->setup != NULL); + + + for (int i=0; isetup != NULL) { + console->setup(console); + } + printk("console %s registered\n", console->name); + return; + } + } + panic("console list full\n"); + return; +} + void vga_putc(unsigned int nr, unsigned char c, const unsigned char color); cnsl_t cnsl; diff --git a/kernel/printk.c b/kernel/printk.c index c227225..8972fc3 100644 --- a/kernel/printk.c +++ b/kernel/printk.c @@ -21,7 +21,7 @@ int vsprintf(char* buf, const char* fmt, va_list args); -void serial_write(const char* buf, size_t size); +void serial_old_write(const char* buf, size_t size); extern tty_t* const default_tty; @@ -31,7 +31,7 @@ int _printk(const char* fmtstr, va_list args) { int size = vsprintf(pkbuf, fmtstr, args); tty_write(default_tty, pkbuf, (size_t)size); - serial_write(pkbuf, (size_t)size); + serial_old_write(pkbuf, (size_t)size); kfree(pkbuf); return 0; @@ -45,7 +45,7 @@ int _early_printk(const char* fmtstr, va_list args) { int size = vsprintf(_early_pkbuf, fmtstr, args); tty_write(default_tty, _early_pkbuf, (size_t)size); - serial_write(_early_pkbuf, (size_t)size); + serial_old_write(_early_pkbuf, (size_t)size); irq_restore(eflags); return 0; @@ -78,7 +78,7 @@ int printd(const char* fmtstr, ...) { va_end(args); tty_write(debug_tty, pdbuf, (size_t)size); - serial_write(pdbuf, (size_t)size); + serial_old_write(pdbuf, (size_t)size); kfree(pdbuf); -- 2.47.0