5 个版本
0.2.0 | 2019年12月13日 |
---|---|
0.1.3 | 2019年9月22日 |
0.1.2 | 2018年12月12日 |
0.1.1 | 2018年12月11日 |
0.1.0 | 2018年12月11日 |
#324 in 编程语言
46KB
1K SLoC
DTB
设备树blob工具
这个 no_std
包包含用于读取和写入DTB的类型。以下是如何读取DTB文件的示例代码:
let mut buf = Vec::new();
let mut file = File::open("example.dtb").unwrap();
file.read_to_end(&mut buf).unwrap();
let reader = Reader::read(buf.as_slice()).unwrap();
for entry in reader.reserved_mem_entries() {
println!("reserved: {:?}, {:?}", entry.address, entry.size);
}
let root = reader.struct_items();
let (prop, _) =
root.path_struct_items("/node/property").next().unwrap();
println!("property: {:?}, {:?}", prop.name(), prop.value_str());
let (node, node_iter) =
root.path_struct_items("/node/node2").next().unwrap();
println!("node: {:?}@{:?}", node.node_name(), node.unit_address());
let mut buf = [0; 32];
let (prop, _) = node_iter.path_struct_items("property").next().unwrap();
println!(
"property: {:?}, {:?}",
prop.name(),
prop.value_str_list(&mut buf)
);
let (prop, _) =
node_iter.path_struct_items("property2").next().unwrap();
println!(
"property: {:?}, {:?}",
prop.name(),
prop.value_u32_list(&mut buf)
);
要从内存地址直接读取DTB,请使用 Reader::read_from_address()
。
要运行测试样本,请执行
cargo run --example dump src/test_dtb/sample.dtb
模糊测试说明
可以使用 cargo-fuzz
/libfuzzer
对读取器(以及读取项的方法)进行模糊测试,该工具可以作为 cargo install cargo-fuzz
安装。请注意,覆盖率尚未完成,但提供了一个简单的 harness。基本语料库位于 src/test_dtb
目录中。请注意,此命令将需要一个nightly编译器。
cargo fuzz run reader src/test_dtb