Linux环境调试.net Core调用PCI设备
一、虚拟机CentOS
最近有一款PCI密码设备,在Windows 10上测试OK。准备测试Linux系统,于是在Windows 10安装虚拟机CentOS 7,安装驱动等准备测试程序。出现以下问题:
1、拷贝文件(到lib64目录下)的时候出现权限不够
打开一个终端,然后运行命令 sudo nautilus
就可以打开一个具有管理员权限的文件管理器,然后就可以在不切换到管理员的条件下拷贝文件。
2、登录Root账户
su root 然后 输入密码
切换回普通用户:su - 用户名
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值)