15
15
16
16
所以我们的用户程序基本还是要使用前两章的方法,不同的则是要把系统调用加入进去。
17
17
18
- 在 `` os/ usr`` 目录下使用 Cargo 新建一个二进制项目
18
+ 在 `` usr `` 目录下使用 Cargo 新建一个二进制项目,然后给文件夹改个名字:
19
19
20
20
``` bash
21
- $ cargo new rust --bin --edition 2018
21
+ $ cargo new user --bin
22
+ $ mv user rust
22
23
```
23
24
24
25
我们先来看系统调用:
@@ -198,7 +199,7 @@ use buddy_system_allocator::LockedHeap;
198
199
static DYNAMIC_ALLOCATOR : LockedHeap = LockedHeap :: empty ();
199
200
```
200
201
201
- 现在我们可以将每一个含有 `` main `` 函数的 rust 源代码放在 `` usr/rust/src/bin `` 目录下。它们每一个都会被编译成一个独立的可执行文件。
202
+ 现在我们可以将每一个含有 `` main `` 函数的 Rust 源代码放在 `` usr/rust/src/bin `` 目录下。它们每一个都会被编译成一个独立的可执行文件。
202
203
203
204
其模板为:
204
205
@@ -207,12 +208,11 @@ static DYNAMIC_ALLOCATOR: LockedHeap = LockedHeap::empty();
207
208
208
209
#![no_std]
209
210
#![no_main]
210
- #![feature(alloc)]
211
211
212
212
extern crate alloc;
213
213
214
214
#[macro_use]
215
- extern crate rust ;
215
+ extern crate user ;
216
216
217
217
#[no_mangle]
218
218
pub fn main () -> usize {
@@ -229,12 +229,11 @@ pub fn main() -> usize {
229
229
230
230
#![no_std]
231
231
#![no_main]
232
- #![feature(alloc)]
233
232
234
233
extern crate alloc;
235
234
236
235
#[macro_use]
237
- extern crate rust ;
236
+ extern crate user ;
238
237
239
238
#[no_mangle]
240
239
pub fn main () -> usize {
@@ -245,48 +244,19 @@ pub fn main() -> usize {
245
244
}
246
245
```
247
246
248
- 为了能够编译,我们还需要一个目标三元组,只不过这里,我们不需要再通过链接脚本手动执行内存布局了!
249
-
250
- ``` json
251
- // usr/rust/riscv64-rust.json
252
-
253
- {
254
- "llvm-target" : " riscv64" ,
255
- "data-layout" : " e-m:e-p:64:64-i64:64-n64-S128" ,
256
- "target-endian" : " little" ,
257
- "target-pointer-width" : " 64" ,
258
- "target-c-int-width" : " 32" ,
259
- "os" : " none" ,
260
- "arch" : " riscv64" ,
261
- "cpu" : " generic-rv64" ,
262
- "features" : " +m,+a" ,
263
- "max-atomic-width" : " 64" ,
264
- "linker" : " rust-lld" ,
265
- "linker-flavor" : " ld.lld" ,
266
- "executables" : true ,
267
- "panic-strategy" : " abort" ,
268
- "relocation-model" : " static" ,
269
- "abi-blacklist" : [
270
- " cdecl" ,
271
- " stdcall" ,
272
- " fastcall" ,
273
- " vectorcall" ,
274
- " thiscall" ,
275
- " aapcs" ,
276
- " win64" ,
277
- " sysv64" ,
278
- " ptx-kernel" ,
279
- " msp430-interrupt" ,
280
- " x86-interrupt"
281
- ],
282
- "eliminate-frame-pointer" : false
283
- }
247
+ 和内核项目一样,这里也创建一个 ` .cargo/config ` 文件指定默认的目标三元组。但这次我们就不用自定义链接脚本了,用默认的即可。
248
+
249
+ ``` toml
250
+ # .cargo/config
251
+
252
+ [build ]
253
+ target = " riscv64imac-unknown-none-elf"
284
254
```
285
255
286
256
切换到 `` usr/rust `` 目录,就可以进行交叉编译:
287
257
288
258
``` bash
289
- $ cargo xbuild --target riscv64-rust.json
259
+ $ cargo build
290
260
```
291
261
292
- 我们将能够在 `` usr/rust/target/riscv64-rust /debug/hello_world `` 看到我们编译出来的可执行文件,接下来的问题就是如何把它加载到内核中执行了!
262
+ 我们将能够在 `` usr/rust/target/riscv64imac-unknown-none-elf /debug/hello_world `` 看到我们编译出来的可执行文件,接下来的问题就是如何把它加载到内核中执行了!
0 commit comments