Skip to content

Commit 5c8a40d

Browse files
committed
feat: 使用 linker 模式提高定制链接脚本安全性
Signed-off-by: YdrMaster <[email protected]>
1 parent dac40f7 commit 5c8a40d

23 files changed

+183
-237
lines changed

Cargo.lock

+13-4
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

+1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ members = [
99
"ch5",
1010
"ch6",
1111
"user",
12+
"linker",
1213
"console",
1314
"syscall",
1415
"kernel-context",

ch1-lab/README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
console = { path = "../console"}
99
```
1010

11-
[main.rs](src/main.rs#L52) 里初始化:
11+
[main.rs](src/main.rs#L49) 里初始化:
1212

1313
```rust
1414
init_console(&Console);

ch2/Cargo.toml

+4
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,11 @@ authors = ["YdrMaster <[email protected]>"]
88
sbi-rt = { git = "https://github.com/rustsbi/sbi-rt", branch = "dev" }
99
riscv = "0.8.0"
1010

11+
linker = { path = "../linker" }
1112
console = { path = "../console" }
1213
utils = { path = "../utils" }
1314
kernel-context = { path = "../kernel-context" }
1415
syscall = { path = "../syscall", features = ["kernel"] }
16+
17+
[build-dependencies]
18+
linker = { path = "../linker" }

ch2/build.rs

+1-27
Original file line numberDiff line numberDiff line change
@@ -2,36 +2,10 @@ fn main() {
22
use std::{env, fs, path::PathBuf};
33

44
let ld = &PathBuf::from(env::var_os("OUT_DIR").unwrap()).join("linker.ld");
5-
fs::write(ld, LINKER).unwrap();
5+
fs::write(ld, linker::SCRIPT).unwrap();
66

77
println!("cargo:rerun-if-changed=build.rs");
88
println!("cargo:rerun-if-env-changed=LOG");
99
println!("cargo:rerun-if-env-changed=APP_ASM");
1010
println!("cargo:rustc-link-arg=-T{}", ld.display());
1111
}
12-
13-
const LINKER: &[u8] = b"
14-
OUTPUT_ARCH(riscv)
15-
ENTRY(_start)
16-
SECTIONS {
17-
. = 0x80200000;
18-
.text : {
19-
*(.text.entry)
20-
*(.text .text.*)
21-
}
22-
.rodata : {
23-
*(.rodata .rodata.*)
24-
*(.srodata .srodata.*)
25-
}
26-
.data : {
27-
*(.data .data.*)
28-
*(.sdata .sdata.*)
29-
}
30-
.bss : {
31-
*(.bss.uninit)
32-
sbss = ALIGN(8);
33-
*(.bss .bss.*)
34-
*(.sbss .sbss.*)
35-
ebss = ALIGN(8);
36-
}
37-
}";

ch2/src/main.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ unsafe extern "C" fn _start() -> ! {
4040

4141
extern "C" fn rust_main() -> ! {
4242
// bss 段清零
43-
utils::zero_bss();
43+
unsafe { linker::KernelLayout::locate().zero_bss() };
4444
// 初始化 `console`
4545
console::init_console(&Console);
4646
console::set_log_level(option_env!("LOG"));

ch3/Cargo.toml

+4
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,14 @@ authors = ["YdrMaster <[email protected]>"]
88
sbi-rt = { git = "https://github.com/rustsbi/sbi-rt", branch = "dev" }
99
riscv = "0.8.0"
1010

11+
linker = { path = "../linker" }
1112
console = { path = "../console" }
1213
utils = { path = "../utils" }
1314
kernel-context = { path = "../kernel-context" }
1415
syscall = { path = "../syscall", features = ["kernel"] }
1516

17+
[build-dependencies]
18+
linker = { path = "../linker" }
19+
1620
[features]
1721
coop = []

ch3/build.rs

+1-27
Original file line numberDiff line numberDiff line change
@@ -2,36 +2,10 @@ fn main() {
22
use std::{env, fs, path::PathBuf};
33

44
let ld = &PathBuf::from(env::var_os("OUT_DIR").unwrap()).join("linker.ld");
5-
fs::write(ld, LINKER).unwrap();
5+
fs::write(ld, linker::SCRIPT).unwrap();
66

77
println!("cargo:rerun-if-changed=build.rs");
88
println!("cargo:rerun-if-env-changed=LOG");
99
println!("cargo:rerun-if-env-changed=APP_ASM");
1010
println!("cargo:rustc-link-arg=-T{}", ld.display());
1111
}
12-
13-
const LINKER: &[u8] = b"
14-
OUTPUT_ARCH(riscv)
15-
ENTRY(_start)
16-
SECTIONS {
17-
. = 0x80200000;
18-
.text : {
19-
*(.text.entry)
20-
*(.text .text.*)
21-
}
22-
.rodata : {
23-
*(.rodata .rodata.*)
24-
*(.srodata .srodata.*)
25-
}
26-
.data : {
27-
*(.data .data.*)
28-
*(.sdata .sdata.*)
29-
}
30-
.bss : {
31-
*(.bss.uninit)
32-
sbss = ALIGN(8);
33-
*(.bss .bss.*)
34-
*(.sbss .sbss.*)
35-
ebss = ALIGN(8);
36-
}
37-
}";

ch3/src/main.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ unsafe extern "C" fn _start() -> ! {
4444

4545
extern "C" fn rust_main() -> ! {
4646
// bss 段清零
47-
utils::zero_bss();
47+
unsafe { linker::KernelLayout::locate().zero_bss() };
4848
// 初始化 `console`
4949
console::init_console(&Console);
5050
console::set_log_level(option_env!("LOG"));

ch4/Cargo.toml

+4
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,12 @@ customizable-buddy = "0.0.2"
1010
xmas-elf = "0.8.0"
1111
riscv = "0.8.0"
1212

13+
linker = { path = "../linker" }
1314
console = { path = "../console" }
1415
utils = { path = "../utils" }
1516
kernel-context = { path = "../kernel-context" }
1617
kernel-vm = { path = "../kernel-vm" }
1718
syscall = { path = "../syscall", features = ["kernel"] }
19+
20+
[build-dependencies]
21+
linker = { path = "../linker" }

ch4/build.rs

+1-31
Original file line numberDiff line numberDiff line change
@@ -2,40 +2,10 @@ fn main() {
22
use std::{env, fs, path::PathBuf};
33

44
let ld = &PathBuf::from(env::var_os("OUT_DIR").unwrap()).join("linker.ld");
5-
fs::write(ld, LINKER).unwrap();
5+
fs::write(ld, linker::SCRIPT).unwrap();
66

77
println!("cargo:rerun-if-changed=build.rs");
88
println!("cargo:rerun-if-env-changed=LOG");
99
println!("cargo:rerun-if-env-changed=APP_ASM");
1010
println!("cargo:rustc-link-arg=-T{}", ld.display());
1111
}
12-
13-
const LINKER: &[u8] = b"
14-
OUTPUT_ARCH(riscv)
15-
ENTRY(_start)
16-
SECTIONS {
17-
. = 0x80200000;
18-
.text : {
19-
__text = .;
20-
*(.text.entry)
21-
*(.text .text.*)
22-
}
23-
.rodata : ALIGN(4K) {
24-
__rodata = .;
25-
*(.rodata .rodata.*)
26-
*(.srodata .srodata.*)
27-
}
28-
.data : ALIGN(4K) {
29-
__data = .;
30-
*(.data .data.*)
31-
*(.sdata .sdata.*)
32-
}
33-
.bss : {
34-
*(.bss.uninit)
35-
sbss = ALIGN(8);
36-
*(.bss .bss.*)
37-
*(.sbss .sbss.*)
38-
ebss = .;
39-
}
40-
__end = .;
41-
}";

ch4/src/main.rs

+18-25
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,9 @@ unsafe extern "C" fn _start() -> ! {
5858
static mut PROCESSES: Vec<Process> = Vec::new();
5959

6060
extern "C" fn rust_main() -> ! {
61+
let layout = linker::KernelLayout::locate();
6162
// bss 段清零
62-
utils::zero_bss();
63+
unsafe { layout.zero_bss() };
6364
// 初始化 `console`
6465
console::init_console(&Console);
6566
console::set_log_level(option_env!("LOG"));
@@ -73,7 +74,7 @@ extern "C" fn rust_main() -> ! {
7374
mm::init();
7475
mm::test();
7576
// 建立内核地址空间
76-
let mut ks = kernel_space();
77+
let mut ks = kernel_space(layout);
7778
// 加载应用程序
7879
extern "C" {
7980
static apps: utils::AppMeta;
@@ -140,43 +141,35 @@ fn panic(info: &core::panic::PanicInfo) -> ! {
140141
unreachable!()
141142
}
142143

143-
fn kernel_space() -> AddressSpace<Sv39, Sv39Manager> {
144+
fn kernel_space(layout: linker::KernelLayout) -> AddressSpace<Sv39, Sv39Manager> {
144145
// 打印段位置
145-
extern "C" {
146-
fn __text();
147-
fn __rodata();
148-
fn __data();
149-
fn __end();
150-
}
151-
let _text = VAddr::<Sv39>::new(__text as _);
152-
let _rodata = VAddr::<Sv39>::new(__rodata as _);
153-
let _data = VAddr::<Sv39>::new(__data as _);
154-
let _end = VAddr::<Sv39>::new(__end as _);
155-
log::info!("__text ----> {:#10x}", _text.val());
156-
log::info!("__rodata --> {:#10x}", _rodata.val());
157-
log::info!("__data ----> {:#10x}", _data.val());
158-
log::info!("__end -----> {:#10x}", _end.val());
146+
let text = VAddr::<Sv39>::new(layout.text);
147+
let rodata = VAddr::<Sv39>::new(layout.rodata);
148+
let data = VAddr::<Sv39>::new(layout.data);
149+
let end = VAddr::<Sv39>::new(layout.end);
150+
log::info!("__text ----> {:#10x}", text.val());
151+
log::info!("__rodata --> {:#10x}", rodata.val());
152+
log::info!("__data ----> {:#10x}", data.val());
153+
log::info!("__end -----> {:#10x}", end.val());
159154
println!();
160155

161156
// 内核地址空间
162157
let mut space = AddressSpace::<Sv39, Sv39Manager>::new();
163158
space.map_extern(
164-
_text.floor().._rodata.ceil(),
165-
PPN::new(_text.floor().val()),
159+
text.floor()..rodata.ceil(),
160+
PPN::new(text.floor().val()),
166161
VmFlags::build_from_str("X_RV"),
167162
);
168163
space.map_extern(
169-
_rodata.floor().._data.ceil(),
170-
PPN::new(_rodata.floor().val()),
164+
rodata.floor()..data.ceil(),
165+
PPN::new(rodata.floor().val()),
171166
VmFlags::build_from_str("__RV"),
172167
);
173168
space.map_extern(
174-
_data.floor().._end.ceil(),
175-
PPN::new(_data.floor().val()),
169+
data.floor()..end.ceil(),
170+
PPN::new(data.floor().val()),
176171
VmFlags::build_from_str("_WRV"),
177172
);
178-
log::debug!("{space:?}");
179-
println!();
180173
unsafe { satp::set(satp::Mode::Sv39, 0, space.root_ppn().val()) };
181174
space
182175
}

ch5/Cargo.toml

+4
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,13 @@ xmas-elf = "0.8.0"
1111
riscv = "0.8.0"
1212
spin = "0.9.4"
1313

14+
linker = { path = "../linker" }
1415
console = { path = "../console" }
1516
utils = { path = "../utils" }
1617
kernel-context = { path = "../kernel-context" }
1718
kernel-vm = { path = "../kernel-vm" }
1819
syscall = { path = "../syscall", features = ["kernel"] }
1920
task-manage = { path = "../task-manage" }
21+
22+
[build-dependencies]
23+
linker = { path = "../linker" }

0 commit comments

Comments
 (0)