33// #![feature(asm_const)]
44
55use core:: fmt:: Write ;
6+ use core:: ptr;
67use spin:: Mutex ;
78use uart_16550:: SerialPort ;
89use x86_64:: instructions:: { hlt, interrupts} ;
@@ -19,7 +20,7 @@ fn panic(info: &core::panic::PanicInfo) -> ! {
1920}
2021
2122#[ unsafe( no_mangle) ] // 禁止编译器对该函数进行名称改编,确保最终 ELF 里的符号名就是 kstart
22- extern "C" fn kstart ( ) -> ! {
23+ pub extern "C" fn kstart ( ) -> ! {
2324 init_serial ( ) ;
2425 banner ( ) ;
2526
@@ -61,6 +62,38 @@ pub fn kprint(args: core::fmt::Arguments) { // 生成一个封装好的格式化
6162 }
6263}
6364
65+ // --- Minimal C ABI shims ---
66+ // These satisfy symbols the core/alloc runtime expects when no libc is present.
67+ #[ unsafe( no_mangle) ]
68+ pub extern "C" fn memcpy ( dest : * mut u8 , src : * const u8 , n : usize ) -> * mut u8 {
69+ unsafe { ptr:: copy_nonoverlapping ( src, dest, n) ; }
70+ dest
71+ }
72+
73+ #[ unsafe( no_mangle) ]
74+ pub extern "C" fn memmove ( dest : * mut u8 , src : * const u8 , n : usize ) -> * mut u8 {
75+ unsafe { ptr:: copy ( src, dest, n) ; }
76+ dest
77+ }
78+
79+ #[ unsafe( no_mangle) ]
80+ pub extern "C" fn memset ( dest : * mut u8 , value : i32 , n : usize ) -> * mut u8 {
81+ unsafe { ptr:: write_bytes ( dest, value as u8 , n) ; }
82+ dest
83+ }
84+
85+ #[ unsafe( no_mangle) ]
86+ pub extern "C" fn memcmp ( a : * const u8 , b : * const u8 , n : usize ) -> i32 {
87+ for i in 0 ..n {
88+ let va = unsafe { * a. add ( i) } ;
89+ let vb = unsafe { * b. add ( i) } ;
90+ if va != vb {
91+ return va as i32 - vb as i32 ;
92+ }
93+ }
94+ 0
95+ }
96+
6497#[ macro_export]
6598macro_rules! kprintln {
6699 // 接受任意格式化参数列表,等同 println! 的可变参数匹配方式
0 commit comments