From bea02a7abe756d5ec198375f27ee78e34e19405c Mon Sep 17 00:00:00 2001 From: ZZJJWarth <2678328250@qq.com> Date: Thu, 7 Nov 2024 16:45:46 +0800 Subject: [PATCH 1/9] save --- kernel/src/arch/x86_64/asm/head.S | 2 +- .../tty/virtual_terminal/virtual_console.rs | 2 +- kernel/src/driver/video/fbdev/base/mod.rs | 21 +++++++---- .../driver/video/fbdev/base/render_helper.rs | 37 ++++++++++++++++++- kernel/src/lib.rs | 15 +++++--- 5 files changed, 60 insertions(+), 17 deletions(-) diff --git a/kernel/src/arch/x86_64/asm/head.S b/kernel/src/arch/x86_64/asm/head.S index d7b192343a..4c38aad403 100644 --- a/kernel/src/arch/x86_64/asm/head.S +++ b/kernel/src/arch/x86_64/asm/head.S @@ -149,7 +149,7 @@ framebuffer_tag_start: .long framebuffer_tag_end - framebuffer_tag_start .long 1440 // 宽 .long 900 // 高 - .long 32 + .long 16 framebuffer_tag_end: .align 8 .short MULTIBOOT2_HEADER_TAG_END diff --git a/kernel/src/driver/tty/virtual_terminal/virtual_console.rs b/kernel/src/driver/tty/virtual_terminal/virtual_console.rs index da7cdcd504..f760e6e5a2 100644 --- a/kernel/src/driver/tty/virtual_terminal/virtual_console.rs +++ b/kernel/src/driver/tty/virtual_terminal/virtual_console.rs @@ -213,7 +213,7 @@ impl VirtualConsoleData { if let Some(cols) = cols { self.cols = cols; } - + self.screen_buf.resize(self.cols * self.rows*2, 0); self.pos = self.cols * self.state.y + self.state.x; // self.bytes_per_row = self.cols << 1; diff --git a/kernel/src/driver/video/fbdev/base/mod.rs b/kernel/src/driver/video/fbdev/base/mod.rs index fb9921a68e..b13d7e28d8 100644 --- a/kernel/src/driver/video/fbdev/base/mod.rs +++ b/kernel/src/driver/video/fbdev/base/mod.rs @@ -1,4 +1,5 @@ use alloc::{string::String, sync::Arc, vec::Vec}; +use render_helper::FrameP; use system_error::SystemError; use crate::{ @@ -107,6 +108,7 @@ pub trait FrameBuffer: FrameBufferInfo + FrameBufferOps + Device { && image.width & (32 / bit_per_pixel - 1) == 0 && (8..=32).contains(&bit_per_pixel) { + // loop{} unsafe { self.fast_imageblit(image, dst1, fg, bg) } } else { self.slow_imageblit( @@ -256,7 +258,8 @@ pub trait FrameBuffer: FrameBufferInfo + FrameBufferOps + Device { _start_index: u32, _pitch_index: u32, ) { - let mut dst = _dst1.as_ptr::(); + // let mut dst = _dst1.as_ptr::(); + let mut safe_dst=FrameP::new(self.current_fb_var().height.unwrap(), self.current_fb_var().width.unwrap(), self.current_fb_var().bits_per_pixel, _dst1, 0); let mut count = 0; let iter = BitIter::new( _fg, @@ -268,17 +271,19 @@ pub trait FrameBuffer: FrameBufferInfo + FrameBufferOps + Device { _image.width, ); for (content, full) in iter { - unsafe { - *dst = content; + safe_dst.write(content); + // unsafe { + // *dst = content; - dst = dst.add(1); - } + // dst = dst.add(1); + // } if full { count += 1; - dst = unsafe { - _dst1.as_ptr::().add((_pitch_index * count) as usize) as *mut u32 - }; + safe_dst.move_with_offset(_pitch_index * count); + // dst = unsafe { + // _dst1.as_ptr::().add((_pitch_index * count) as usize) as *mut u32 + // }; } } } diff --git a/kernel/src/driver/video/fbdev/base/render_helper.rs b/kernel/src/driver/video/fbdev/base/render_helper.rs index 0ce9f80a57..d67bb5bccc 100644 --- a/kernel/src/driver/video/fbdev/base/render_helper.rs +++ b/kernel/src/driver/video/fbdev/base/render_helper.rs @@ -1,4 +1,6 @@ -use core::slice::Iter; +use core::{ops::Add, slice::Iter}; + +use crate::{driver::serial::serial8250::send_to_default_serial8250_port, mm::VirtAddr}; pub struct BitIter<'a> { fgcolor: u32, @@ -170,3 +172,36 @@ impl PixelLineStatus { } } } + + +pub struct FrameP{ + dst:VirtAddr, + limit:u32, + current:u32, +} + +impl FrameP{ + pub fn new(frame_height:u32,frame_width:u32,bit_deep:u32,dst:VirtAddr,offset_in_frame:u32)->Self{ + let limit=frame_height*frame_width*bit_deep/8; + Self { dst, limit, current:offset_in_frame } + } + + pub fn write(&mut self,data:T){ + let size=size_of::() as u32; + let mut dst=self.dst; + if self.current+size>self.limit { + send_to_default_serial8250_port("warning:illegal use of frame_pointer has been detected!".as_bytes()); + panic!(); + }else{ + dst=dst.add(self.current as usize); + } + unsafe { + *dst.as_ptr::()=data; + } + self.current+=size; + } + + pub fn move_with_offset(&mut self,offset:u32){ + self.current+=offset; + } +} \ No newline at end of file diff --git a/kernel/src/lib.rs b/kernel/src/lib.rs index 5a7e09535f..1c099f6537 100644 --- a/kernel/src/lib.rs +++ b/kernel/src/lib.rs @@ -111,30 +111,33 @@ pub static KERNEL_ALLOCATOR: KernelAllocator = KernelAllocator; #[panic_handler] #[no_mangle] pub fn panic(info: &PanicInfo) -> ! { + use driver::serial::serial8250::send_to_default_serial8250_port; use log::error; - error!("Kernel Panic Occurred."); + send_to_default_serial8250_port(format!("Kernel Panic Occurred.").as_bytes()); match info.location() { Some(loc) => { - println!( + let s = format!( "Location:\n\tFile: {}\n\tLine: {}, Column: {}", loc.file(), loc.line(), loc.column() ); + send_to_default_serial8250_port(s.as_bytes()); } None => { - println!("No location info"); + send_to_default_serial8250_port("No location info".as_bytes()); } } - println!("Message:\n\t{}", info.message()); + let s=format!("Message:\n\t{}", info.message()); #[cfg(all(feature = "backtrace", target_arch = "x86_64"))] { unsafe { let bt = mini_backtrace::Backtrace::<16>::capture(); - println!("Rust Panic Backtrace:"); + format!("Rust Panic Backtrace:\n"); + send_to_default_serial8250_port(s.as_bytes()); let mut level = 0; for frame in bt.frames { lookup_kallsyms(frame as u64, level); @@ -143,7 +146,7 @@ pub fn panic(info: &PanicInfo) -> ! { }; } - println!("Current PCB:\n\t{:?}", (ProcessManager::current_pcb())); + format!("Current PCB:\n\t{:?}", (ProcessManager::current_pcb())); ProcessManager::exit(usize::MAX); } From 5fb92c58c2d19f740b039168ebea7937b6914898 Mon Sep 17 00:00:00 2001 From: ZZJJWarth <2678328250@qq.com> Date: Thu, 7 Nov 2024 17:43:59 +0800 Subject: [PATCH 2/9] save --- kernel/src/driver/video/fbdev/base/mod.rs | 2 +- kernel/src/driver/video/fbdev/base/render_helper.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/kernel/src/driver/video/fbdev/base/mod.rs b/kernel/src/driver/video/fbdev/base/mod.rs index b13d7e28d8..b786288e06 100644 --- a/kernel/src/driver/video/fbdev/base/mod.rs +++ b/kernel/src/driver/video/fbdev/base/mod.rs @@ -259,7 +259,7 @@ pub trait FrameBuffer: FrameBufferInfo + FrameBufferOps + Device { _pitch_index: u32, ) { // let mut dst = _dst1.as_ptr::(); - let mut safe_dst=FrameP::new(self.current_fb_var().height.unwrap(), self.current_fb_var().width.unwrap(), self.current_fb_var().bits_per_pixel, _dst1, 0); + let mut safe_dst=FrameP::new(self.current_fb_var().yres, self.current_fb_var().xres, self.current_fb_var().bits_per_pixel, _dst1, 0); let mut count = 0; let iter = BitIter::new( _fg, diff --git a/kernel/src/driver/video/fbdev/base/render_helper.rs b/kernel/src/driver/video/fbdev/base/render_helper.rs index d67bb5bccc..70459ae5dc 100644 --- a/kernel/src/driver/video/fbdev/base/render_helper.rs +++ b/kernel/src/driver/video/fbdev/base/render_helper.rs @@ -202,6 +202,6 @@ impl FrameP{ } pub fn move_with_offset(&mut self,offset:u32){ - self.current+=offset; + self.current=offset; } } \ No newline at end of file From df934fc56b297485c3b38e82fa55ee53fb2bfb50 Mon Sep 17 00:00:00 2001 From: ZZJJWarth <2678328250@qq.com> Date: Fri, 8 Nov 2024 15:28:02 +0800 Subject: [PATCH 3/9] =?UTF-8?q?=E4=BF=9D=E7=95=99=E4=BA=86debug=E4=BF=A1?= =?UTF-8?q?=E6=81=AF=E7=9A=84=E6=B8=B2=E6=9F=93=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kernel/src/arch/x86_64/asm/head.S | 6 ++-- .../tty/virtual_terminal/virtual_console.rs | 12 ++++--- .../fbdev/base/fbcon/framebuffer_console.rs | 25 +++++++++++++-- kernel/src/driver/video/fbdev/base/mod.rs | 25 +++++++++------ .../driver/video/fbdev/base/render_helper.rs | 31 ++++++++++++------- 5 files changed, 68 insertions(+), 31 deletions(-) diff --git a/kernel/src/arch/x86_64/asm/head.S b/kernel/src/arch/x86_64/asm/head.S index 4c38aad403..21db1ab119 100644 --- a/kernel/src/arch/x86_64/asm/head.S +++ b/kernel/src/arch/x86_64/asm/head.S @@ -147,9 +147,9 @@ framebuffer_tag_start: .short MULTIBOOT2_HEADER_TAG_FRAMEBUFFER .short MULTIBOOT2_HEADER_TAG_OPTIONAL .long framebuffer_tag_end - framebuffer_tag_start - .long 1440 // 宽 - .long 900 // 高 - .long 16 + .long 640 // 宽 + .long 480 // 高 + .long 32 framebuffer_tag_end: .align 8 .short MULTIBOOT2_HEADER_TAG_END diff --git a/kernel/src/driver/tty/virtual_terminal/virtual_console.rs b/kernel/src/driver/tty/virtual_terminal/virtual_console.rs index f760e6e5a2..445caf99df 100644 --- a/kernel/src/driver/tty/virtual_terminal/virtual_console.rs +++ b/kernel/src/driver/tty/virtual_terminal/virtual_console.rs @@ -146,7 +146,7 @@ pub struct VirtualConsoleData { impl VirtualConsoleData { #[inline(never)] pub fn new(num: usize) -> Self { - Self { + let mut a=Self { state: VirtualConsoleInfo::new(0, 0), saved_state: Default::default(), cols: Default::default(), @@ -203,7 +203,10 @@ impl VirtualConsoleData { driver_funcs: None, cursor_type: VcCursor::empty(), vc_index: num, - } + }; + a.screen_buf.resize(15000,0); + a.screen_buf[14000]=0; + a } pub fn init(&mut self, rows: Option, cols: Option, clear: bool) { @@ -213,7 +216,7 @@ impl VirtualConsoleData { if let Some(cols) = cols { self.cols = cols; } - self.screen_buf.resize(self.cols * self.rows*2, 0); + // self.screen_buf.resize(self.cols * self.rows*2, 0); self.pos = self.cols * self.state.y + self.state.x; // self.bytes_per_row = self.cols << 1; @@ -222,7 +225,7 @@ impl VirtualConsoleData { self.underline_color = 3; // cyan self.half_color = 0x08; // grey - self.screen_buf.resize(self.cols * self.rows, 0); + // self.screen_buf.resize(self.cols * self.rows, 0); self.reset(clear); } @@ -1600,6 +1603,7 @@ impl VirtualConsoleData { // self.state.y, // self.cols, // ); + self.screen_buf[self.pos] = tc as u16; if draw.x.is_none() { diff --git a/kernel/src/driver/video/fbdev/base/fbcon/framebuffer_console.rs b/kernel/src/driver/video/fbdev/base/fbcon/framebuffer_console.rs index 3c61ba30bc..bd2809243e 100644 --- a/kernel/src/driver/video/fbdev/base/fbcon/framebuffer_console.rs +++ b/kernel/src/driver/video/fbdev/base/fbcon/framebuffer_console.rs @@ -228,7 +228,7 @@ impl ConsoleSwitch for BlittingFbConsole { vc_data.pos = vc_data.state.x + vc_data.state.y * vc_data.cols; let new_size = vc_data.cols * vc_data.rows; - vc_data.screen_buf.resize(new_size, 0); + // vc_data.screen_buf.resize(new_size, 0); } else { unimplemented!("Resize is not supported at the moment!"); } @@ -311,15 +311,34 @@ impl ConsoleSwitch for BlittingFbConsole { } let fbcon_data = self.fbcon_data(); let c = buf[0]; + let width = (vc_data.font.width + 7) / 8; + let x_display_max=self.fb().current_fb_var().xres/width; + let mut count=count as u32; + let mut times=0; + while count>x_display_max { + self.put_string( + vc_data, + buf, + x_display_max, + fbcon_data.display.real_y(ypos+times), + xpos, + self.get_color(vc_data, c, true), + self.get_color(vc_data, c, false), + )?; + panic!(); + count-=x_display_max; + times+=1; + } self.put_string( vc_data, buf, - count as u32, - fbcon_data.display.real_y(ypos), + count , + fbcon_data.display.real_y(ypos+times), xpos, self.get_color(vc_data, c, true), self.get_color(vc_data, c, false), ) + } fn con_getxy( diff --git a/kernel/src/driver/video/fbdev/base/mod.rs b/kernel/src/driver/video/fbdev/base/mod.rs index b786288e06..10061d9303 100644 --- a/kernel/src/driver/video/fbdev/base/mod.rs +++ b/kernel/src/driver/video/fbdev/base/mod.rs @@ -3,7 +3,7 @@ use render_helper::FrameP; use system_error::SystemError; use crate::{ - driver::{base::device::Device, tty::virtual_terminal::Color}, + driver::{base::device::Device, serial::serial8250::send_to_default_serial8250_port, tty::virtual_terminal::Color}, init::boot_params, libs::rwlock::RwLock, mm::{ucontext::LockedVMA, PhysAddr, VirtAddr}, @@ -79,11 +79,11 @@ pub trait FrameBuffer: FrameBufferInfo + FrameBufferOps + Device { // 对齐到像素字节大小 bitstart &= !(byte_per_pixel - 1); - let dst1 = boot_param.screen_info.lfb_virt_base; - if dst1.is_none() { + let dst2 = boot_param.screen_info.lfb_virt_base; + if dst2.is_none() { return; } - let mut dst1 = dst1.unwrap(); + let mut dst1 = dst2.unwrap(); dst1 += VirtAddr::new(bitstart as usize); let _ = self.fb_sync(); @@ -102,7 +102,7 @@ pub trait FrameBuffer: FrameBufferInfo + FrameBufferOps + Device { bg = image.bg; } - if 32 % bit_per_pixel == 0 + if 32 % bit_per_pixel == 114514 && start_index == 0 && pitch_index == 0 && image.width & (32 / bit_per_pixel - 1) == 0 @@ -113,10 +113,10 @@ pub trait FrameBuffer: FrameBufferInfo + FrameBufferOps + Device { } else { self.slow_imageblit( image, - dst1, + dst2.unwrap(), fg, bg, - bitstart / 4, + bitstart, self.current_fb_fix().line_length, ) } @@ -259,7 +259,10 @@ pub trait FrameBuffer: FrameBufferInfo + FrameBufferOps + Device { _pitch_index: u32, ) { // let mut dst = _dst1.as_ptr::(); - let mut safe_dst=FrameP::new(self.current_fb_var().yres, self.current_fb_var().xres, self.current_fb_var().bits_per_pixel, _dst1, 0); + let mut safe_dst=FrameP::new(self.current_fb_var().yres as usize, self.current_fb_var().xres as usize, self.current_fb_var().bits_per_pixel as usize, _dst1, _start_index); + // let mut safe_dst=FrameP::new(480, 640, 32, _dst1,_start_index); + // let mut safe_dst=FrameP::new(900, 1600, 32, _dst1,_start_index); + let mut count = 0; let iter = BitIter::new( _fg, @@ -271,7 +274,11 @@ pub trait FrameBuffer: FrameBufferInfo + FrameBufferOps + Device { _image.width, ); for (content, full) in iter { - safe_dst.write(content); + if !safe_dst.write(content){ + send_to_default_serial8250_port(format!("current Iamge:{:?}\n",_image).as_bytes()); + send_to_default_serial8250_port(format!("current Iter:{:?},pitch_index:{:?}\n",_pitch_index * count,_pitch_index).as_bytes()); + return; + } // unsafe { // *dst = content; diff --git a/kernel/src/driver/video/fbdev/base/render_helper.rs b/kernel/src/driver/video/fbdev/base/render_helper.rs index 70459ae5dc..3ff2c7fadc 100644 --- a/kernel/src/driver/video/fbdev/base/render_helper.rs +++ b/kernel/src/driver/video/fbdev/base/render_helper.rs @@ -1,6 +1,6 @@ use core::{ops::Add, slice::Iter}; -use crate::{driver::serial::serial8250::send_to_default_serial8250_port, mm::VirtAddr}; +use crate::{arch::cpu::current_cpu_id, driver::serial::serial8250::send_to_default_serial8250_port, mm::VirtAddr}; pub struct BitIter<'a> { fgcolor: u32, @@ -173,32 +173,39 @@ impl PixelLineStatus { } } - +#[derive(Debug)] pub struct FrameP{ dst:VirtAddr, - limit:u32, + limit:VirtAddr, current:u32, + start_offset:u32 } impl FrameP{ - pub fn new(frame_height:u32,frame_width:u32,bit_deep:u32,dst:VirtAddr,offset_in_frame:u32)->Self{ - let limit=frame_height*frame_width*bit_deep/8; - Self { dst, limit, current:offset_in_frame } + pub fn new(frame_height:usize,frame_width:usize,bit_deep:usize,dst:VirtAddr,offset:u32)->Self{ + // let limit=(frame_height*frame_width-offset_in_frame)*bit_deep/8; + // let limit=(frame_height*frame_width-offset_in_frame)*bit_deep/8; + let limit = VirtAddr::new(frame_height*frame_width*bit_deep/8)+dst; + Self { dst, limit, current:0,start_offset:offset } } - - pub fn write(&mut self,data:T){ + pub fn write(&mut self,data:T)->bool{ let size=size_of::() as u32; let mut dst=self.dst; - if self.current+size>self.limit { - send_to_default_serial8250_port("warning:illegal use of frame_pointer has been detected!".as_bytes()); - panic!(); + + // if self.current+size>self.limit { + // if true { + if self.dst.data()+self.current as usize+self.start_offset as usize+size_of::()>self.limit.data() { + send_to_default_serial8250_port(format!("warning:illegal use of frame_pointer has been detected! FB:{:?}\n",self).as_bytes()); + // panic!(); + return false; }else{ - dst=dst.add(self.current as usize); + dst=dst.add(self.current as usize+self.start_offset as usize); } unsafe { *dst.as_ptr::()=data; } self.current+=size; + return true; } pub fn move_with_offset(&mut self,offset:u32){ From 382db08ee73020dce4cd0aa3c090425f0c58e88c Mon Sep 17 00:00:00 2001 From: ZZJJWarth <2678328250@qq.com> Date: Fri, 8 Nov 2024 16:14:48 +0800 Subject: [PATCH 4/9] =?UTF-8?q?=E4=BB=8E=E8=BF=99=E9=87=8C=E5=BC=80?= =?UTF-8?q?=E5=A7=8B=E6=8A=8A=E6=B2=A1=E5=BF=85=E8=A6=81=E7=9A=84=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E5=88=A0=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tty/virtual_terminal/virtual_console.rs | 8 +- .../fbdev/base/fbcon/framebuffer_console.rs | 19 ++-- kernel/src/driver/video/fbdev/base/mod.rs | 40 +++++-- .../driver/video/fbdev/base/render_helper.rs | 100 +++++++++++++----- kernel/src/lib.rs | 2 +- 5 files changed, 119 insertions(+), 50 deletions(-) diff --git a/kernel/src/driver/tty/virtual_terminal/virtual_console.rs b/kernel/src/driver/tty/virtual_terminal/virtual_console.rs index 445caf99df..85ed0bf107 100644 --- a/kernel/src/driver/tty/virtual_terminal/virtual_console.rs +++ b/kernel/src/driver/tty/virtual_terminal/virtual_console.rs @@ -146,7 +146,7 @@ pub struct VirtualConsoleData { impl VirtualConsoleData { #[inline(never)] pub fn new(num: usize) -> Self { - let mut a=Self { + let mut a = Self { state: VirtualConsoleInfo::new(0, 0), saved_state: Default::default(), cols: Default::default(), @@ -204,8 +204,8 @@ impl VirtualConsoleData { cursor_type: VcCursor::empty(), vc_index: num, }; - a.screen_buf.resize(15000,0); - a.screen_buf[14000]=0; + a.screen_buf.resize(15000, 0); + a.screen_buf[14000] = 0; a } @@ -1603,7 +1603,7 @@ impl VirtualConsoleData { // self.state.y, // self.cols, // ); - + self.screen_buf[self.pos] = tc as u16; if draw.x.is_none() { diff --git a/kernel/src/driver/video/fbdev/base/fbcon/framebuffer_console.rs b/kernel/src/driver/video/fbdev/base/fbcon/framebuffer_console.rs index bd2809243e..b2a825ee3a 100644 --- a/kernel/src/driver/video/fbdev/base/fbcon/framebuffer_console.rs +++ b/kernel/src/driver/video/fbdev/base/fbcon/framebuffer_console.rs @@ -312,33 +312,32 @@ impl ConsoleSwitch for BlittingFbConsole { let fbcon_data = self.fbcon_data(); let c = buf[0]; let width = (vc_data.font.width + 7) / 8; - let x_display_max=self.fb().current_fb_var().xres/width; - let mut count=count as u32; - let mut times=0; - while count>x_display_max { + let x_display_max = self.fb().current_fb_var().xres / width; + let mut count = count as u32; + let mut times = 0; + while count > x_display_max { self.put_string( vc_data, buf, x_display_max, - fbcon_data.display.real_y(ypos+times), + fbcon_data.display.real_y(ypos + times), xpos, self.get_color(vc_data, c, true), self.get_color(vc_data, c, false), )?; panic!(); - count-=x_display_max; - times+=1; + count -= x_display_max; + times += 1; } self.put_string( vc_data, buf, - count , - fbcon_data.display.real_y(ypos+times), + count, + fbcon_data.display.real_y(ypos + times), xpos, self.get_color(vc_data, c, true), self.get_color(vc_data, c, false), ) - } fn con_getxy( diff --git a/kernel/src/driver/video/fbdev/base/mod.rs b/kernel/src/driver/video/fbdev/base/mod.rs index 10061d9303..a98446c977 100644 --- a/kernel/src/driver/video/fbdev/base/mod.rs +++ b/kernel/src/driver/video/fbdev/base/mod.rs @@ -1,9 +1,12 @@ use alloc::{string::String, sync::Arc, vec::Vec}; -use render_helper::FrameP; +use render_helper::{FrameP, FramePointerStatus}; use system_error::SystemError; use crate::{ - driver::{base::device::Device, serial::serial8250::send_to_default_serial8250_port, tty::virtual_terminal::Color}, + driver::{ + base::device::Device, serial::serial8250::send_to_default_serial8250_port, + tty::virtual_terminal::Color, + }, init::boot_params, libs::rwlock::RwLock, mm::{ucontext::LockedVMA, PhysAddr, VirtAddr}, @@ -78,7 +81,6 @@ pub trait FrameBuffer: FrameBufferInfo + FrameBufferOps + Device { // 对齐到像素字节大小 bitstart &= !(byte_per_pixel - 1); - let dst2 = boot_param.screen_info.lfb_virt_base; if dst2.is_none() { return; @@ -259,7 +261,13 @@ pub trait FrameBuffer: FrameBufferInfo + FrameBufferOps + Device { _pitch_index: u32, ) { // let mut dst = _dst1.as_ptr::(); - let mut safe_dst=FrameP::new(self.current_fb_var().yres as usize, self.current_fb_var().xres as usize, self.current_fb_var().bits_per_pixel as usize, _dst1, _start_index); + let mut safe_dst = FrameP::new( + self.current_fb_var().yres as usize, + self.current_fb_var().xres as usize, + self.current_fb_var().bits_per_pixel as usize, + _dst1, + _image, + ); // let mut safe_dst=FrameP::new(480, 640, 32, _dst1,_start_index); // let mut safe_dst=FrameP::new(900, 1600, 32, _dst1,_start_index); @@ -273,11 +281,23 @@ pub trait FrameBuffer: FrameBufferInfo + FrameBufferOps + Device { _image.data.iter(), _image.width, ); + let mut pt_status = FramePointerStatus::Normal; for (content, full) in iter { - if !safe_dst.write(content){ - send_to_default_serial8250_port(format!("current Iamge:{:?}\n",_image).as_bytes()); - send_to_default_serial8250_port(format!("current Iter:{:?},pitch_index:{:?}\n",_pitch_index * count,_pitch_index).as_bytes()); - return; + // if !safe_dst.write(content){ + // send_to_default_serial8250_port(format!("current Iamge:{:?}\n",_image).as_bytes()); + // send_to_default_serial8250_port(format!("current Iter:{:?},pitch_index:{:?}\n",_pitch_index * count,_pitch_index).as_bytes()); + // return; + // } + match pt_status { + FramePointerStatus::OutOfBuffer => { + return; + } + FramePointerStatus::OutOfScreen => { + + } + FramePointerStatus::Normal => { + pt_status = safe_dst.write(content); + } } // unsafe { // *dst = content; @@ -288,9 +308,7 @@ pub trait FrameBuffer: FrameBufferInfo + FrameBufferOps + Device { if full { count += 1; safe_dst.move_with_offset(_pitch_index * count); - // dst = unsafe { - // _dst1.as_ptr::().add((_pitch_index * count) as usize) as *mut u32 - // }; + pt_status = FramePointerStatus::Normal; } } } diff --git a/kernel/src/driver/video/fbdev/base/render_helper.rs b/kernel/src/driver/video/fbdev/base/render_helper.rs index 3ff2c7fadc..a01f28bf53 100644 --- a/kernel/src/driver/video/fbdev/base/render_helper.rs +++ b/kernel/src/driver/video/fbdev/base/render_helper.rs @@ -1,6 +1,11 @@ use core::{ops::Add, slice::Iter}; -use crate::{arch::cpu::current_cpu_id, driver::serial::serial8250::send_to_default_serial8250_port, mm::VirtAddr}; +use crate::{ + arch::cpu::current_cpu_id, driver::serial::serial8250::send_to_default_serial8250_port, + mm::VirtAddr, +}; + +use super::FbImage; pub struct BitIter<'a> { fgcolor: u32, @@ -174,41 +179,88 @@ impl PixelLineStatus { } #[derive(Debug)] -pub struct FrameP{ - dst:VirtAddr, - limit:VirtAddr, - current:u32, - start_offset:u32 +pub struct FrameP { + dst: VirtAddr, + limit: VirtAddr, + current: usize, + start_offset: usize, + start_xpos: usize, + current_xpos: usize, + limit_xpos:usize, } -impl FrameP{ - pub fn new(frame_height:usize,frame_width:usize,bit_deep:usize,dst:VirtAddr,offset:u32)->Self{ +impl FrameP { + pub fn new( + frame_height: usize, + frame_width: usize, + bitdepth: usize, + dst: VirtAddr, + image: &FbImage, + ) -> Self { // let limit=(frame_height*frame_width-offset_in_frame)*bit_deep/8; // let limit=(frame_height*frame_width-offset_in_frame)*bit_deep/8; - let limit = VirtAddr::new(frame_height*frame_width*bit_deep/8)+dst; - Self { dst, limit, current:0,start_offset:offset } + let byte_per_pixel = bitdepth / 8; + let limit = VirtAddr::new(frame_height * frame_width * byte_per_pixel) + dst; + Self { + dst, + limit, + current: 0, + start_offset: start_offset(image, bitdepth as u32, (frame_width * bitdepth / 8) as u32) as usize, + start_xpos: image.x as usize * byte_per_pixel , + current_xpos: image.x as usize * byte_per_pixel , + limit_xpos:frame_width*byte_per_pixel , + } } - pub fn write(&mut self,data:T)->bool{ - let size=size_of::() as u32; - let mut dst=self.dst; + pub fn write(&mut self, data: T) -> FramePointerStatus { + let size = size_of::(); + let mut dst = self.dst; // if self.current+size>self.limit { // if true { - if self.dst.data()+self.current as usize+self.start_offset as usize+size_of::()>self.limit.data() { - send_to_default_serial8250_port(format!("warning:illegal use of frame_pointer has been detected! FB:{:?}\n",self).as_bytes()); + if self.dst.data() + self.current + self.start_offset + size + > self.limit.data() + { + // send_to_default_serial8250_port(format!("warning:illegal use of frame_pointer has been detected! FB:{:?}\n",self).as_bytes()); // panic!(); - return false; - }else{ - dst=dst.add(self.current as usize+self.start_offset as usize); + return FramePointerStatus::OutOfBuffer; + } + else if self.current_xpos+size>self.limit_xpos{ + return FramePointerStatus::OutOfScreen; + } + else { + dst = dst.add(self.current + self.start_offset ); + } unsafe { - *dst.as_ptr::()=data; + *dst.as_ptr::() = data; } - self.current+=size; - return true; + self.current += size; + self.current_xpos+=size; + + return FramePointerStatus::Normal; } - pub fn move_with_offset(&mut self,offset:u32){ - self.current=offset; + pub fn move_with_offset(&mut self, offset: u32) { + self.current = offset as usize; + self.current_xpos=self.start_xpos; } -} \ No newline at end of file +} + +pub enum FramePointerStatus { + Normal, + OutOfScreen, + OutOfBuffer, +} + +pub fn start_offset(image: &FbImage, bitdepth: u32, line_length: u32) -> u32 { + let x = image.x; + let y = image.y; + let mut bitstart = (y * line_length * 8) + (x * bitdepth); + let byte_per_pixel = core::mem::size_of::() as u32; + // 位转字节 + bitstart /= 8; + + // 对齐到像素字节大小 + bitstart &= !(byte_per_pixel - 1); + return bitstart; +} diff --git a/kernel/src/lib.rs b/kernel/src/lib.rs index 1c099f6537..f6d8b081d0 100644 --- a/kernel/src/lib.rs +++ b/kernel/src/lib.rs @@ -130,7 +130,7 @@ pub fn panic(info: &PanicInfo) -> ! { send_to_default_serial8250_port("No location info".as_bytes()); } } - let s=format!("Message:\n\t{}", info.message()); + let s = format!("Message:\n\t{}", info.message()); #[cfg(all(feature = "backtrace", target_arch = "x86_64"))] { From 3d265601b8cb9fd809cff0c9ac44e5822a4c59dc Mon Sep 17 00:00:00 2001 From: ZZJJWarth <2678328250@qq.com> Date: Fri, 8 Nov 2024 17:24:53 +0800 Subject: [PATCH 5/9] save --- kernel/src/arch/x86_64/asm/head.S | 2 +- kernel/src/driver/video/fbdev/base/mod.rs | 18 +----- .../driver/video/fbdev/base/render_helper.rs | 58 ++++++++++++++++--- 3 files changed, 52 insertions(+), 26 deletions(-) diff --git a/kernel/src/arch/x86_64/asm/head.S b/kernel/src/arch/x86_64/asm/head.S index 21db1ab119..6604767829 100644 --- a/kernel/src/arch/x86_64/asm/head.S +++ b/kernel/src/arch/x86_64/asm/head.S @@ -149,7 +149,7 @@ framebuffer_tag_start: .long framebuffer_tag_end - framebuffer_tag_start .long 640 // 宽 .long 480 // 高 - .long 32 + .long 24 framebuffer_tag_end: .align 8 .short MULTIBOOT2_HEADER_TAG_END diff --git a/kernel/src/driver/video/fbdev/base/mod.rs b/kernel/src/driver/video/fbdev/base/mod.rs index a98446c977..3025e8cdd4 100644 --- a/kernel/src/driver/video/fbdev/base/mod.rs +++ b/kernel/src/driver/video/fbdev/base/mod.rs @@ -104,13 +104,12 @@ pub trait FrameBuffer: FrameBufferInfo + FrameBufferOps + Device { bg = image.bg; } - if 32 % bit_per_pixel == 114514 + if 32 % bit_per_pixel == 0 && start_index == 0 && pitch_index == 0 && image.width & (32 / bit_per_pixel - 1) == 0 && (8..=32).contains(&bit_per_pixel) { - // loop{} unsafe { self.fast_imageblit(image, dst1, fg, bg) } } else { self.slow_imageblit( @@ -260,7 +259,6 @@ pub trait FrameBuffer: FrameBufferInfo + FrameBufferOps + Device { _start_index: u32, _pitch_index: u32, ) { - // let mut dst = _dst1.as_ptr::(); let mut safe_dst = FrameP::new( self.current_fb_var().yres as usize, self.current_fb_var().xres as usize, @@ -268,9 +266,6 @@ pub trait FrameBuffer: FrameBufferInfo + FrameBufferOps + Device { _dst1, _image, ); - // let mut safe_dst=FrameP::new(480, 640, 32, _dst1,_start_index); - // let mut safe_dst=FrameP::new(900, 1600, 32, _dst1,_start_index); - let mut count = 0; let iter = BitIter::new( _fg, @@ -283,11 +278,6 @@ pub trait FrameBuffer: FrameBufferInfo + FrameBufferOps + Device { ); let mut pt_status = FramePointerStatus::Normal; for (content, full) in iter { - // if !safe_dst.write(content){ - // send_to_default_serial8250_port(format!("current Iamge:{:?}\n",_image).as_bytes()); - // send_to_default_serial8250_port(format!("current Iter:{:?},pitch_index:{:?}\n",_pitch_index * count,_pitch_index).as_bytes()); - // return; - // } match pt_status { FramePointerStatus::OutOfBuffer => { return; @@ -299,12 +289,6 @@ pub trait FrameBuffer: FrameBufferInfo + FrameBufferOps + Device { pt_status = safe_dst.write(content); } } - // unsafe { - // *dst = content; - - // dst = dst.add(1); - // } - if full { count += 1; safe_dst.move_with_offset(_pitch_index * count); diff --git a/kernel/src/driver/video/fbdev/base/render_helper.rs b/kernel/src/driver/video/fbdev/base/render_helper.rs index a01f28bf53..c7b4793db7 100644 --- a/kernel/src/driver/video/fbdev/base/render_helper.rs +++ b/kernel/src/driver/video/fbdev/base/render_helper.rs @@ -178,6 +178,21 @@ impl PixelLineStatus { } } + +/// # 结构功能 +/// 安全的FrameBufferPointer +/// 使用该结构体访问FrameBuffer可以防止超出FrameBuffer区域的访问 +/// 需要注意,使用该指针写入时,任何超出屏幕的写入都是无效的!即使仍然可以写入显存。 +/// 此外由于FbImage中的x和y变量采用u32类型,所以并未考虑左越界和上越界的安全性(即Image.x<0或Image.y<0的情况) +/// ## 成员 +/// +/// - "dst" : 显存base address,通常是0xffffa1003ff00000 +/// - "limit" : 显存区域上界,可以通过公式计算:limit = dst + 分辨率高*分辨率宽*每个像素的**字节**数。也就是说任何对于显存的访问应该限制在[dst,limit)中 +/// - "current" : 当前相对于start_offset的位移 +/// - "start_offset" : 如果你要渲染某个Image,你可能不是总是从屏幕左上角(0,0)开始渲染,你可能从某个offset开始 +/// - "start_xpos" : 表示你要渲染的Image的x位置的字节位置 +/// - "current_xpos" : 当前渲染的x位置的字节位置 +/// - "limit_xpos" : 最大的渲染x位置的字节位置。 例:假设系统的分辨率为640,位深为24,你需要渲染的Image的x坐标为200,那么start_xpos=200*3=600,current_xpos=200*3+当前行已经渲染像素数*3,limit_xpos=640*3 #[derive(Debug)] pub struct FrameP { dst: VirtAddr, @@ -189,6 +204,8 @@ pub struct FrameP { limit_xpos:usize, } + + impl FrameP { pub fn new( frame_height: usize, @@ -197,8 +214,6 @@ impl FrameP { dst: VirtAddr, image: &FbImage, ) -> Self { - // let limit=(frame_height*frame_width-offset_in_frame)*bit_deep/8; - // let limit=(frame_height*frame_width-offset_in_frame)*bit_deep/8; let byte_per_pixel = bitdepth / 8; let limit = VirtAddr::new(frame_height * frame_width * byte_per_pixel) + dst; Self { @@ -211,44 +226,71 @@ impl FrameP { limit_xpos:frame_width*byte_per_pixel , } } + + /// # 函数功能 + /// 写入某个数据并将指针增大 pub fn write(&mut self, data: T) -> FramePointerStatus { + // 首先获取数据大小 let size = size_of::(); + // 复制显存指针防止改变self的dst let mut dst = self.dst; - // if self.current+size>self.limit { - // if true { + // 你最终要写入的位置实际上是[dst+start_offset+current,dst+start_offset+current+size),所以我们要确定你写入的位置是否超过limit if self.dst.data() + self.current + self.start_offset + size > self.limit.data() { - // send_to_default_serial8250_port(format!("warning:illegal use of frame_pointer has been detected! FB:{:?}\n",self).as_bytes()); - // panic!(); return FramePointerStatus::OutOfBuffer; } + // 我们也不希望你的x超出屏幕右边,超出屏幕右边的部分会被忽略掉,因为如果写入显存会导致内存风险 else if self.current_xpos+size>self.limit_xpos{ return FramePointerStatus::OutOfScreen; } - else { + // 如果上面两个检查都通过了,我们就可以写入显存了 + else { + // 这里是写入位置的实际虚拟地址 dst = dst.add(self.current + self.start_offset ); } + // 写入操作 unsafe { *dst.as_ptr::() = data; } + // 写入后更新current和xpos self.current += size; self.current_xpos+=size; - + // 由于写入正常,我们返回正常的状态 return FramePointerStatus::Normal; } + /// # 函数功能 + /// 移动指针**至**某个offset + /// todo: 当前函数应当只用于换行,否则可能会导致安全性问题,即offset应该是每行像素的开头 pub fn move_with_offset(&mut self, offset: u32) { self.current = offset as usize; + // let x_pos=self.current%self.limit_xpos; + // match x_pos{ + // n if n{ + // // send_to_default_serial8250_port(format!("Sended by function move_with_offset: Check if there is misusage of offset,the image.x is:{:?} while the xpos indicated by the offset is:{:?},current FP:{:?}\n",self.start_offset,x_pos,self).as_bytes()); + // } + // n if n>=self.limit_xpos=>{ + // // send_to_default_serial8250_port(format!("Sended by function move_with_offset: Check if there is misusage of offset,The offset:{:?} is so large that it would exceed the limit of frame buffer\n",offset).as_bytes()); + // } + // _=>{ + + // } + // } self.current_xpos=self.start_xpos; } } + + pub enum FramePointerStatus { + /// 表示状态正常 Normal, + /// 超出屏幕,一直到换行时才应该恢复到正常状态 OutOfScreen, + /// 超出缓存,此时应当立即停止渲染 OutOfBuffer, } From b4df7c71d658c8bb5af6e0b6b3eebfd729e9fa6b Mon Sep 17 00:00:00 2001 From: ZZJJWarth <2678328250@qq.com> Date: Fri, 8 Nov 2024 17:33:00 +0800 Subject: [PATCH 6/9] save --- kernel/src/arch/x86_64/asm/head.S | 6 ++--- .../tty/virtual_terminal/virtual_console.rs | 12 ++++------ .../fbdev/base/fbcon/framebuffer_console.rs | 24 +++---------------- kernel/src/lib.rs | 15 +++++------- 4 files changed, 16 insertions(+), 41 deletions(-) diff --git a/kernel/src/arch/x86_64/asm/head.S b/kernel/src/arch/x86_64/asm/head.S index 6604767829..d7b192343a 100644 --- a/kernel/src/arch/x86_64/asm/head.S +++ b/kernel/src/arch/x86_64/asm/head.S @@ -147,9 +147,9 @@ framebuffer_tag_start: .short MULTIBOOT2_HEADER_TAG_FRAMEBUFFER .short MULTIBOOT2_HEADER_TAG_OPTIONAL .long framebuffer_tag_end - framebuffer_tag_start - .long 640 // 宽 - .long 480 // 高 - .long 24 + .long 1440 // 宽 + .long 900 // 高 + .long 32 framebuffer_tag_end: .align 8 .short MULTIBOOT2_HEADER_TAG_END diff --git a/kernel/src/driver/tty/virtual_terminal/virtual_console.rs b/kernel/src/driver/tty/virtual_terminal/virtual_console.rs index 93cdf73ed7..773d99c4b2 100644 --- a/kernel/src/driver/tty/virtual_terminal/virtual_console.rs +++ b/kernel/src/driver/tty/virtual_terminal/virtual_console.rs @@ -146,7 +146,7 @@ pub struct VirtualConsoleData { impl VirtualConsoleData { #[inline(never)] pub fn new(num: usize) -> Self { - let mut a = Self { + Self { state: VirtualConsoleInfo::new(0, 0), saved_state: Default::default(), cols: Default::default(), @@ -203,10 +203,7 @@ impl VirtualConsoleData { driver_funcs: None, cursor_type: VcCursor::empty(), vc_index: num, - }; - a.screen_buf.resize(15000, 0); - a.screen_buf[14000] = 0; - a + } } pub fn init(&mut self, rows: Option, cols: Option, clear: bool) { @@ -216,7 +213,7 @@ impl VirtualConsoleData { if let Some(cols) = cols { self.cols = cols; } - // self.screen_buf.resize(self.cols * self.rows*2, 0); + self.pos = self.cols * self.state.y + self.state.x; // self.bytes_per_row = self.cols << 1; @@ -225,7 +222,7 @@ impl VirtualConsoleData { self.underline_color = 3; // cyan self.half_color = 0x08; // grey - // self.screen_buf.resize(self.cols * self.rows, 0); + self.screen_buf.resize(self.cols * self.rows, 0); self.reset(clear); } @@ -1601,7 +1598,6 @@ impl VirtualConsoleData { // self.state.y, // self.cols, // ); - self.screen_buf[self.pos] = tc as u16; if self.should_update() && draw.x.is_none() { diff --git a/kernel/src/driver/video/fbdev/base/fbcon/framebuffer_console.rs b/kernel/src/driver/video/fbdev/base/fbcon/framebuffer_console.rs index b2a825ee3a..3c61ba30bc 100644 --- a/kernel/src/driver/video/fbdev/base/fbcon/framebuffer_console.rs +++ b/kernel/src/driver/video/fbdev/base/fbcon/framebuffer_console.rs @@ -228,7 +228,7 @@ impl ConsoleSwitch for BlittingFbConsole { vc_data.pos = vc_data.state.x + vc_data.state.y * vc_data.cols; let new_size = vc_data.cols * vc_data.rows; - // vc_data.screen_buf.resize(new_size, 0); + vc_data.screen_buf.resize(new_size, 0); } else { unimplemented!("Resize is not supported at the moment!"); } @@ -311,29 +311,11 @@ impl ConsoleSwitch for BlittingFbConsole { } let fbcon_data = self.fbcon_data(); let c = buf[0]; - let width = (vc_data.font.width + 7) / 8; - let x_display_max = self.fb().current_fb_var().xres / width; - let mut count = count as u32; - let mut times = 0; - while count > x_display_max { - self.put_string( - vc_data, - buf, - x_display_max, - fbcon_data.display.real_y(ypos + times), - xpos, - self.get_color(vc_data, c, true), - self.get_color(vc_data, c, false), - )?; - panic!(); - count -= x_display_max; - times += 1; - } self.put_string( vc_data, buf, - count, - fbcon_data.display.real_y(ypos + times), + count as u32, + fbcon_data.display.real_y(ypos), xpos, self.get_color(vc_data, c, true), self.get_color(vc_data, c, false), diff --git a/kernel/src/lib.rs b/kernel/src/lib.rs index 3fd09fd957..881f6d3198 100644 --- a/kernel/src/lib.rs +++ b/kernel/src/lib.rs @@ -111,34 +111,31 @@ pub static KERNEL_ALLOCATOR: KernelAllocator = KernelAllocator; #[panic_handler] #[no_mangle] pub fn panic(info: &PanicInfo) -> ! { - use driver::serial::serial8250::send_to_default_serial8250_port; use log::error; use process::ProcessManager; - send_to_default_serial8250_port(format!("Kernel Panic Occurred.").as_bytes()); + error!("Kernel Panic Occurred."); match info.location() { Some(loc) => { - let s = format!( + println!( "Location:\n\tFile: {}\n\tLine: {}, Column: {}", loc.file(), loc.line(), loc.column() ); - send_to_default_serial8250_port(s.as_bytes()); } None => { - send_to_default_serial8250_port("No location info".as_bytes()); + println!("No location info"); } } - let s = format!("Message:\n\t{}", info.message()); + println!("Message:\n\t{}", info.message()); #[cfg(all(feature = "backtrace", target_arch = "x86_64"))] { unsafe { let bt = mini_backtrace::Backtrace::<16>::capture(); - format!("Rust Panic Backtrace:\n"); - send_to_default_serial8250_port(s.as_bytes()); + println!("Rust Panic Backtrace:"); let mut level = 0; for frame in bt.frames { lookup_kallsyms(frame as u64, level); @@ -147,7 +144,7 @@ pub fn panic(info: &PanicInfo) -> ! { }; } - format!("Current PCB:\n\t{:?}", (ProcessManager::current_pcb())); + println!("Current PCB:\n\t{:?}", (ProcessManager::current_pcb())); ProcessManager::exit(usize::MAX); } From c96cef87565b16a8b3d0738a0c6a7802628c8cf8 Mon Sep 17 00:00:00 2001 From: ZZJJWarth <2678328250@qq.com> Date: Fri, 8 Nov 2024 19:51:52 +0800 Subject: [PATCH 7/9] save --- kernel/src/driver/video/fbdev/base/mod.rs | 94 +++++++------------ .../driver/video/fbdev/base/render_helper.rs | 38 +++----- 2 files changed, 47 insertions(+), 85 deletions(-) diff --git a/kernel/src/driver/video/fbdev/base/mod.rs b/kernel/src/driver/video/fbdev/base/mod.rs index 3025e8cdd4..b8ddc76ea2 100644 --- a/kernel/src/driver/video/fbdev/base/mod.rs +++ b/kernel/src/driver/video/fbdev/base/mod.rs @@ -3,10 +3,7 @@ use render_helper::{FrameP, FramePointerStatus}; use system_error::SystemError; use crate::{ - driver::{ - base::device::Device, serial::serial8250::send_to_default_serial8250_port, - tty::virtual_terminal::Color, - }, + driver::{base::device::Device, tty::virtual_terminal::Color}, init::boot_params, libs::rwlock::RwLock, mm::{ucontext::LockedVMA, PhysAddr, VirtAddr}, @@ -79,15 +76,16 @@ pub trait FrameBuffer: FrameBufferInfo + FrameBufferOps + Device { // 位转字节 bitstart /= 8; - // 对齐到像素字节大小 - bitstart &= !(byte_per_pixel - 1); let dst2 = boot_param.screen_info.lfb_virt_base; if dst2.is_none() { return; } - let mut dst1 = dst2.unwrap(); - dst1 += VirtAddr::new(bitstart as usize); - + let mut safe_pointer=FrameP::new( +self.current_fb_var().yres as usize, + self.current_fb_var().xres as usize, + self.current_fb_var().bits_per_pixel as usize, + dst2.unwrap(), image + ); let _ = self.fb_sync(); if image.depth == 1 { @@ -110,15 +108,13 @@ pub trait FrameBuffer: FrameBufferInfo + FrameBufferOps + Device { && image.width & (32 / bit_per_pixel - 1) == 0 && (8..=32).contains(&bit_per_pixel) { - unsafe { self.fast_imageblit(image, dst1, fg, bg) } + unsafe { self.fast_imageblit(image, &mut safe_pointer, fg, bg) } } else { self.slow_imageblit( image, - dst2.unwrap(), + &mut safe_pointer, fg, bg, - bitstart, - self.current_fb_fix().line_length, ) } } else { @@ -132,7 +128,7 @@ pub trait FrameBuffer: FrameBufferInfo + FrameBufferOps + Device { /// 要求 image->width 可以被像素或 dword (ppw) 整除。 /// 要求 fix->line_length 可以被 4 整除。 /// 扫描线的开始和结束都是 dword 对齐的。 - unsafe fn fast_imageblit(&self, image: &FbImage, mut dst1: VirtAddr, fg: u32, bg: u32) { + unsafe fn fast_imageblit(&self, image: &FbImage, dst1: &mut FrameP, fg: u32, bg: u32) { let bpp = self.current_fb_var().bits_per_pixel; let mut fgx = fg; let mut bgx = bg; @@ -164,13 +160,12 @@ pub trait FrameBuffer: FrameBufferInfo + FrameBufferOps + Device { color_tab[idx] = (*val & eorx) ^ bgx; } - let mut dst; let mut shift; let mut src; let mut offset = 0; let mut j = 0; + let mut count=0; for _ in (0..image.height).rev() { - dst = dst1.as_ptr::(); shift = 8; src = offset; match ppw { @@ -178,10 +173,8 @@ pub trait FrameBuffer: FrameBufferInfo + FrameBufferOps + Device { // 8bpp j = k; while j >= 2 { - *dst = color_tab[(image.data[src] as usize >> 4) & bitmask]; - dst = dst.add(1); - *dst = color_tab[(image.data[src] as usize) & bitmask]; - dst = dst.add(1); + dst1.write(color_tab[(image.data[src] as usize >> 4) & bitmask]); + dst1.write(color_tab[(image.data[src] as usize) & bitmask]); j -= 2; src += 1; } @@ -190,14 +183,10 @@ pub trait FrameBuffer: FrameBufferInfo + FrameBufferOps + Device { // 16bpp j = k; while j >= 4 { - *dst = color_tab[(image.data[src] as usize >> 6) & bitmask]; - dst = dst.add(1); - *dst = color_tab[(image.data[src] as usize >> 4) & bitmask]; - dst = dst.add(1); - *dst = color_tab[(image.data[src] as usize >> 2) & bitmask]; - dst = dst.add(1); - *dst = color_tab[(image.data[src] as usize) & bitmask]; - dst = dst.add(1); + dst1.write(color_tab[(image.data[src] as usize >> 6) & bitmask]); + dst1.write(color_tab[(image.data[src] as usize >> 4) & bitmask]); + dst1.write(color_tab[(image.data[src] as usize >> 2) & bitmask]); + dst1.write(color_tab[(image.data[src] as usize ) & bitmask]); src += 1; j -= 4; } @@ -206,22 +195,14 @@ pub trait FrameBuffer: FrameBufferInfo + FrameBufferOps + Device { // 32 bpp j = k; while j >= 8 { - *dst = color_tab[(image.data[src] as usize >> 7) & bitmask]; - dst = dst.add(1); - *dst = color_tab[(image.data[src] as usize >> 6) & bitmask]; - dst = dst.add(1); - *dst = color_tab[(image.data[src] as usize >> 5) & bitmask]; - dst = dst.add(1); - *dst = color_tab[(image.data[src] as usize >> 4) & bitmask]; - dst = dst.add(1); - *dst = color_tab[(image.data[src] as usize >> 3) & bitmask]; - dst = dst.add(1); - *dst = color_tab[(image.data[src] as usize >> 2) & bitmask]; - dst = dst.add(1); - *dst = color_tab[(image.data[src] as usize >> 1) & bitmask]; - dst = dst.add(1); - *dst = color_tab[(image.data[src] as usize) & bitmask]; - dst = dst.add(1); + dst1.write(color_tab[(image.data[src] as usize >> 7) & bitmask]); + dst1.write(color_tab[(image.data[src] as usize >> 6) & bitmask]); + dst1.write(color_tab[(image.data[src] as usize >> 5) & bitmask]); + dst1.write(color_tab[(image.data[src] as usize >> 4) & bitmask]); + dst1.write(color_tab[(image.data[src] as usize >> 3) & bitmask]); + dst1.write(color_tab[(image.data[src] as usize >> 2) & bitmask]); + dst1.write(color_tab[(image.data[src] as usize >> 1) & bitmask]); + dst1.write(color_tab[(image.data[src] as usize) & bitmask]); src += 1; j -= 8; } @@ -236,8 +217,7 @@ pub trait FrameBuffer: FrameBufferInfo + FrameBufferOps + Device { */ while j != 0 { shift -= ppw; - *dst = color_tab[(image.data[src] as usize >> shift) & bitmask]; - dst = dst.add(1); + dst1.write(color_tab[(image.data[src] as usize >> shift) & bitmask]); if shift == 0 { shift = 8; src += 1; @@ -245,7 +225,8 @@ pub trait FrameBuffer: FrameBufferInfo + FrameBufferOps + Device { j -= 1; } - dst1 += VirtAddr::new(self.current_fb_fix().line_length as usize); + count+=1; + dst1.move_with_offset(self.current_fb_fix().line_length*count); offset += spitch as usize; } } @@ -253,20 +234,12 @@ pub trait FrameBuffer: FrameBufferInfo + FrameBufferOps + Device { fn slow_imageblit( &self, _image: &FbImage, - _dst1: VirtAddr, + safe_dst:&mut FrameP, _fg: u32, _bg: u32, - _start_index: u32, - _pitch_index: u32, ) { - let mut safe_dst = FrameP::new( - self.current_fb_var().yres as usize, - self.current_fb_var().xres as usize, - self.current_fb_var().bits_per_pixel as usize, - _dst1, - _image, - ); let mut count = 0; + let mut pt_status = FramePointerStatus::Normal; let iter = BitIter::new( _fg, _bg, @@ -276,22 +249,19 @@ pub trait FrameBuffer: FrameBufferInfo + FrameBufferOps + Device { _image.data.iter(), _image.width, ); - let mut pt_status = FramePointerStatus::Normal; for (content, full) in iter { match pt_status { FramePointerStatus::OutOfBuffer => { return; } - FramePointerStatus::OutOfScreen => { - - } + FramePointerStatus::OutOfScreen => {} FramePointerStatus::Normal => { pt_status = safe_dst.write(content); } } if full { count += 1; - safe_dst.move_with_offset(_pitch_index * count); + safe_dst.move_with_offset(self.current_fb_fix().line_length*count); pt_status = FramePointerStatus::Normal; } } diff --git a/kernel/src/driver/video/fbdev/base/render_helper.rs b/kernel/src/driver/video/fbdev/base/render_helper.rs index c7b4793db7..7b96979757 100644 --- a/kernel/src/driver/video/fbdev/base/render_helper.rs +++ b/kernel/src/driver/video/fbdev/base/render_helper.rs @@ -1,9 +1,6 @@ use core::{ops::Add, slice::Iter}; -use crate::{ - arch::cpu::current_cpu_id, driver::serial::serial8250::send_to_default_serial8250_port, - mm::VirtAddr, -}; +use crate::mm::VirtAddr; use super::FbImage; @@ -178,14 +175,13 @@ impl PixelLineStatus { } } - /// # 结构功能 /// 安全的FrameBufferPointer /// 使用该结构体访问FrameBuffer可以防止超出FrameBuffer区域的访问 /// 需要注意,使用该指针写入时,任何超出屏幕的写入都是无效的!即使仍然可以写入显存。 /// 此外由于FbImage中的x和y变量采用u32类型,所以并未考虑左越界和上越界的安全性(即Image.x<0或Image.y<0的情况) /// ## 成员 -/// +/// /// - "dst" : 显存base address,通常是0xffffa1003ff00000 /// - "limit" : 显存区域上界,可以通过公式计算:limit = dst + 分辨率高*分辨率宽*每个像素的**字节**数。也就是说任何对于显存的访问应该限制在[dst,limit)中 /// - "current" : 当前相对于start_offset的位移 @@ -201,11 +197,9 @@ pub struct FrameP { start_offset: usize, start_xpos: usize, current_xpos: usize, - limit_xpos:usize, + limit_xpos: usize, } - - impl FrameP { pub fn new( frame_height: usize, @@ -220,10 +214,11 @@ impl FrameP { dst, limit, current: 0, - start_offset: start_offset(image, bitdepth as u32, (frame_width * bitdepth / 8) as u32) as usize, - start_xpos: image.x as usize * byte_per_pixel , - current_xpos: image.x as usize * byte_per_pixel , - limit_xpos:frame_width*byte_per_pixel , + start_offset: start_offset(image, bitdepth as u32, (frame_width * bitdepth / 8) as u32) + as usize, + start_xpos: image.x as usize * byte_per_pixel, + current_xpos: image.x as usize * byte_per_pixel, + limit_xpos: frame_width * byte_per_pixel, } } @@ -236,20 +231,17 @@ impl FrameP { let mut dst = self.dst; // 你最终要写入的位置实际上是[dst+start_offset+current,dst+start_offset+current+size),所以我们要确定你写入的位置是否超过limit - if self.dst.data() + self.current + self.start_offset + size - > self.limit.data() - { + if self.dst.data() + self.current + self.start_offset + size > self.limit.data() { return FramePointerStatus::OutOfBuffer; } // 我们也不希望你的x超出屏幕右边,超出屏幕右边的部分会被忽略掉,因为如果写入显存会导致内存风险 - else if self.current_xpos+size>self.limit_xpos{ + else if self.current_xpos + size > self.limit_xpos { return FramePointerStatus::OutOfScreen; } // 如果上面两个检查都通过了,我们就可以写入显存了 else { // 这里是写入位置的实际虚拟地址 - dst = dst.add(self.current + self.start_offset ); - + dst = dst.add(self.current + self.start_offset); } // 写入操作 unsafe { @@ -257,7 +249,7 @@ impl FrameP { } // 写入后更新current和xpos self.current += size; - self.current_xpos+=size; + self.current_xpos += size; // 由于写入正常,我们返回正常的状态 return FramePointerStatus::Normal; } @@ -279,11 +271,11 @@ impl FrameP { // } // } - self.current_xpos=self.start_xpos; + self.current_xpos = self.start_xpos; } -} - + +} pub enum FramePointerStatus { /// 表示状态正常 From b73c497fb6461de4ca6c5b48ccc57d103fbd453b Mon Sep 17 00:00:00 2001 From: ZZJJWarth <2678328250@qq.com> Date: Fri, 8 Nov 2024 19:52:13 +0800 Subject: [PATCH 8/9] save --- kernel/src/driver/video/fbdev/base/mod.rs | 3 --- 1 file changed, 3 deletions(-) diff --git a/kernel/src/driver/video/fbdev/base/mod.rs b/kernel/src/driver/video/fbdev/base/mod.rs index b8ddc76ea2..507c1ce726 100644 --- a/kernel/src/driver/video/fbdev/base/mod.rs +++ b/kernel/src/driver/video/fbdev/base/mod.rs @@ -73,9 +73,6 @@ pub trait FrameBuffer: FrameBufferInfo + FrameBufferOps + Device { let mut bitstart = (y * self.current_fb_fix().line_length * 8) + (x * bit_per_pixel); let start_index = bitstart & (32 - 1); let pitch_index = (self.current_fb_fix().line_length & (byte_per_pixel - 1)) * 8; - // 位转字节 - bitstart /= 8; - let dst2 = boot_param.screen_info.lfb_virt_base; if dst2.is_none() { return; From f4b3f7416cd6e8a023912f3d92d34bf6e83d6f75 Mon Sep 17 00:00:00 2001 From: ZZJJWarth <2678328250@qq.com> Date: Fri, 8 Nov 2024 19:54:06 +0800 Subject: [PATCH 9/9] fmt --- kernel/src/driver/video/fbdev/base/mod.rs | 40 +++++++------------ .../driver/video/fbdev/base/render_helper.rs | 2 - 2 files changed, 15 insertions(+), 27 deletions(-) diff --git a/kernel/src/driver/video/fbdev/base/mod.rs b/kernel/src/driver/video/fbdev/base/mod.rs index 507c1ce726..0f3b6081cc 100644 --- a/kernel/src/driver/video/fbdev/base/mod.rs +++ b/kernel/src/driver/video/fbdev/base/mod.rs @@ -70,18 +70,19 @@ pub trait FrameBuffer: FrameBufferInfo + FrameBufferOps + Device { let bit_per_pixel = self.current_fb_var().bits_per_pixel; // 计算图像在帧缓冲中的起始位 - let mut bitstart = (y * self.current_fb_fix().line_length * 8) + (x * bit_per_pixel); + let bitstart = (y * self.current_fb_fix().line_length * 8) + (x * bit_per_pixel); let start_index = bitstart & (32 - 1); let pitch_index = (self.current_fb_fix().line_length & (byte_per_pixel - 1)) * 8; let dst2 = boot_param.screen_info.lfb_virt_base; if dst2.is_none() { return; } - let mut safe_pointer=FrameP::new( -self.current_fb_var().yres as usize, - self.current_fb_var().xres as usize, - self.current_fb_var().bits_per_pixel as usize, - dst2.unwrap(), image + let mut safe_pointer = FrameP::new( + self.current_fb_var().yres as usize, + self.current_fb_var().xres as usize, + self.current_fb_var().bits_per_pixel as usize, + dst2.unwrap(), + image, ); let _ = self.fb_sync(); @@ -107,12 +108,7 @@ self.current_fb_var().yres as usize, { unsafe { self.fast_imageblit(image, &mut safe_pointer, fg, bg) } } else { - self.slow_imageblit( - image, - &mut safe_pointer, - fg, - bg, - ) + self.slow_imageblit(image, &mut safe_pointer, fg, bg) } } else { todo!("color image blit todo"); @@ -125,7 +121,7 @@ self.current_fb_var().yres as usize, /// 要求 image->width 可以被像素或 dword (ppw) 整除。 /// 要求 fix->line_length 可以被 4 整除。 /// 扫描线的开始和结束都是 dword 对齐的。 - unsafe fn fast_imageblit(&self, image: &FbImage, dst1: &mut FrameP, fg: u32, bg: u32) { + unsafe fn fast_imageblit(&self, image: &FbImage, dst1: &mut FrameP, fg: u32, bg: u32) { let bpp = self.current_fb_var().bits_per_pixel; let mut fgx = fg; let mut bgx = bg; @@ -161,7 +157,7 @@ self.current_fb_var().yres as usize, let mut src; let mut offset = 0; let mut j = 0; - let mut count=0; + let mut count = 0; for _ in (0..image.height).rev() { shift = 8; src = offset; @@ -183,7 +179,7 @@ self.current_fb_var().yres as usize, dst1.write(color_tab[(image.data[src] as usize >> 6) & bitmask]); dst1.write(color_tab[(image.data[src] as usize >> 4) & bitmask]); dst1.write(color_tab[(image.data[src] as usize >> 2) & bitmask]); - dst1.write(color_tab[(image.data[src] as usize ) & bitmask]); + dst1.write(color_tab[(image.data[src] as usize) & bitmask]); src += 1; j -= 4; } @@ -222,19 +218,13 @@ self.current_fb_var().yres as usize, j -= 1; } - count+=1; - dst1.move_with_offset(self.current_fb_fix().line_length*count); + count += 1; + dst1.move_with_offset(self.current_fb_fix().line_length * count); offset += spitch as usize; } } - fn slow_imageblit( - &self, - _image: &FbImage, - safe_dst:&mut FrameP, - _fg: u32, - _bg: u32, - ) { + fn slow_imageblit(&self, _image: &FbImage, safe_dst: &mut FrameP, _fg: u32, _bg: u32) { let mut count = 0; let mut pt_status = FramePointerStatus::Normal; let iter = BitIter::new( @@ -258,7 +248,7 @@ self.current_fb_var().yres as usize, } if full { count += 1; - safe_dst.move_with_offset(self.current_fb_fix().line_length*count); + safe_dst.move_with_offset(self.current_fb_fix().line_length * count); pt_status = FramePointerStatus::Normal; } } diff --git a/kernel/src/driver/video/fbdev/base/render_helper.rs b/kernel/src/driver/video/fbdev/base/render_helper.rs index 7b96979757..25b2d5cb34 100644 --- a/kernel/src/driver/video/fbdev/base/render_helper.rs +++ b/kernel/src/driver/video/fbdev/base/render_helper.rs @@ -273,8 +273,6 @@ impl FrameP { // } self.current_xpos = self.start_xpos; } - - } pub enum FramePointerStatus {