From 82d2e446a401e7eee57a847f48a6d162931170c3 Mon Sep 17 00:00:00 2001 From: login Date: Sat, 12 Nov 2022 15:25:54 +0800 Subject: [PATCH] =?UTF-8?q?new:=20=E6=9A=82=E6=97=B6=E7=A7=BB=E9=99=A4cbin?= =?UTF-8?q?dgen=20(#82)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kernel/build.rs | 5 +---- kernel/cbindgen.toml | 8 ++++---- kernel/src/Makefile | 5 +++-- kernel/src/include/bindings/mod.rs | 1 + kernel/src/include/bindings/wrapper.h | 2 ++ kernel/src/include/mod.rs | 1 + kernel/src/lib.rs | 8 +++++++- kernel/src/main.c | 3 --- kernel/src/mm/allocator.rs | 22 ++++++++++++++++++++++ kernel/src/mm/mod.rs | 1 + 10 files changed, 42 insertions(+), 14 deletions(-) create mode 100644 kernel/src/include/bindings/mod.rs create mode 100644 kernel/src/include/mod.rs create mode 100644 kernel/src/mm/allocator.rs create mode 100644 kernel/src/mm/mod.rs diff --git a/kernel/build.rs b/kernel/build.rs index d78d9d02..c6d4a1eb 100644 --- a/kernel/build.rs +++ b/kernel/build.rs @@ -23,6 +23,7 @@ fn main() { // The input header we would like to generate // bindings for. .header("src/include/bindings/wrapper.h") + .blocklist_file("src/include/bindings/bindings.h") .clang_arg("--target=x86_64-none-none") .clang_arg("-v") // 使用core,并将c语言的类型改为core::ffi,而不是使用std库。 @@ -41,8 +42,4 @@ fn main() { .write_to_file(out_path.join("bindings.rs")) .expect("Couldn't write bindings!"); } - - cbindgen::generate(crate_dir) - .unwrap() - .write_to_file(out_path.join("bindings.h")); } diff --git a/kernel/cbindgen.toml b/kernel/cbindgen.toml index 19696ac4..4980771d 100644 --- a/kernel/cbindgen.toml +++ b/kernel/cbindgen.toml @@ -51,12 +51,12 @@ namespace = "ffi" # A list of sys headers to #include (with angle brackets) # default: [] -sys_includes = [] +sys_includes = ["stdint.h"] # 生成的binding文件要include的头文件 # A list of headers to #include (with quotes) # default: [] -includes = ["stdint.h"] +includes = [] # Whether cbindgen's default C/C++ standard imports should be suppressed. These # imports are included by default because our generated headers tend to require @@ -584,7 +584,7 @@ clean = false # bindings for. # # default: [] -extra_bindings = ["my_awesome_dep"] +# extra_bindings = ["my_awesome_dep"] [parse.expand] # A list of crate names that should be run through `cargo expand` before @@ -614,7 +614,7 @@ default_features = true # appropriate features in its dependencies # # default: [] -features = ["cbindgen"] +# features = ["cbindgen"] [ptr] # An optional string to decorate all pointers that are diff --git a/kernel/src/Makefile b/kernel/src/Makefile index caf45519..feae39e6 100644 --- a/kernel/src/Makefile +++ b/kernel/src/Makefile @@ -31,10 +31,11 @@ main.o: main.c # The -m64 option sets int to 32bits and long and pointer to 64 bits and generates code for AMD’s x86-64 architecture. $(CC) $(CFLAGS) -c main.c -o main.o - -all: kernel +kernel_rust: rustup default nightly cargo +nightly build --release --target ./arch/x86_64/x86_64-unknown-none.json +all: kernel_rust + $(MAKE) kernel || exit 1 @echo "Linking kernel..." ld -b elf64-x86-64 -z muldefs -o kernel head.o main.o $(shell find . -name "*.o") ../target/x86_64-unknown-none/release/libdragonos_kernel.a -T link.lds # 生成kallsyms diff --git a/kernel/src/include/bindings/mod.rs b/kernel/src/include/bindings/mod.rs new file mode 100644 index 00000000..44946577 --- /dev/null +++ b/kernel/src/include/bindings/mod.rs @@ -0,0 +1 @@ +pub mod bindings; \ No newline at end of file diff --git a/kernel/src/include/bindings/wrapper.h b/kernel/src/include/bindings/wrapper.h index 9eed82a8..db6bdbb7 100644 --- a/kernel/src/include/bindings/wrapper.h +++ b/kernel/src/include/bindings/wrapper.h @@ -21,5 +21,7 @@ #include #include #include +#include +#include #include #include \ No newline at end of file diff --git a/kernel/src/include/mod.rs b/kernel/src/include/mod.rs new file mode 100644 index 00000000..44946577 --- /dev/null +++ b/kernel/src/include/mod.rs @@ -0,0 +1 @@ +pub mod bindings; \ No newline at end of file diff --git a/kernel/src/lib.rs b/kernel/src/lib.rs index 0179d5d4..38eeac47 100644 --- a/kernel/src/lib.rs +++ b/kernel/src/lib.rs @@ -5,10 +5,16 @@ #[allow(non_camel_case_types)] #[allow(non_snake_case)] +#[macro_use] +mod mm; +mod include; + +use crate::mm::allocator; use core::ffi::c_char; use core::intrinsics; // <2> use core::panic::PanicInfo; // <3> -include!("include/bindings/bindings.rs"); +use crate::include::bindings::bindings::{printk_color, GREEN, BLACK}; + #[panic_handler] #[no_mangle] diff --git a/kernel/src/main.c b/kernel/src/main.c index 3684f248..ed01dc55 100644 --- a/kernel/src/main.c +++ b/kernel/src/main.c @@ -42,8 +42,6 @@ ul bsp_idt_size, bsp_gdt_size; -#include - #pragma GCC push_options #pragma GCC optimize("O0") struct gdtr gdtp; @@ -167,7 +165,6 @@ void system_initialize() // 启用double buffer // scm_enable_double_buffer(); // 因为时序问题, 该函数调用被移到 initial_kernel_thread io_mfence(); - __rust_demo_func(); // fat32_init(); HPET_enable(); diff --git a/kernel/src/mm/allocator.rs b/kernel/src/mm/allocator.rs new file mode 100644 index 00000000..2e351e64 --- /dev/null +++ b/kernel/src/mm/allocator.rs @@ -0,0 +1,22 @@ +use crate::include::bindings::bindings::{gfp_t, PAGE_2M_SIZE, kmalloc}; +use core::alloc::{GlobalAlloc, Layout}; + +/// 类kmalloc的分配器应当实现的trait +pub trait LocalAlloc { + unsafe fn alloc(&mut self, layout: Layout, gfp: gfp_t) -> *mut u8; + unsafe fn dealloc(&mut self, ptr: *mut u8, layout: Layout); +} + +pub struct KernelAllocator {} + +impl LocalAlloc for KernelAllocator { + unsafe fn alloc(&mut self, layout: Layout, gfp: gfp_t) -> *mut u8 { + if layout.size() > (PAGE_2M_SIZE as usize / 2) { + return core::ptr::null_mut(); + } + return kmalloc(layout.size() as u64, gfp) as *mut u8; + } + unsafe fn dealloc(&mut self, ptr: *mut u8, layout: Layout){ + // todo: + } +} diff --git a/kernel/src/mm/mod.rs b/kernel/src/mm/mod.rs new file mode 100644 index 00000000..f47c56a1 --- /dev/null +++ b/kernel/src/mm/mod.rs @@ -0,0 +1 @@ +pub mod allocator; \ No newline at end of file