UPGRADE YOUR BROWSER

We have detected your current browser version is not the latest one. Xilinx.com uses the latest web technologies to bring you the best online experience possible. Please upgrade to a Xilinx.com supported browser:Chrome, Firefox, Internet Explorer 11, Safari. Thank you!

取消
显示结果 
搜索替代 
您的意思是: 
Contributor
Contributor
548 次查看
注册日期: ‎09-19-2018

Petalinux 2018.3 使用UIO时的Segmentation Fault

发布Petalinux 2018.3之后,马上进行了升级,盼望能修复2018.2 中 AXI_TIMER 造成的 PMU 以及 FSBL 无法编译的情况。

然而没想到Petalinux 2018.3出现了另一个奇怪的问题:无法通过Flash Memory(USB,SATA,以及SD卡)里的“.elf”程序map多个UIO接口。

我的这个测试程序非常的简单,开启四个UIO (uio1, uio2... uio4)逐一用 sizeFD=fopen() 和 mmap 进行map,map完成后,在一个while loop中对这个四个 UIO不断的进行读/写。

在2018.3中,uio3以及uio4 都会在sizeFD=fopen()语句返回负的 sizeFD,导致segmentation fault。奇怪的是,2018.2中完全没有这个情况,而且如果我通过XSDK将程序传送到Linux (2018.3),这个问题也不存在。

有没有人碰到了类似的情况?目前完全找不到出现这个bug的原因。。。

0 项奖励
5 条回复5
Xilinx Employee
Xilinx Employee
471 次查看
注册日期: ‎09-14-2018

回复: Petalinux 2018.3 使用UIO时的Segmentation Fault

hi,

这4个UIO都是啥外设或内存范围呢?

0 项奖励
Contributor
Contributor
310 次查看
注册日期: ‎09-19-2018

回复: Petalinux 2018.3 使用UIO时的Segmentation Fault

非常感谢您的回复!

每个UIO的大小都不一样,都集中在 zcu104 2G内存的末尾,device tree (project-spec/meta-user/recipes-bsp/device-tree/files/system-user)内容如下:

/include/ "system-conf.dtsi"

/include/ "xen-overlay.dtsi"

/ {

        memory {

                device_type = "memory";

                reg = <0x0 0x0 0x0 0x7fee3000>;

        };

        mem1 {

                #stream-id-cells = <0x1>;

                compatible = "uio-dev";

                reg = <0x0 0x7fee3000 0x0 0x8000>;

        };

        mem2 {

                #stream-id-cells = <0x1>;

                compatible = "uio-dev";

                reg = <0x0 0x7feeb000 0x0 0xa000>;

 

        };

        mem3 {

                #stream-id-cells = <0x1>;

                compatible = "uio-dev";

                reg = <0x0 0x7fef5000 0x0 0x8000>;

        };

        mem4{

                #stream-id-cells = <0x1>;

                compatible = "uio-dev";

                reg = <0x0 0x7fefd000 0x0 0x3000>;

        };

};

这个 memory 的分法是从 Xen+Shared+Memory 里学到的。这里想重新强调一下这四个 UIO 在2018.2里可以同时运行,在2018.3里也可以把程序通过SDK上载到zcu104避免出现崩溃。

直接问题原因是 uio3, uio4 的 sizeFD <0,导致程序在读写的时候崩溃。我在Linux文件系统检查了uio3和uio4,看起来很正常。device-tree里的东西都准确的反应出来的了。

希望这些补充能够更好的帮助您理解问题全貌。

0 项奖励
Contributor
Contributor
424 次查看
注册日期: ‎09-19-2018

回复: Petalinux 2018.3 使用UIO时的Segmentation Fault

非常感谢您的回复!

每个 UIO 的大小都不一样,都集中在zcu104 2G内存的末尾,device-tree (project-spec/meta-user/recipe-bsp/device-tree/files/system-user),摘录如下:

/include/ "system-conf.dtsi"
/include/ "xen-overlay.dtsi"
/ {
        memory {
                device_type = "memory";
                reg = <0x0 0x0 0x0 0x7fee3000>;
        };
        mem1 {
                #stream-id-cells = <0x1>;
                compatible = "uio-dev";
                reg = <0x0 0x7fee3000 0x0 0x8000>;
        };
        mem2 {
                #stream-id-cells = <0x1>;
                compatible = "uio-dev";
                reg = <0x0 0x7feeb000 0x0 0xa000>;

        };
        mem3 {
                #stream-id-cells = <0x1>;
                compatible = "uio-dev";
                reg = <0x0 0x7fef5000 0x0 0x8000>;
        };
        mem4{
                #stream-id-cells = <0x1>;
                compatible = "uio-dev";
                reg = <0x0 0x7fefd000 0x0 0x3000>;
        };
};

这个 memory 的分法是从 Xen+Shared+Memory 里学到的,uio3 和 uio4 会出现 sizeFD < 0 的问题,而且此问题只在2018.3中通过flash memory 运行程序会出现。

希望这些补充能帮助您理解问题全貌。

0 项奖励
Xilinx Employee
Xilinx Employee
380 次查看
注册日期: ‎09-14-2018

回复: Petalinux 2018.3 使用UIO时的Segmentation Fault

hi @softwd

我理解你这么做是为了直接在用户态下面访问物理地址是吗?

有没有可能是这段内存已经被系统或其他软件使用而导致冲突?(我也不是很清楚会不会这样,Linux自身应该就是排在内存的高地址部分);

1. 如果你直接再linux命令行下用devmem指令来访问这段内存看看是否会出错?

2. 在devicetree里定义这段内存空间为reserved memory,试试是否有用?

仅供参考~

----------------------------------------------------------------------------------------------
如果提供的信息能解决您的问题,请标记为“接受为解决方案”。
如果您认为帖子有帮助,请点击“奖励”。谢谢!
----------------------------------------------------------------------------------------------

0 项奖励
Contributor
Contributor
326 次查看
注册日期: ‎09-19-2018

回复: Petalinux 2018.3 使用UIO时的Segmentation Fault

 

感谢您的回复。

这几天比较繁忙,今天才有机会尝试。

1. 用devmem 0x7fefd000 w尝试了一下读取,并且用devmem 0xfefd000 b 0xff 写入(四个地址都尝试了),并没有发现任何问题,能够成功的进行读取以及写入

2. 使用如下的Syntax将Memry编程reserved-memory (从WIKI上学习到的Syntax), 依然存在前面两个UIO没问题,后面两个UIO出现sizeFD<0的问题。是否是是因为我的device-tree syntax有问题?

 

/include/ "system-conf.dtsi"
/include/ "xen-overlay.dtsi"
/ {
	memory {
		device_type = "memory";
		reg = <0x0 0x0 0x0 0x7fee3000>;
	};

	reserved-memory {
		#address-cells= <2>;
		#size-cells=<2>;
		ranges;

		mem1:buffer@0{
			//#stream-id-cells = <0x1>;
			///compatible = "uio-dev";
			no-map;
			reg = <0x0 0x7fee3000 0x0 0x8000>;
		};
		mem2:buffer@1{
			//#stream-id-cells = <0x1>;
			//compatible = "uio-dev";
			no-map;
			reg = <0x0 0x7feeb000 0x0 0xa000>;

		};
		mem3:buffer@2{
			//#stream-id-cells = <0x1>;
			//compatible = "uio-dev";
			no-map;
			reg = < 0x0 0x7fef5000 0x0 0x8000>;
		};
		mem4:buffer@3{
			//#stream-id-cells = <0x1>;
			no-map;
			reg = <0x0 0x7fefd000 0x0 0x3000>;
		};
	};

	reserved-driver1@0 {
		compatible = "uio-dev";
		memory-region = <&mem1>;
	};
	reserved-driver2@1 {
		compatible = "uio-dev";
		memory-region = <&mem2>;
	};
	reserved-driver3@2 {
		compatible = "uio-dev";
		memory-region = <&mem3>;
	};
	reserved-driver4@3 {
		compatible = "uio-dev";
		memory-region = <&mem4>;
	};

};

感谢您的答复。

0 项奖励