小编Lia*_*lly的帖子

块的MTD擦除块大小为零

精致的问题

如何从擦除块大小为零的MTD SRAM器件读取和写入文本信息?

笔记:

  1. 我正在使用23K256驱动程序
  2. 尝试使用MTD-Util工具失败,因为libmtd无法处理擦除块大小为零
  3. 尝试人为添加擦除块大小也失败了(见下文)
  4. 尝试使用echo >,并catmtdblock只产生垃圾

原创 我试图读取和写入连接到运行Linux的ARM处理器的SRAM芯片.我不在乎我是否像文件,串行设备或内存分区一样与SRAM接口.SRAM芯片的现有设备驱动程序将设备注册为MTD.我通过检查验证了这一点/proc/mtd:

~# cat /proc/mtd
dev:    size   erasesize  name
mtd0: 00020000 00000000 "spi1.0"
Run Code Online (Sandbox Code Playgroud)

我找到了一个使用MTD工具格式化MTD的教程.我遇到的问题是我无法与SRAM/MTD设备接口,因为所有用户空间MTD/UBI/JFF2工具在查看此设备时崩溃,IE:

~# mtdinfo
Count of MTD devices:           1
Floating point exception (core dumped)
Run Code Online (Sandbox Code Playgroud)

此异常似乎正在发生,因为所有MTD实用程序都使用libmtd.mtd_get_dev_info1libmtd中的函数除以擦除块大小,在我的例子中,擦除块大小为零.

mtd->eb_cnt = mtd->size / mtd->eb_size;
Run Code Online (Sandbox Code Playgroud)

即使该芯片具有MTD驱动器,我也不认为写周期是一个问题,这就是擦除块为零的原因.所以我的问题如下:

  1. 我应该修改驱动程序以给芯片一个擦除块大小,以便实用程序正常工作吗?如果是这样大小?
  2. 我应该修改libmtd忽略零擦除块大小?如果是这样我应该设置什么eb_cnt
  3. 有没有更好的方法来读取和写入MTD设备的数据?

补充说明:

  1. 在我的情况下,稳定性比最佳性能更重要
  2. 我试图做一个echo test > /dev/mtdblock0cat /dev/mtdblock0,得到了什么,但垃圾

更新10/20 在驱动程序中将擦除块大小更改为1(我希望将其更改为4000,但我不确定单位).MTD Utils不再抛出之前给出的异常.

~# mtdinfo
Count …
Run Code Online (Sandbox Code Playgroud)

embedded linux-device-driver embedded-linux

9
推荐指数
1
解决办法
514
查看次数

linuxrc 的用途是什么以及 rootfs 中是否需要它?

问题

我的问题是,linuxrc做什么?我需要它在我的吗rootfssystemd它与使用vs有什么关系吗initd

背景

rootfs我目前正在尝试使用 Yocto 为 ARM 7 处理器构建一个。我对原始 BSP 项目所做的唯一修改是我指定要用作systemd我的初始化管理器(在 参考资料中完成local.conf)。构建rootfs( bitbake core-image-minimal) 并使用Mgftool2我将其加载到板上。当我尝试启动映像时,出现以下错误:

VFS: Mounted root (ext3 filesystem) readonly on device 179:2.
devtmpfs: mounted
Freeing unused kernel memory: 272K (80816000 - 8085a000)
Kernel panic - not syncing: Requested init /linuxrc failed (error -2).
CPU: 0 PID: 1 Comm: swapper/0 Tainted: G        W       4.4.15-v4.4.15+g017b90c #1
Hardware name: Freescale i.MX6 Ultralite (Device …
Run Code Online (Sandbox Code Playgroud)

embedded-linux yocto

8
推荐指数
1
解决办法
9032
查看次数

ELF Header Magic - 为什么要放入 0x7F?

我读过的关于 ELF 标头魔法的每一个资源都指出它包含 ASCII 编码的“ELF”,然后简要提到 0x7F 被添加到它前面而没有解释。

0x7F 有原因吗?

是为了避免与现有格式发生冲突吗?现有标准合规性?用于检测有关磁盘或内存的内容?

linux elf linux-kernel

8
推荐指数
1
解决办法
421
查看次数

`ip netns` 和 `unshare` 如何保存它们的持久网络命名空间?他们可以互相利用吗?

要与您一起创建持久名称空间,unshare请使用以下语法:

touch /root/mynetns1
unshare --net==/root/mynetns1
Run Code Online (Sandbox Code Playgroud)

要与您一起创建持久名称空间,ip请使用以下语法:

ip netns add mynetns2
Run Code Online (Sandbox Code Playgroud)

ip命令不会列出或可以访问由 所创建的命名空间unshare,反之亦然。

ip命令更擅长自定义网络命名空间,但该unshare命令允许您启动具有多个不同命名空间的程序。理想情况下,我会使用 来创建一个命名空间ip,但使用其他命名空间来启动该命令unshare。为此,unshare需要能够引用由 创建的命名空间ip,如何做到这一点?

现在我正在使用ip netns exec mynetns1 unshare [other namespaces] ...作为黑客,但我更喜欢使用unshare.

我还希望能够让我的程序与他们单独创建的网络命名空间进行交互,因此有关如何列出和访问其网络命名空间的信息也会很有帮助。

network-programming namespaces docker kubernetes linux-namespaces

8
推荐指数
1
解决办法
2385
查看次数

如何修改内核DTB文件

摘要

我目前正在使用一些自定义板的自定义驱动程序编译Linux内核(内核,模块和DTB).有时我会编译内核并意识到DTB文件中的兼容性字符串不是自定义驱动程序要查找的内容.现在,我可以解决这个问题的唯一方法是修改DTS或内核驱动程序,使字符串匹配,然后再次重新编译内核.有没有办法我可以编辑DTB文件来更新兼容性字符串?

尝试失败

我已经能够使用以下命令将DTB文件反编译回DTS文件:

dtc -I dtb -o <filename>.dts -<filename>.dtb
Run Code Online (Sandbox Code Playgroud)

但是,如果我修改DTS文件并使用以下命令重新编译:

dtc -I dts -o <filename>.dtb -<filename>.dts
Run Code Online (Sandbox Code Playgroud)

内核不会加载重新编译的DTB文件

c linux arm linux-kernel embedded-linux

7
推荐指数
2
解决办法
9863
查看次数

GPIO-Hog声明的用途和用法

问题

  1. gpio-hog声明的目的和用例是什么?
  2. 可以从Userspace与“钩住的” gpio引脚进行接口吗?
  3. 如果无法通过Userspace与“钩住的” gpio引脚进行接口连接,那么是否有任何机制可以在dts文件中配置GPIO引脚以进行Userspace交互?

背景

我正在尝试配置许多(10+)GPIO,以便与Userspace中的低级芯片通信。我已经很容易使用sysfs导出对芯片进行了交谈,但是内核和编程论坛中的文档都让我担心在生产系统中使用这种机制。

阅读更多的内核文档,我阅读了有关gpio-hog声明的信息,这似乎是至少初始配置GPIO的理想机制。从文档中:

GPIO触发是一种机制,提供自动GPIO请求和配置,作为gpio控制器的驱动程序探测功能的一部分。

除了设置正确的低位供应商设置外,我还启用了所需gpio引脚的暂存功能,他们提出了正确的设置。问题在于,gpio似乎是内核拥有的,不能通过任何Userspace工具(例如sysfs或)进行接口libgpiod。这对我来说使猪圈基本上毫无用处,也使我怀疑它的真正目的是什么。我正在libgpiod最后一种探索方式,但是文档表明,这hogging应该是我使用的机制。

linux linux-device-driver gpio device-tree

7
推荐指数
1
解决办法
1382
查看次数

如何对模糊测试的输入设置约束?

假设我有以下结构

type Hdr struct{
  Src      uint16
  Dst      uint16
  Priotity byte
  Pktcnt   byte
  Opcode   byte
  Ver      byte
}
Run Code Online (Sandbox Code Playgroud)

我有两个函数Marshal,可以对以下二进制格式Unmarshal进行编码:Hdr

 0                   1          
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|              Src              |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|              Dst              |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|  Prio |  Cnt  | Opcode|  Ver  |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Run Code Online (Sandbox Code Playgroud)

我想使用 Go Fuzz 来生成随机、有效的Hdr实例,Marshal然后转换为二进制,Unmarshal并确保输出与原始输入匹配。

我遇到的主要问题是我不知道如何告诉 Go Fuzz 这样的字段Priotity不能大于 15,否则它们在编组时会被截断(只有 4 位)。我如何设置这个约束?

更新

这只是一个玩具盒。很多时候,像上面这样的协议 …

go fuzzing

6
推荐指数
1
解决办法
702
查看次数

Go 函数类型作为接口值

我一直在阅读关于作为接口值的函数类型,我遇到了一个我无法弄清楚的例子。这里是:

type binFunc func(int, int) int

func add(x, y int) int { return x + y }

func (f binFunc) Error() string { return "binFunc error" }

func main() {
    var err error
    err = binFunc(add)
    fmt.Println(err)
}
Run Code Online (Sandbox Code Playgroud)

你可以找到它去游乐场这里

我知道您可以为函数类型分配一个方法,但我不明白如何Error()调用。

go

4
推荐指数
1
解决办法
4409
查看次数

通过socks5h代理获取

我有一个独立的 DNS 测试台,其中所有需要互联网的工具都通过 SOCKS5 代理并使用它来解析 DNS (SOCKS5h)。gitapt并且curl没有问题;go做。即使设置http_proxy=socks5h://user1:pass1@192.168.0.1:8100 go mod tidygo 不使用代理来解析 DNS,所以我也会收到查找错误。

那么有没有办法解决这个问题呢?我愿意添加另一种代理类型,我只是真的需要保持第 3 层隔离。

go devops

3
推荐指数
1
解决办法
2213
查看次数

如何在本地运行 pkg.go.dev 作为 godoc 替代品?

godoc自 1.12 以来已从 go 标准安装中删除,并且看起来不会很快更新。pkg.go.dev至少看起来是它的继任者。它还具有其他文档功能,例如抓取README.md文件并将其呈现在文档页面中。

由于这些原因,我希望切换到pkg.go.dev在本地使用来查看和创建小型内部包的文档。主要问题是,godoc似乎没有明确的使用指南。我也不知道pkpg.go.dev这项任务是否完全矫枉过正。所以我想知道:

  1. 可以并且应该pkg.go.dev用作本地godoc替代品吗?
  2. 如果是,我将如何运行它来执行此任务?

go godoc go-get

3
推荐指数
1
解决办法
1707
查看次数