linux net delphi linux

详解Linux内核通信netlink机制

详解Linux内核通信netlink机制

netlink socket是一种用于内核态和用户态进程之间进行数据传输的特殊IPC机制。它通过为内核模块提供一组特殊的API,并为用户程序提供了一组标准的socket接口的方式,实现了一种全双工的通讯连接。

Netlink socket使用地址族AF_NETLINK,每一个netlink socket在内核头文件include/linux/netlink.h中定义自己的协议类型。它提供了一种异步通讯方式,与其他socket API一样,它提供了一个socket队列来缓冲或平滑瞬时的消息高峰。发送netlink消息的系统调用在把消息加入到接收者的消息队列后,会触发接收者的接收处理函数。接收者在接收处理函数上下文中,可以决定立即处理消息还是把消息放在队列中,在以后其他上下文去处理它。

内核中实现系统调用的代码都是在编译时静态链接到内核的,因此,在动态加载模块中去包含一个系统调用的做法是不合适的。使用netlink socket时,动态加载模块中的netlink程序不会和linux内核中的netlink部分产生任何编译时依赖关系。

Netlink优于系统调用、ioctls和proc文件系统的另一个特点就是它支持多点传送。一个进程可以把消息传输给一个netlink组地址,然后任意多个进程都可以监听那个组地址,并接收消息。这种机制为内核到用户态的事件分发提供了一种近乎完美的解决方案。

系统调用和ioctl都属于单工方式的IPC,也就是说,这种IPC会话的发起者只能是用户态程序。然而,如果内核有一个紧急的消息想要通知给用户态程序时,该怎么办呢?如果直接使用这些IPC的话,是没办法做到这点的。通常情况下,应用程序会周期性地轮询内核以获取状态的改变,然而,高频度的轮询势必会增加系统的负载。Netlink通过允许内核初始化会话的方式完美地解决了此问题,我们称之为netlink socket的双工特性。

Netlink Socket的API包括标准的socket API函数-socket(), sendmsg(), recvmsg()和close()。使用socket()函数创建一个socket,输入:int socket(int domain, int type, int protocol)。跟TCP/IP中的socket一样,netlink的bind()函数把一个本地socket地址与一个打开的socket进行关联,netlink地址结构体如下。另一个结构体 struct sockaddr_nl nladdr作为目的地址。如果这个netlink消息是发往内核的话,nl_pid属性和nl_groups属性都应该设置为0。如果这个消息是发往另一个进程的单点传输消息,nl_pid应该设置为接收者进程的PID,nl_groups应该设置为0。netlink消息同样也需要它自身的消息头,这样做是为了给所有协议类型的netlink消息提供一个通用的背景。

内核空间的netlink API接口由内核中的netlink核心代码支持,在net/core/af_netlink.c中实现。从内核的角度来说,API接口与用户空间的API是不一样的。内核模块通过这些API访问netlink socket并且与用户空间的程序进行通讯。在用户空间,我们通过socket()调用来创建一个netlink socket,而在内核空间,我们调用如下的API:struct sock* netlink_kernel_create(int unit, void(*input)(struct sock*sk, int len))。参数uint是netlink协议类型,例如NETLINK_TEST。函数指针,input,是netlink socket在收到消息时调用的处理消息的回调函数指针。在内核创建了一个NETLINK_TEST类型的netlink socket后,无论什么时候,只要用户程序发送一个NETLINK_TEST类型的netlink消息到内核的话,通过netlink_kernel_create()函数注册的回调函数input()都会被调用。

使用skb= skb_recv_datagram(nl_sk)来接收消息,nl_sk是netlink_kernel_create()函数返回的netlink socket,然后,只需要处理skb->data指针指向的netlink消息就可以了。从内核中发送netlink消息就像从用户空间发送消息一样,内核在发送netlink消息时也需要设置源netlink地址和目的netlink地址。假设结构体struct sk_buff* skb指向存储着要发送的netlink消息的缓冲区,源地址可以这样设置。从内核空间关闭netlink socket,netlink_kernel_create()函数返回的netlink socket为struct sock*nl_sk,我们可以通过访问下面的API来从内核空间关闭这个netlink socket:sock_release(nl_sk->socket);

Linux下能不能使用.net

我们不得不承认,Mono项目对于开发者来说,已经成为在开源项目中最引人期待渴望的项目了。它的出现使得.NET framework可以首次在Linux和其它的平台上运行。把应用程序的部署扩大到了更大的范围。

最近,Mono项目的Beta3版已经发布。在这篇文章里,我希望可以使你了解到如何去得到Mono的Beta3版,并且如何使它在你的linux系统中运行,还有如何通过Mono平台运行你的第一个.NET应用程序。

如果你是一个Windows平台下的开发者,如果你正在考虑用 Linux作为你.NET应用程序的主机。那么Mono beta版提供了一个很好的办法,使你可以预先在Linux平台上对您的应用程序进行测试和调试。

提醒:

Mono Beta 3仅仅是被用来测试,并不推荐当作一个产品去使用。

我们用Red Hat 9.0作为我们这次文章讲解的平台来安装和配置Mono。如果你现在还没有 Red Hat或者其它版本的 Linux服务器,那么,你可以从here下载Red Hat的ISO文件安装。

但是,如果你没有空闲的计算机或者服务器去运行 RedHat,你可以在你的计算机上安装一个双启动,或者,你可以通过软件做一个虚拟机,例如像VMWare。不过请注意看 Red Hat.安装说明。

当你安装好Red Hat并成功运行了Red Hat后,你下一步需要做的就是下载Mono Beta3从Go-Mono Web site.请注意,针对不同的操作系统的

Mono有不同的版本。

? Red Hat 9.0/x86

? Fedora Core 1/x86

? Fedora Core 2/x86

? SLES 8/x86

? SUSE 9/x86

? SUSE 9.1/x86

? Windows(2000 and above)

? Mac OS X

针对这篇文章,你需要下载的版本是Red Hat 9.0/x86 version.。有两种不同的下载途径。一种是比较大尺寸的zip格式文件,这个文件里包含了所需的所有RPM文件。另外一种是单独下载你所需的每个独立的RPM文件。

关于RPM

如果你是一个Linux的新手,是否对RPM感到陌生。RPM是“Red Hat Package Manager”它是一个标准的文件格式。通常在Linux上的文件管理格式都是RPM。你可以学习到更多的RPM在here.

当然,最方便的方法还是下载包含所有你所需RPM文件的zip文件。当你下载,并解压缩了那个zip包后。你就会看见很多独立的RPM文件。这时你可以双击每一个RPM文件逐个去安装。但是这种做法需要注意安装的从属关系,先后次序。所以,一种比较简单的安装方法是通过命令的方式对RPM文件进行一次统一的安装。

首先你要保证你是用root的身份登陆的,然后输入如下命令一次安装所有的这些packages文件。

rpm-Uvh--nodeps*.rpm

如果在这个时候,你已经安装了一部份package文件,也不要紧你可以使用下面的命令一次性的重新安装所有的Mono package。

rpm-Uvh--nodeps--force*.rpm

技巧,在对 RPM文件进行操作的时候,如果不记得命令,可以输入 RPM–help或者查看这个文档here.。

一但你安装完了所有的RPM packages,你还需要进行一个测试,以确保所有的Mono组件都可以运行。Mono提供了一个light-weight的 Web服务叫XSP。它是用C#并且装载了许多的测试页,你可以通过这些页面来确定Mono beta版是否安装并可以运行。

To start the XSP Web server, open a terminal and run:

mono/usr/bin/xsp.exe--port 80

当Web服务启动了以后,你可以看到test.ASPX页,在导航条中输入

在这个.ASPX pages页中你可以看到很多与ASP.NET不同的特性,包括:用户界面,code-behind(代码分离)以及很多不同的技术例如:

data binding(数据邦定)。在这个页面里,你还会看到许多关于Web服务的例子和文档。

注意,这里的很多例子都需要额外的安装一些程序,例如象data binding邦定的例子,你就需要首先有一个数据库的 table.。否则,许多的例子,当你在浏览的时候会显示一些错误的信息。

现在,可以确认,你已经成功地安装并且已经成功的开启了Web服务。现在,我们可以开始测试我们已经做好的.NET应用程序了。在zip文件中提供了一个MonoDevelop,它是一个一个开源的IDE,你可以使用它来进行基于Mono framework的开发。这个IDE快捷方式在程序启动—〉More Programming Tools> MonoDevelop.

当你启动了这个MonoDevelop IDE后,你就可以使用File菜单中的import,插入一个Visual Studio项目,然后在MonoDevelop IDE中编译和运行。不过这时要注意,Mono支持C#但是并不支持VB.NET,所以,请确定你的应用程序是用c#编写的。

最后,无论你是一个寻找新的Linux下开发工具的的开发者,或者是一个寻找新的平台的.NET下的开发者,Mono Beta 3都将会给你带来惊喜。

linux 如何安装.net

在Linux系统中安装.NET需要遵循一系列具体步骤,以确保正确且高效地实现。以下是关于如何在Linux中安装.NET的详细方法,请仔细阅读以下步骤。

第一步是下载.NET SDK。访问以下链接以获取适合您系统的最新版本:。下载完成后,您将获得一个包含.NET SDK的安装包。

下一步是解压下载的安装包。在终端中使用以下命令来解压文件:

tar-xvf dotnet-sdk-2.1.302-linux-x64.tar.gz

解压后,您需要将.NET SDK的可执行文件移动到系统路径中,以便于在任何位置执行.NET命令。您可以通过将以下命令添加到bash配置文件(如~/.bashrc)来完成此操作:

export PATH=$PATH:/path/to/dotnet-sdk

确保将/path/to/dotnet-sdk替换为实际解压.NET SDK的目录路径。完成此步骤后,您可以通过在终端中输入"dotnet"来验证.NET SDK是否已成功安装:

dotnet--version

如果已成功安装.NET SDK,终端将显示安装的.NET版本信息。至此,您已经成功在Linux系统中安装了.NET。您现在可以使用.NET开发应用程序,进行项目构建等。

阅读剩余
THE END