Linux环境调试.net Core调用PCI设备

一、虚拟机CentOS

最近有一款PCI密码设备,在Windows 10上测试OK。准备测试Linux系统,于是在Windows 10安装虚拟机CentOS 7,安装驱动等准备测试程序。出现以下问题:

1、拷贝文件(到lib64目录下)的时候出现权限不够

打开一个终端,然后运行命令 sudo nautilus 

就可以打开一个具有管理员权限的文件管理器,然后就可以在不切换到管理员的条件下拷贝文件。

2、登录Root账户

su root    然后 输入密码

切换回普通用户:su - 用户名

3、.NET Core平台下调用C++动态库的问题

DLL本身是C++编写的,通过DllImport / PINVOKE的方式封装为C#可以调用的类:

[DllImport("Fwlib64.dll", EntryPoint="cnc_actf")]
public static extern short cnc_actf(ushort FlibHndl, [Out,MarshalAs(UnmanagedType.LPStruct)] ODBACT a);

现在,在windows 操作系统中,以上的过程可以正常调用;但是在Linux环境下调用的时候,提示无法加载Fwlib64.dll,缺少dll或它的依赖项:
Unable to load shared library '/home/pi/workspace/publish2/Fwlib64.dll' or one of its dependencies. In order to help diagnose loading problems, consider setting the LD_DEBUG environment variable: /home/pi/workspace/publish2/Fwlib64.dll: invalid ELF header
我尝试把可能依赖的dll都放到运行目录下,仍然无法正常调用。

在 linux 上需要引用 Fwlib64.so

[DllImport("Fwlib64.so", EntryPoint="cnc_actf")]

How To Bind C++ Code with Dotnet Core

如何在Windows和Linux上进行跨平台P/Invoke

4、虚拟机中的linux系统能否识别主机中的PCI插槽设备?

 一般情况下虚拟机中的操作系统只能识别一些通用设备,如copy果要想在虚拟操作系统中直接使用主机的PCI设备bai需要使用一些虚拟机的高级功能-直接硬件访问,在这一功du能支持下,可以将某些设备单独分配给特定的虚拟机独占使用,但这对zhi主机的主板、CPU、虚拟机管理软件和相关dao硬件设备都有一定要求。

虚拟机的LINUX对应的硬件平台是虚拟出来的硬件,PCI插槽设备是物理机硬件,是实实在在的硬件,在虚拟机下是不能识别物理机的硬件的,所有的虚拟机下的系统识别的都只是虚拟机软件虚拟出来的硬件.

所以需要用一台机器安装linux来使用此PCI设备。

 

二、Window 10系统改装为CentOS 7系统

1、准备资料

1.1  准备一个U盘(大于8G)

1.2  下载U盘启动盘制作工具  UltraISO

https://cn.ultraiso.net/xiazai.html

1.3  下载IOS镜像文件  

2、制作一个启动盘

打开UltraISO,文件->打开->系统iso镜像文件

启动->写入硬盘映像 ,然后单击 便携启动,下图

 

硬盘驱动器 选择的是U盘,然后 单击写入。

 

 

至此,启动盘就制作好了

3、将window改装为linux系统

3.1  将刚制作好好的U盘启动盘插入要改装的电脑

3.2  启动系统,启动时按F12, 进入BIOS界面,选择第三项USB,按Enter键

 

1、查看你的硬盘信息

先移动到第二项Install,然后按提示 按tab键(也有可能是e字母)【不要按Enter键】编辑路径。

将vmlinuz initrd=initrd.img inst.stage2=hd:LABEL=CentOS\x207\x20x86_64 quiet 改成 vmlinuz initrd=initrd.img linux dd quiet  按回车或者ctrl+x

然后在显示出的列表中查看你的硬盘信息,很清晰的可以知道哪一个是你的U盘路径(一般显示的几个,格式为NTFS的都是你的电脑自身的盘符,另外一个就是你的U盘,记下你的U盘的盘符名字,我的就是sdb4

2、启动U盘安装

使用ctrl+alt+del重新启动电脑【不生效的话 直接按重启开关】,进入BLOS界面再次选择U盘引导启动,然后再先移动到第二项Install,

然后按tab键/e键 编辑路径。将vmlinuz initrd=initrd.img inst.stage2=hd:LABEL=CentOS\x207\x20x86_64 quiet改成vmlinuz initrd=initrd.img inst.stage2=hd:/dev/sdb4 quiet   按回车或者ctrl+x

剩下的就是安装系统了。参考:在VMware Workstation中安装centos7操作系统

三、Linux上安装设备并使用

1、在pc上插入PCI设备

    命令 lspci -nn 可看是否含有当前密码卡的设备号

windows上用命令行或者设备管理器可看:

 

 命令行:wmic path win32_pnpentity where "deviceid like '%PCI%'" get name,deviceid

 

2、按照用户手册,执行命令,安装Linux驱动,记得用root用户,安装好后,用dmesg查看是否成功加载驱动。

      输出最后一行,提示 Card Driver POLLING Installed! 表示安装成功。

3、将64位的接口库改名为libswsds.so放在/lib64/目录下

4、运行Linux版的管理程序

(需要 右键 获取 可执行权限),将管理程序拉到 终端运行。

 若提示终端需要额外的字体,于是在终端中右键 ->配置文件->配置文件首选项,自定义字体,AR PL UMing TW Light

      终端设置字符编码,拖入管理程序时是UTF-8,运行,可能乱码。不管,修改编码为GBK,管理程序中 下一步,enter,变为ok的话,则开始进行设备的配置。 

这个字体跟中文乱码无关,中文乱码参考:https://jingyan.baidu.com/article/ab69b270de8b4f2ca7189f1d.html

5、测试自己的程序:

终端中命令  dotnet SansecDemo.dll
问题1、打开设备失败

查看用户手册的5.4 权限不满足,需要当前用户具备设备的读写操作权限。可以用root执行程序,或者给用户 增加 访问控制权限,再以当前用户访问密码卡。

用root用户执行,在dev目录下,chmod 777 swcsm-pic18-0 

分别swcsm-pic18-1、swcsm-pic18-2、swcsm-pic18-3

四、Linux下md5sum用法 (查看文件或字符串的md5值)

最近在 机器上1部署了一遍密码卡设备和程序,可用。然后在机器2上重新部署一套后,运行管理工具有报错。百思不得其解,

 

一位哥们提醒我说:比较一下两个机器里面程序的hash值看一下吧【用md5sum 命令可以看】

结果是:对比了下,我认为的相同文件的hash值不一样,于是重新拷贝一遍到机器2上运行,可以了,不报错。

 

MD5算法常常被用来验证网络文件传输的完整性,防止文件被人篡改

MD5 全称是报文摘要算法(Message-Digest Algorithm 5),此算法对任意长度的信息逐位进行计算,产生一个二进制长度为128位(十六进制长度就是32位)的“指纹”(或称“报文摘要”),不同的文件产生相同的报文摘要的可能性是非常非常之小的。

md5sum命令采用MD5报文摘要算法(128位)计算和检查文件的校验和。一般来说,安装了Linux后,就会有md5sum这个工具,直接在命令行终端直接运行。

语法

md5sum(选项)(参数)

eg: md5sum filename

更多参考:Linux下md5sum用法 (查看文件或字符串的md5值)

 

 

 
posted @ 2020-06-02 17:45  peterYong  阅读(855)  评论(0编辑  收藏  举报