Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 网络的机器代码是什么样子的?_C_Windows_Linux_Assembly_Ipc - Fatal编程技术网

C 网络的机器代码是什么样子的?

C 网络的机器代码是什么样子的?,c,windows,linux,assembly,ipc,C,Windows,Linux,Assembly,Ipc,最后,我们编写的每一段代码最终都会转换成汇编语言,然后再转换成机器语言 如果您正在编写汇编程序,并且希望在两台计算机之间执行简单的连接,那么您如何知道在汇编程序中使用哪些内存地址(更不用说偏移量了)?您是否需要知道与操作系统相关的特定地址 我只是想知道有人会如何编写一个真正“干净”和“高效”的消息传递库/编译器——让我明白的是,网络通信/IPC在汇编程序中究竟是什么样子的 我认为部分答案可能在于查询与操作系统相关的已知地址?例如,0x456到0x 60000000包含用于通信X等的Linux内核

最后,我们编写的每一段代码最终都会转换成汇编语言,然后再转换成机器语言

如果您正在编写汇编程序,并且希望在两台计算机之间执行简单的连接,那么您如何知道在汇编程序中使用哪些内存地址(更不用说偏移量了)?您是否需要知道与操作系统相关的特定地址

我只是想知道有人会如何编写一个真正“干净”和“高效”的消息传递库/编译器——让我明白的是,网络通信/IPC在汇编程序中究竟是什么样子的


我认为部分答案可能在于查询与操作系统相关的已知地址?例如,0x456到0x 60000000包含用于通信X等的Linux内核数据。

有两段代码用于在汇编中进行联网—操作系统实际进行联网时使用的内核代码,以及希望告诉操作系统通过网络发送哪些数据的客户机代码

通常,机器中的硬件具有专用于与网络硬件通信的特定内存地址。然后,操作系统的机器代码可以将适当的值写入该内存,以控制最终发送和接收字节的硬件。这些内存地址将硬编码到机器代码中

对于进行网络连接的用户代码(比如Mozilla Firefox),过程是不同的。通常有一条机器指令或一组指令用于用户代码,以告诉操作系统执行某些任务(例如,在MIPS中,这是
syscall
,而我认为x86使用
int
指令)。客户机代码的工作原理是设置一些缓冲区,将适当的数据发送到网络,然后使用上面的一条汇编指令告诉操作系统它应该发送数据。然后,硬件调用操作系统,操作系统读取用户数据,然后使用自己的机器代码(如上所述)来适当地实际控制网络设备。通过这种方式,操作系统可以阻止对控制设备的物理地址的访问,并通过系统调用调节访问,从而保护对网络设备的直接访问。这还意味着,在编写用于联网的用户代码时,您不需要知道任何内存地址。操作系统处理这些细节,您只需要知道要执行什么指令来触发系统调用


希望这有帮助

这些地址不是特定于您的操作系统的。它们特定于您的硬件/系统。访问这些与汇编语言和其他编程语言(例如C)无关,事实上,大多数设备驱动程序代码(实际上与网络硬件交互的代码)通常是用C编写的

以下是一个网络(以太网)控制器的随机样本:

您的软件,无论是汇编语言还是其他语言,都需要编写大量寄存器,才能通过以太网进行实际通信。从一个简单的例子开始可能更容易,比如串口。让我们构建一个假设的固定波特率串行端口控制器,映射到内存:

Address  Meaning
0        RX status (reads 0 when no data to read, 1 a byte is available)
1        RX buffer
2        TX status (reads 0 when ready to send, 1 when busy)
3        TX buffer
现在,您的软件,无论是汇编语言还是任何其他语言,都可以通过监视(轮询)地址2,直到它准备就绪,将下一个字节写入地址3,从而将数据传输到另一台计算机。我们还可以通过监视(轮询)地址0来查看数据何时准备就绪,并在数据存在时从地址1读取字节,从而从另一台计算机接收数据

在现代操作系统/OS中,这些都是物理地址,需要以某种方式映射到虚拟地址

现实世界中的硬件,比如我链接到的硬件,通常会使用中断,所以您不需要轮询。它通常有DMA,因此硬件可以直接访问数据,而不是逐字节地输入数据。它将处理各种协议,并具有用于检查和设置该协议各个方面的寄存器

在现代操作系统中,与硬件的实际交互是在一个平台上实现的,用户软件可以通过一些API与设备驱动程序交换数据。同样,此用户代码可以用汇编语言或任何其他语言编写。API将因操作系统而异。通信/网络通常构建为一个“”结构,在较低级别的协议上实现较高级别的协议。此堆栈的哪一部分位于用户库中或操作系统的哪一部分将因不同的操作系统而异


对于我上面描述的假设设备,API可能由两个单字节阻塞调用组成,
read()
write()
。然后使用汇编程序或更高级语言中的某种机制来调用这些函数并传递参数/检索输出。在某些操作系统中,设备I/O可能看起来像文件I/O,因此您可以使用通用文件读/写在设备上执行操作,操作系统会将这些操作分派到正确的设备驱动程序。此外,在典型的操作系统中,实际的系统调用将通过某种类型的库提供,您也可以从各种编程语言调用这些库。

这是一个非常一般的问题,所以我给了您一个非常冗长的一般性回答。如果你更具体一点,你会得到更具体的答案。汇编程序并不自动意味着干净/高效,它比这更复杂。