精致的问题
如何从擦除块大小为零的MTD SRAM器件读取和写入文本信息?
笔记:
libmtd无法处理擦除块大小为零echo >,并cat于mtdblock只产生垃圾原创
我试图读取和写入连接到运行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驱动器,我也不认为写周期是一个问题,这就是擦除块为零的原因.所以我的问题如下:
libmtd忽略零擦除块大小?如果是这样我应该设置什么eb_cnt?补充说明:
echo test > /dev/mtdblock0和cat /dev/mtdblock0,得到了什么,但垃圾更新10/20 在驱动程序中将擦除块大小更改为1(我希望将其更改为4000,但我不确定单位).MTD Utils不再抛出之前给出的异常.
~# mtdinfo
Count …Run Code Online (Sandbox Code Playgroud) 问题
我的问题是,linuxrc做什么?我需要它在我的吗rootfs?systemd它与使用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) 我读过的关于 ELF 标头魔法的每一个资源都指出它包含 ASCII 编码的“ELF”,然后简要提到 0x7F 被添加到它前面而没有解释。
0x7F 有原因吗?
是为了避免与现有格式发生冲突吗?现有标准合规性?用于检测有关磁盘或内存的内容?
要与您一起创建持久名称空间,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
摘要
我目前正在使用一些自定义板的自定义驱动程序编译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文件
gpio-hog声明的目的和用例是什么?我正在尝试配置许多(10+)GPIO,以便与Userspace中的低级芯片通信。我已经很容易使用sysfs导出对芯片进行了交谈,但是内核和编程论坛中的文档都让我担心在生产系统中使用这种机制。
阅读更多的内核文档,我阅读了有关gpio-hog声明的信息,这似乎是至少初始配置GPIO的理想机制。从文档中:
GPIO触发是一种机制,提供自动GPIO请求和配置,作为gpio控制器的驱动程序探测功能的一部分。
除了设置正确的低位供应商设置外,我还启用了所需gpio引脚的暂存功能,他们提出了正确的设置。问题在于,gpio似乎是内核拥有的,不能通过任何Userspace工具(例如sysfs或)进行接口libgpiod。这对我来说使猪圈基本上毫无用处,也使我怀疑它的真正目的是什么。我正在libgpiod最后一种探索方式,但是文档表明,这hogging应该是我使用的机制。
假设我有以下结构
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 位)。我如何设置这个约束?
这只是一个玩具盒。很多时候,像上面这样的协议 …
我一直在阅读关于作为接口值的函数类型,我遇到了一个我无法弄清楚的例子。这里是:
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()调用。
我有一个独立的 DNS 测试台,其中所有需要互联网的工具都通过 SOCKS5 代理并使用它来解析 DNS (SOCKS5h)。git,apt并且curl没有问题;go做。即使设置http_proxy=socks5h://user1:pass1@192.168.0.1:8100 go mod tidygo 不使用代理来解析 DNS,所以我也会收到查找错误。
那么有没有办法解决这个问题呢?我愿意添加另一种代理类型,我只是真的需要保持第 3 层隔离。
go ×4
linux ×3
linux-kernel ×2
arm ×1
c ×1
device-tree ×1
devops ×1
docker ×1
elf ×1
embedded ×1
fuzzing ×1
go-get ×1
godoc ×1
gpio ×1
kubernetes ×1
namespaces ×1
yocto ×1