linux函数源码?Linux软件大全
linux 5.15 ncsi源码分析
深入剖析Linux 5.15 NCSI源码:构建笔记本与BMC通信桥梁
NCSI(Network Configuration and Status Interface),在5.15版本的Linux内核中,为笔记本与BMC(Baseboard Management Controller)以及服务器操作系统之间的同网段通信提供了强大支持。让我们一起探索关键的NCSI网口初始化流程,以及其中的关键结构体和函数。
1. NCSI网口初始化:驱动注册
驱动程序初始化始于ftgmac100_probe,这是关键步骤,它会加载并初始化struct ncsi_dev_priv,包含了驱动的核心信息,如NCSI_DEV_PROBED表示最终的拓扑结构,NCSI_DEV_HWA则启用硬件仲裁机制。
关键结构体剖析
struct ncsi_dev_priv包含如下重要字段:
request表,记录NCSI命令的执行状态;
active_package,存储活跃的package信息;
NCSI_DEV_PROBED,表示连接状态的最终拓扑;
NCSI_DEV_HWA,启用硬件资源的仲裁功能。
命令与响应的承载者
struct ncsi_request是NCSI命令和结果的核心容器,包含请求ID、待处理请求数、channel队列以及package白名单等。每个请求都包含一个唯一的ID,用于跟踪和管理。
数据包管理与通道控制
从struct ncsi_package到struct ncsi_channel,每个通道都有其特定状态和过滤器设置。multi_channel标志允许多通道通信,channel_num则记录总通道数量。例如,struct ncsi_channel_mode用于设置通道的工作模式,如NCSI_MODE_LINK表示连接状态。
发送与接收操作
struct ncsi_cmd_arg是发送NCSI命令的关键结构,包括驱动私有信息、命令类型、ID等。在ncsi_request中,每个请求记录了请求ID、使用状态、标志,以及与网络链接相关的详细信息。
ncsi_dev_work函数:工作队列注册与状态处理
在1753行的ncsi_register_dev函数中,初始化ncsi工作队列,根据网卡状态执行通道初始化、暂停或配置。ncsi_rcv_rsp处理NCSI报文,包括网线事件和命令响应,确保通信的稳定和高效。
扩展阅读与资源
深入理解NCSI功能和驱动probe过程,可以参考以下文章和资源:
Linux内核ncsi驱动源码分析(一)
Linux内核ncsi驱动源码分析(二)
华为Linux下NCSI功能切换指南
NCSI概述与性能笔记
浅谈NCSI在Linux的实现和应用
驱动probe执行过程详解
更多技术讨论:OpenBMC邮件列表和CSDN博客
通过以上分析,NCSI源码揭示了如何构建笔记本与BMC的高效通信网络,为开发者提供了深入理解Linux内核NCSI模块的关键信息。继续探索这些资源,你将能更好地运用NCSI技术来优化你的系统架构。
linux中源代码包安装的基本步骤是什么
详解linux源码包安装过程
1.解压缩包
可以通过下载或其他方式获得了一个软件包,通常它是一个压缩文件,大部分可能是存档的和压缩的,这些文件一般以.tar.gz为扩展名。
首先拷贝它到一个目录,然后 untar和 gunzip解压它。通常这个命令是
tar xzvf filename [filename是软件文件名称]
解压后的文件一般会在当前目录下的创建子目录,并以这个包名来命名。你也可以用用这个命令预先查看结果 tar tzvf filename,显示包里有那些解压文件。
源文件如果是新的 bzip2(.bz2)格式,可用
bzip2-cd filename| tar xvf-,或更简单的 tar xyvf filename,这很不错的tar命令被不断的完善。
说明:
A:有时候一些文件必须安装在用户的 home目录下,或更多的是在一个固定的目录,比如/,/usr/src,或/opt。所以必须仔细阅读安装包的配置信息。当一个软件包里如果有config和 Makefiles文件则最好去编辑它,这里包括了安装指令和说明。提示:你改变 makefile会导致不同的结果。大部分软件包允许用 make install自动处理安置二进制文件在适当的系统位置。
B:你可能碰到过一些共享文件、shell存档文件、尤其是 Internet上的源码新闻组。它们保留的原因是具有人性化的可读性,并且允许新闻组缓冲并通过它们筛选和剔除出不合格的。它们可能用 unshar filename.shar命令来解压。
C:一些源码存档文件是用非标准的 DOS,Mac或其他压缩的比如:
zip, arc, lha, arj, zoo, rar, and shk.
D:有时候,你可能需要使用一个 patch或显示改变了的 diff文件来升级或修复存档的源码文件。这 doc文件或者 README文件将告诉你怎么去使用。一个很好的命令用标准语法来调用的命令是 patch< patchfile.
2:关于 rpm安装包
一些 Linux用户惧怕通过使用源码来手动安装软件包,不过现在有方便的 rpm和 deb或新格式的 slp包。例如:rpm安装运行平稳又快,作为一个软件安装在某几个有名的操作系统。
作为方便的RPM包也存在很多不好的缺点,例如:
A:要了解软件中更多更详细的内容你必须去在二进制中去了解,而不是rpm包。
B:还有安装一个 rpm包如果需要依赖关系那么安装就可能会导致失败。
C:当 rpm请求你系统中不同版本的库,那么安装将不能继续,除非你为错误的库位置创建连接符号到正确的位置。
说明:必须使用root安装 rpm和 deb。因为它需要必须的写入权限。
最简单的,用命令 rpm-i packagename.rpm和 dpkg--install packagename.deb会自动解包和安装。
3:关于安装 Linux包出现的一些问题及解决方案
假设 make失败有个链接错误:-lX11: No such file or directory,正好在 xmkmf之后已被调用,这可能意味着 Imake不能被完全建立。检查第一部分 Makefile文件的的行是这样:
· LIB=-L/usr/X11/lib
· INCLUDE=-I/usr/X11/include/X11
· LIBS=-lX11-lc-lm
这个-L和-I开关告诉编译器和链接分别在哪里找到 library和 include文件。在这个例子里, X11库应该在/usr/X11/lib目录,且 X11包含文件应该在/usr/X11/include/X11目录里。假如对于你的机器上的这个错误,请处理修改 Makefile并重新再 make。
没有声明涉及的数学库函数,像下列各项:
/tmp/cca011551.o(.text 0x11): undefined reference to `cos'
要修复它,需要明确链接到匹配的库,在 Makefile(看先前的例子)里增加一个-lm到 LIB或 LIBS标记。
用其他方法尝试
仍然失败如果失败,参考下列脚本:
make-DUseInstalled-I/usr/X386/lib/X11/config
这个直接方式的类别相当于。
在少数例子里,用 root运行 ldconfig可能会解决:
# ldconfig更新共享库链接符号。
一些 Makefiles使用你系统里未被承认的库别名。一个例子,构建可能需要 libX11.so.6,但是在/usr/X11R6/lib不存在文件或链接。然而,在那里是 libX11.so.6.1。解决方法是用 root运行ln-s/usr/X11R6/lib/libX11.so.6.1/usr/X11R6/lib/libX11.so.6,接着需要运行 ldconfig。
有一些包需要你安装一个或更多库的升级版本。需要拷贝一个或更多的库到适当的目录里,删除旧的库,重新设置动态链接库。
4:一些其他的问题处理
安装一个shell脚本如果出现:No such file or directory的错误消息。这是可以检查文件权限确定文件事可执行的,并检查文件头确定是否 shell或程序是脚本在指定的位置被调用。一个例子,这个脚本可能是这样开始的:
#!/usr/local/bin/EDEN
如EDEN的实际安装位置是在你的/usr/bin目录,用一个/usr/local/bin替代
这个脚本不能运行有两个方法来纠正!!
A:文件头改成#!/usr/bin/EDEN
B:或增加一个链接符, ln-s/usr/bin/EDEN
5:一个典型的例子 Xloadimage
首先说明下面的例子来源于国外网站的一个技术实例,这里我做了翻译和整理。
这个例子展现一个简单的问题。xloadimage程序对我的图形工具的调整设置是有用的附加。从源码目录拷贝文件,用 tar xzvf解压文件,可是在运行 make的时候出现令人讨厌的错误并停止了。
gcc-c-O-fstrength-reduce-finline-functions-fforce-mem
-fforce-addr-DSYSV-I/usr/X11R6/include
-DSYSPATHFILE=\"/usr/lib/X11/Xloadimage\" mcidas.c
In file included from/usr/include/stdlib.h:32,
from image.h:23,
from xloadimage.h:15,
from mcidas.c:7:
/usr/lib/gcc-lib/i486-linux/2.6.3/include/stddef.h:215:
conflicting types for `wchar_t'
/usr/X11R6/include/X11/Xlib.h:74: previous declaration of
`wchar_t'
make[1]:*** [mcidas.o] Error 1
make[1]: Leaving directory
`/home/thegrendel/tst/xloadimage.4.1'
make:*** [default] Error 2
这个错误消息包含了实质的线索:
查看 image.h文件的 23行:
#include< stdlib.h>
在源码的某处对于 xloadimage, wchar_t已经在指定标准 include文件重新定义。告诉我们首先在 image.h的 23行尝试注释它,或许 stdlib.h include是不存在的,毕竟不是所有都是必需的。
在这点,构建中的收益来源于所有任何一个致命错误。xloadimage现在功能正常。
6:安装 Linux包的一些总结
坚持自己动手处理所有的安装出现的问题,不断总结努力学习,从错误里去仔细研究,努力动手排错,从每个不足甚至失败的地方得到扩充和提升,可以增强安装构建软件的技巧。
linux c++ 怎么 调用自己函数的
实验平台:ubuntu 12.04+ g++4.6+ matlab2012a
问题描述:
有一个c++程序main.cpp,和一个matlab函数myFunc.m。现在要做这件事:
1)从main.cpp中传递2个double类型的数值a和b到myFunc.m中
2)myFunc.m中求和(sum= a+b)
3)main.cpp中接收myFunc.m返回的和并输出。
思路:
1)设置matlab的编译器,使用gcc编译器。编译m文件成.so。
2)编译.cpp文件,编译时调用.so库(添加.so的路径到编译选项)。
步骤:
1)将自己的matlab函数(myFunc.m)编译成动态链接库
(1)设定编译器为gcc,在matlab命令行依次执行命令mex-setup和mbuild-setup:
>> mex-setup Options files control which compiler to use, the compiler and link command options, and the runtime libraries to link against. Using the'mex-setup' command selects an options file that is placed in~/.matlab/R2012a and used by default for'mex'. An options file in the current working directory or specified on the command line overrides the default options file in~/.matlab/R2012a. To override the default options file, use the'mex-f' command(see'mex-help' for more information).The options files available for mex are: 1:/opt/MATLAB/R2012a/bin/mexopts.sh: Template Options file for building gcc MEX-files 0: Exit with no changesEnter the number of the compiler(0-1):1/opt/MATLAB/R2012a/bin/mexopts.sh is being copied to~/.matlab/R2012a/mexopts.shcp: cannot create regular file `~/.matlab/R2012a/mexopts.sh': Permission denied************************************************************************** Warning: The MATLAB C and Fortran API has changed to support MATLAB variables with more than 2^32-1 elements. In the near future you will be required to update your code to utilize the new API. You can find more information about this at: Building with the-largeArrayDims option enables the new API.**************************************************************************>> mbuild-setup Options files control which compiler to use, the compiler and link command options, and the runtime libraries to link against. Using the'mbuild-setup' command selects an options file that is placed in~/.matlab/R2012a and used by default for'mbuild'. An options file in the current working directory or specified on the command line overrides the default options file in~/.matlab/R2012a. To override the default options file, use the'mbuild-f' command(see'mbuild-help' for more information).The options files available for mbuild are: 1:/opt/MATLAB/R2012a/bin/mbuildopts.sh: Build and link with MATLAB Compiler generated library via the system ANSI C/C++ compiler 0: Exit with no changesEnter the number of the compiler(0-1):1/opt/MATLAB/R2012a/bin/mbuildopts.sh is being copied to~/.matlab/R2012a/mbuildopts.shcp: cannot create regular file `~/.matlab/R2012a/mbuildopts.sh': Permission denied>>
(2)在matlab中,编写myFunc.m文件内容如下:
function [ C ]= myFunc(A, B)C= A+B;end
(3)生成myFunc.m的动态链接库(.so)
>> mcc-W cpplib:libmyFunc-T link:lib myFunc.m-cWarning: MATLAB Toolbox Path Cache is out of date and is not being used.Type'help toolbox_path_cache' for more info>>
等待数秒,完成。可以看到myFunc.m所在的目录下生成了多个文件:
$ lslibmyFunc.cpp libmyFunc.ctf libmyFunc.exports libmyFunc.h libmyFunc.so main.cpp mccExcludedFiles.log myFunc.m readme.txt
命
令解释:其中-W是控制编译之后的封装格式;cpplib是指编译成C++的lib;cpplib冒号后面是指编译的库的名字;-T表示目
标,link:lib表示要连接到一个库文件的目标,目标的名字即是.m函数的名字。-c表明需要生成.ctf文件,比如本例如果不加-c就不会生成
“libmyFunc.ctf”。
生成的文件中打开“libmyFunc.h”可以看到一行:
extern LIB_libmyFunc_CPP_API void MW_CALL_CONV myFunc(int nargout, mwArray& C, const mwArray& A, const mwArray& B);
这
个就是我们的myFunc.c函数待会儿在c++中调用时的接口。有4个参数,第一个是参数个数,第二个是用来接收函数返回值的,后面2个是从c++中传
递进来的变量。我们还会用到“libmyFunc.h”中的另外2个函数:libmyFuncInitialize()初始化,和注销
libmyFuncTerminate()。
2)编写main.cpp,代码如下:
#include<iostream>#include"mclmcr.h"#include"matrix.h"#include"mclcppclass.h"#include"libmyFunc.h"#include"mclmcrrt.h"using namespace std;int main(){// initialize lib,这里必须做初始化! if(!libmyFuncInitialize()){ std::cout<<"Could not initialize libmyFunc!"<< std::endl; return-1;}//用户输入2个数值 double a, b; cout<<"Please input 2 numbers<a b> and then press enter:"<<endl; cin>> a; cin>> b; double c;//used to receive the result//为变量分配内存空间, maltab只有一种变量,就是矩阵,为了和c++变量接轨,设置成1*1的矩阵 mwArray mwA(1, 1, mxDOUBLE_CLASS);//1,1表示矩阵的大小, mxDOUBLE_CLASS表示变量的精度 mwArray mwB(1, 1, mxDOUBLE_CLASS); mwArray mwC(1, 1, mxDOUBLE_CLASS);//调用类里面的SetData函数给类赋值 mwA.SetData(&a, 1); mwB.SetData(&b, 1);//调用自己的函数,求和。 myFunc(1, mwC, mwA, mwB); c= mwC.Get(1, 1); cout<<"The sum is:"<<c<<endl;//后面是一些终止调用的程序// terminate the lib libmyFuncTerminate();// terminate MCR mclTerminateApplication(); return EXIT_SUCCESS;}
3)编译main.cpp函数,调用libmyFunc.so
$ g++-o main-I.-I/opt/MATLAB/R2012a/extern/include-L.-L/opt/MATLAB/R2012a/runtime/glnxa64 main.cpp-lmyFunc-lm-lmwmclmcrrt-lmwmclmcr
开始编译时也遇到一些问题,主要是链接库路径问题导致的编译错误,详细错误汇总在另篇笔记里(点此查看)。
编译成功后,需要装一下MCR Installer,步骤点此。
运行结果:
$./main Warning: latest version of matlab app-defaults file not found.Contact your system administrator to have this file installedPlease input 2 numbers<a b> and then press enter: 10 100The sum is: 110$./main Warning: latest version of matlab app-defaults file not found.Contact your system administrator to have this file installedPlease input 2 numbers<a b> and then press enter: 1 1The sum is: 2
源代码及编译过程中的所有文件已打包,点击这里可以下载。