我主要来自嵌入式软件背景,因此我对硬件的了解非常有限.我总是将以太网视为计算机上连接以太网电缆的小型物理连接器.从软件的角度来看,您需要做的就是安装驱动程序(在Windows中)或配置Linux内核以包含以太网的驱动程序.
问题:
但正如我已经开始下降一个等级(对硬件)和寻找不同的数据表和图表,我已经开始遇到像PHY,MII,SGMII,RGMII等方面,现在我是什么构成有点困惑以太网?例如,当我说英特尔82574L 1.0 Gbps以太网端口时,所有这些术语适用于哪里?
我对基本的OSI模型很熟悉,但我总是感到困惑的是,数据包是如何通过Internet从一台机器传输到另一台机器的,以及OSI层是如何形成的?例如,对于以下拓扑:
机器A <-----> Switch <----> Router <----> Router <----> Router <----> Switch <----> Machine B
在显示多个路由器代表互联网的情况下,当机器A向机器B发送数据包(比如通过FTP的简单"ls"命令)时,OSI层级会发生什么.
以上只是一个建议的例子,但如果任何人可以解释任何其他网络拓扑,那也没关系.我正在寻找一个非常基本的解释,说明如何将数据包转换到每个节点(机器,交换机,路由器等)的不同OSI层.
我主要来自x86系统背景,其中BIOS(固件)负责从PowerON加载引导加载程序(如GRUB),后者又加载操作系统.我现在一直在阅读ARM系统上的等效启动序列,似乎网上有文章引用了两个术语:bootrom和bootloader.
有些文章提到,从PowerON开始,引导加载程序(如u-boot)是第一个被执行的东西,而有些文章说,从PowerON开始,bootrom(通常在处理器的内部ROM上闪存)首先执行,然后加载引导加载程序(如uboot)然后加载操作系统.
任何人都可以提供一些关于bootrom vs bootloader的说明吗?另外,我想知道通常在ARM系统中使用的流行bootrom的名称.
我一直在阅读有关访问外围设备的内存映射寄存器的信息,看来你可以采取多种方式.例如:
方法1:
#define MyReg 0x30610000
volatile int *ptrMyReg;
ptrMyReg = (volatile int *) MyReg;
*ptrMyReg = 0x7FFFFFFF; /* Turn ON all bits */
Run Code Online (Sandbox Code Playgroud)
方法2:
#define MyReg 0x30610000
volatile unsigned char *ptrMyReg;
ptrMyReg = (volatile unsigned char *) MyReg;
*ptrMyReg = 0x7FFFFFFF; /* Turn ON all bits */
Run Code Online (Sandbox Code Playgroud)
问题:为什么人们会选择一个而不是另一个?
假设:体系结构上int的大小为4个字节.
曾经有人要求我写一个函数,它会在一些成功的条件下返回指向内存中某些数据的指针,否则它应该返回"-1".在这种情况下,什么是正确的返回类型.如果我只需要返回数据,那么我将使用char*作为函数myfunction的返回类型.但在这种情况下,我可能会返回-1有返回类型.
<what-type> myfunction() {
char *data;
if (some condition true)
return data;
else
return -1
}
int main () {
myfunction
}
Run Code Online (Sandbox Code Playgroud) strcmp_kr函数基于K&R的字符串比较功能.
#include<stdio.h>
#include<string.h>
int strcmp_kr (char *s, char *d) {
int i=0;
while ((s[i] == d[i])) {
printf("Entered while loop\n");
if (s[i] == '\0')
return 0;
i++;
}
return s[i] - d[i];
}
int main() {
char s1[15];
char s2[15];
printf("Enter string no. 1:");
scanf("%s", s1);
printf("Enter string no. 2:");
scanf("%s", s2);
strcmp_kr(s1, s2) == 0 ? printf("Strings equal!\n") : \
printf("Strings not equal by %d!\n", strcmp_kr(s1, s2));
Run Code Online (Sandbox Code Playgroud)
}
输出:
$ ./a.out
输入字符串号.1:谦虚
输入字符串号.2:modesy
进入while循环
进入while循环
进入while循环
进入while循环
进入while循环
进入while循环 …
最近,我在python脚本中看到了以下代码:
#!/usr/bin/env python
__svnversion__ = '$Id: setup.py 303 2010-10-20 02:51:64Z xyz $'
import sys
Run Code Online (Sandbox Code Playgroud)
看来这是一种以某种方式跟踪SVN中脚本版本的方法,但我完全不知道为什么以及如何使用它?我在哪里可以阅读更多关于这种编码风格以及人们使用它的原因?