ent0 en0 et0 专题总结

ent1之类的是物理网卡的设备名,en0或是et0是网络接口名(逻辑上的),enx(x是一个数字,代表第几块网卡)是标准以太网接口,et0是IEEE 802.3以太网接口。

 

en0Ethernet II protocal interface

et0802.3 protocal interface 

ent0Hardware device interface

 

现从应用说起,我刚刚安装AIX5.3的要去给它配一个IP地址,于是在
#smit tcpip
下面en0上配了个IPifconfig -a看到en0上有配置IP地址的信息发现网络不通,不是什么大问题,是上连的网线所在的VLAN配置与我所配的IP段不一致,于是再到en1上配置IP地址,并使用
#rmdev -l en0
将前面配置的IP地址的网卡删除掉,使用ifconfig -a看到只有en1上有配置IP地址的信息,测试网络正常

过了一段时间,重启该服务器后发现网络居然不通,这时使用ifconfig -a看到en0, en1上配有同样的IP

这时在smit tcpip里面无法更改en0IP地址,于是使用以下命令
#rmdev -dl en0       //下完这个命令后在smit tcpip里面就没有en0IP配置信息了
#cfgmgr
这样网络便恢复正常,再次重启Server网络不会有前面的问题

学到的东西
首先
#lsdev
就可以看到ent0, en0, et0
ent0
Hardware device interface
en0
Ethernet II protocal interface
et0
802.3 protocal interface

802.3
ethernet II帧格式几乎完全一样,但还是有几个数据位是不同,en0 Ethernet II是标准的

查看任意网卡的详细信息
#lscfg -vpl ent0
[root@KABDSPC01 /]# lscfg -vpl ent0
  ent0             U787A.001.DPM0W1W-P1-T5  2-Port 10/100/1000 Base-TX PCI-X Adapter (14108902)

      2-Port 10/100/1000 Base-TX PCI-X Adapter:
        Network Address.............00096BEB2368
        ROM Level.(alterable).......DV0210
        Device Specific.(YL)........U787A.001.DPM0W1W-P1-T5


  PLATFORM. SPECIFIC

  Name:  ethernet
    Node:  ethernet@1
    Device Type:  network
    Physical Location: U787A.001.DPM0W1W-P1-T5

Physical Location
的位置可以判断网卡是否是插在PCI接口上的

一个有用的命令
#lsslot -c pci
[root@KABDSPC01 /]# lsslot -c pci
# Slot                   Description                         Device(s)
U787A.001.DPM0W1W-P1-C1  PCI-X capable, 64 bit, 133MHz slot  Empty     
U787A.001.DPM0W1W-P1-C2  PCI-X capable, 32 bit, 66MHz slot   Empty     
U787A.001.DPM0W1W-P1-C3  PCI-X capable, 32 bit, 66MHz slot   Empty     
U787A.001.DPM0W1W-P1-C4  PCI-X capable, 64 bit, 133MHz slot  Empty     
U787A.001.DPM0W1W-P1-C5  PCI-X capable, 64 bit, 133MHz slot  ent2
U787A.001.DPM0W1W-P1-C6  PCI-X capable, 64 bit, 133MHz slot  Empty     

总结,IP地址只能配在en0, en1这样的标准interface上,而实际的网线是插在ent0, ent1这样的物理网卡上,查看物理网卡的位置可以通过
#lscfg -vpl ent0/1/2

一旦给某个interface配置好了IP地址,如果想删除掉不用它需使用
#rmdev -dl en0
#cfgmgr

 

 

 

 

 

 

 

 

 

 

 

 

 

附带相关资料

一、物理设备和逻辑设备

1
、物理设备是指以某种方式与计算机系统相连的实际硬件。例如显示器、终端、磁带机等。

2
、逻辑设备是用户或应用程序访问物理设备的界面,用户或应用程序通过逻辑设备来访问物理设备。

3
、在很多情况下,一个物理设备会对应多个逻辑设备
 
  
我的理解
#lsdev -Cc adapter
ent0      Available 03-08 2-Port 10/100/1000 Base-TX PCI-X Adapter (14108902)
ent1      Available 03-09 2-Port 10/100/1000 Base-TX PCI-X Adapter (14108902)
ent2      Available 0A-08 10/100/1000 Base-TX PCI-X Adapter (14106902)


#lsdev -Cc if
en0 Defined   03-08 Standard Ethernet Network Interface
en1 Available 03-09 Standard Ethernet Network Interface
en2 Defined   0A-08 Standard Ethernet Network Interface
et0 Defined   03-08 IEEE 802.3 Ethernet Network Interface
et1 Defined   03-09 IEEE 802.3 Ethernet Network Interface
et2 Defined   0A-08 IEEE 802.3 Ethernet Network Interface

ent0
是物理设备,en0是逻辑设备
ent0, ent1, ent2
三个的状态是Available的,说明它们都是可用的,但是en0, en1, en2中只有en1的状态是Available的,说明目前只有这个口已经插上网线在使用,而其他的并没有在用

同理,
#lsdev -Cc adapter
fcs0      Available 06-08 FC Adapter
fcs1      Available 0C-08 FC Adapter
fcs2      Available 09-08 FC Adapter

#lsdev -Cc driver
fscsi0 Available06-08-02FC SCSI I/O Controller Protocol Device
fscsi1 Available 0C-08-02 FC SCSI I/O Controller Protocol Device
fscsi2 Available 09-08-02 FC SCSI I/O Controller Protocol Device

fcs0, fcs1, fcs2
是三块实体的物理设备——光纤卡
fscsi0, fscsi1, fscsi2是三块光纤卡对应的逻辑设备,它们都在用

4、块设备是一种将信息存放在定长块中的设备。块设备是一种随机访问设备,用户可以随时访问设备中的任意一块。常见的块设备有:

cd0
只读光驱
fd0
软盘驱动器
hd1 lv00
逻辑卷
hdisk0
硬盘

5
、字符设备是一种原始的、面向字符流的顺序存取设备,每次按顺序读写一个字符。常用的字符设备有:
console, lft0, tty
终端
rmt0
磁带机
tok0, ent0
网卡
mem
内存
rhd1, rlv00
逻辑卷
rhdisk0
物理卷

这里,当我们在给db2定义tablespace的时候,如果使用DMS的裸设备,则device的路径应该写成
/dev/r***
而不是/dev/***

二、设备的分类层次

1
、在AIX系统中,按类、子类、型号三个层次对设备进行分类。

(class)是按设备的功能划分的,例如打印机类、硬盘类、适配卡类等。
子类(subclass)是按设备的某种相似性划分的,例如适配卡类可分为PCI子类和MCA子类。
型号(type)是按设备的机型或生产厂家划分的,例如磁带机可分为4mm12gb8mm20gb等型号。

[root@KABDSPC01 /]# lsdev -PH
class          type            subclass
   description

3dx            03000008        usbif      USB 3D mouse
PCM            fcpother        friend     AIX SCSI/FCP Disk Path Control Module
PCM            scsiscsd        friend     AIX SCSI/FCP Disk Path Control Module
PCM            vscsi           friend     AIX SCSI/FCP Disk Path Control Module
adapter        IBM,HPS         chrp       Switch Network Interface Adapter
adapter        IBM,lhca        chrp       Infiniband Host Channel Adapter

设备类主要有adapter, array, bus, cdrom, disk, driver, if, mem, processor, tape, tty


2
、获取设备信息

# lsdev [-option]

AIX系统中,有两个关于设备的数据库----PredefinedCustomizedPredefined数据库中记录了AIX系统本身可以支持的所有设备种类;Customized数据库中则记录了目前你的系统已配置/安装的设备类型。

Customized
数据库中又有两类设备。一种叫Defined设备;另一种叫Available设备。Defined设备是指它的驱动程序已安装,但系统还没有找到该设备。Available设备则是指系统已找到该设备及其驱动程序,因此你可以直接使用这个设备。

这条命令的参数如下:

-P
:查看系统Predefined数据库中的设备
-H
:输出时,在第一行加上各列的Title
-c
:指出要查询的设备类型
-C
:查看系统Customized数据库中的设备

3
、获取设备的具体信息

# lsattr [-option] [resource name]

这条命令是用来获取某一设备的具体信息的。

每个逻辑设备在系统中都有一个Location Code,这个号码因设备的类型及与之所连的适配卡而定。

这条命令的参数如下:

-C
:从ODM库中提取customized设备的信息。
-E
:看设备的具体属性。
-l
:列出逻辑设备名。
-c
:按类来列出设备。

4
、显示系统配置、诊断、VPD(vital product data)的信息

# lscfg
-l Name
Displays device information for the named device.
-p
Displays the platform-specific device information. This flag only applies to AIX4.2.1or later.
-v
Displays the VPD found in the Customized VPD object class. Also, on AIX 4.2.1 or later, displays platform. specific VPD when used with the -p flag.
-s
Displays the device description on a separate line from the name and location.

常用
#lscfg -vpl hdisk*/ent0/rmt2


三、设备的状态

AIX中,设备可以处在下列三种状态之一:

1
Undefined未定义状态

如果设备处于此状态,则系统没有该设备的任何信息。

2
Defined已定义状态

处于此状态,说明系统已经存有该设备的全部信息,并已经给设备分配好逻辑设备名和端口,但当前设备还不能被使用。

3
Available可用状态

处于此状态的设备能被正常使用。

设备可以在这三种状态之间进行转换,可通过命令mkdev -dlrmdev -dl来进行,或通过smit dev来实现。
例如:
(1) mkdev -l rmt0
rmt0 Available

(2) rmdev -l rmt0
rmt0 Defined

(3) rmdev -dl rmt0
rmt0 deleted

四、串行设备

串行设备是与系统串口相连的设备,一般需要手工配置。

1
、显示所有已定义的TTY设备

lsdev -Cctty
smit tty

2
、增加一个TTY设备

smit tty
-Add a TTY
-TTY (rs232 rs422)

#include <reg52.h> #include <intrins.h> #include <math.h> #include <stdio.h> #include <string.h> #define uint unsigned int #define uchar unsigned char /* 硬件接口定义 */ sbit ADC_CS = P2^3; // ADC0804控制引脚 sbit ADC_RD = P2^4; sbit ADC_WR = P2^5; sbit ADC_INTR = P2^6; #define ADC_DATA P1 sbit DS18B20_DQ = P3^7; // DS18B20数据线 sbit TRIAC_CTRL = P2^7; // 可控硅控制引脚 sbit LCD_RS = P3^3; // LCD1602接口 sbit LCD_RW = P3^4; sbit LCD_EN = P3^5; #define LCD_DB P0 sbit BUZZER = P2^0; // 蜂鸣器 sbit KEY_UP = P3^0; // 按键 sbit KEY_DOWN = P3^1; sbit KEY_ENT = P3^2; /* 系统参数 */ #define SET_STEP 10.0 #define MAX_TEMP 1200.0 #define HYSTERESIS 3.0 #define SAFE_MARGIN 50.0 #define V_REF 5.0 #define ADC_MAX 255.0 #define GAIN 100.0 // AD620增益 #define K_TC_SLOPE 0.041 // K型热电偶灵敏度(41μV/℃) #define SAMPLE_TIME 200 // 200ms控制周期 /* PID参数 */ float Kp=2.5, Ki=0.02, Kd=0.8; float integral=0, last_err=0; /* 全局变量 */ idata char lcd_buf[16]; float current_temp=0.0, set_temp=600.0, ambient_temp=25.0; bit alarm_flag=0, set_mode=0; /* 温度查表数据 */ code float K_TC_Table[] = { 0.0, 0.0, // 0mV → 0℃ 4.095, 100.0, // 4.095mV → 100℃ 12.207, 300.0, 24.902, 600.0, 48.838, 1200.0 // 48.838mV → 1200℃ }; /* 函数声明 */ void sys_init(void); void lcd_init(void); void lcd_display(float now_temp, float set_temp); void keyscan(void); void pid_control(void); void alarm_check(void); void delay_ms(uint ms); void delay_us(uint us); uchar read_adc(void); float read_ds18b20(void); float adc_to_temp(uchar adc_val); float lookup_temperature(float voltage); void lcd_show_error(char *msg); bit ds18b20_reset(void); void ds18b20_write_byte(uchar dat); uchar ds18b20_read_byte(void); void write_cmd(uchar cmd); void write_data(uchar dat); void lcd_busy(void); /******************** 主函数 ********************/ void main() { sys_init(); lcd_init(); while(1) { ambient_temp = read_ds18b20(); // 读取冷端温度 current_temp = adc_to_temp(read_adc()); // 读取热电偶温度 keyscan(); // 按键处理 pid_control(); // PID温度控制 alarm_check(); // 安全检测 lcd_display(current_temp, set_temp); delay_ms(SAMPLE_TIME); // 系统周期 } } /******************** 系统初始化 ********************/ void sys_init() { // 外设初始化 ADC_CS = 1; ADC_RD = 1; ADC_WR = 1; TRIAC_CTRL = 0; BUZZER = 0; // 定时器0用于系统时钟 TMOD |= 0x01; // 模式1 TH0 = 0xFC; // 1ms定时 TL0 = 0x66; ET0 = 1; TR0 = 1; EA = 1; } /******************** 定时器0中断服务 ********************/ void timer0_isr() interrupt 1 { TH0 = 0xFC; // 重装初值 TL0 = 0x66; } /******************** PID控制算法 ********************/ void pid_control() { float err, output; err = set_temp - current_temp; // 积分抗饱和处理 if(fabs(err) < 100) { integral += err * SAMPLE_TIME / 1000.0; } // PID计算 output = Kp * err + Ki * integral + Kd * (err - last_err) * 1000.0 / SAMPLE_TIME; // 输出限幅和死区处理 if(output > 95.0) output = 95.0; else if(output < 5.0) output = 0.0; // PWM相位控制(周期20ms) if(output > 5.0) { TRIAC_CTRL = 1; delay_ms((uint)(output / 5.0)); TRIAC_CTRL = 0; delay_ms(20 - (uint)(output / 5.0)); } else { TRIAC_CTRL = 0; } last_err = err; } /******************** 温度计算与处理 ********************/ float adc_to_temp(uchar adc_val) { static uchar samples[16]; static uchar idx=0; uint sum=0; uchar i; float voltage, temp; // 滑动窗口滤波 samples[idx++%16] = adc_val; for(i=0; i<16; i++) sum += samples[i]; voltage = (sum >> 4) * V_REF / ADC_MAX / GAIN; // 冷端补偿 voltage += ambient_temp * K_TC_SLOPE / 1000.0; // 查表法温度转换 temp = lookup_temperature(voltage); // 传感器故障检测 if(adc_val < 5 || adc_val > 250) { lcd_show_error("SENSOR ERROR"); return -999.9; } return temp; } float lookup_temperature(float voltage) { uint i; voltage *= 1000; // 转换为mV for(i=2; i<sizeof(K_TC_Table)/sizeof(float); i+=2) { if(voltage <= K_TC_Table[i]) { float x1 = K_TC_Table[i-2]; float y1 = K_TC_Table[i-1]; float x2 = K_TC_Table[i]; float y2 = K_TC_Table[i+1]; return y1 + (voltage - x1) * (y2 - y1) / (x2 - x1); } } return MAX_TEMP; // 超量程 } /******************** DS18B20完整驱动程序 ********************/ float read_ds18b20(void) { uchar temp_l, temp_h; int temp; float t; if(!ds18b20_reset()) { // 复位失败处理 lcd_show_error("DS18B20 ERROR"); return -999.9; } ds18b20_write_byte(0xCC); // 跳过ROM命令 ds18b20_write_byte(0x44); // 启动温度转换 delay_ms(750); // 等待转换完成(12位精度) if(!ds18b20_reset()) { // 再次复位 return -999.9; } ds18b20_write_byte(0xCC); // 跳过ROM ds18b20_write_byte(0xBE); // 读取暂存器 temp_l = ds18b20_read_byte(); // 读取温度低字节 temp_h = ds18b20_read_byte(); // 读取温度高字节 temp = (temp_h << 8) | temp_l; t = temp * 0.0625; // 转换为实际温度 return t; } bit ds18b20_reset() { DS18B20_DQ = 0; delay_us(480); DS18B20_DQ = 1; delay_us(60); return (DS18B20_DQ == 0); } void ds18b20_write_byte(uchar dat) { uchar i; for(i=0; i<8; i++) { DS18B20_DQ = 0; delay_us(2); DS18B20_DQ = dat & 0x01; delay_us(60); DS18B20_DQ = 1; dat >>= 1; } } uchar ds18b20_read_byte() { uchar i, dat=0; for(i=0; i<8; i++) { DS18B20_DQ = 0; delay_us(2); DS18B20_DQ = 1; delay_us(8); dat >>= 1; // 修正位移方向 if(DS18B20_DQ) dat |= 0x80; delay_us(50); } return dat; } /******************** ADC0804驱动程序 ********************/ uchar read_adc() { uchar val; ADC_CS = 0; ADC_WR = 0; _nop_(); _nop_(); ADC_WR = 1; while(ADC_INTR == 1); // 等待转换完成 ADC_RD = 0; val = ADC_DATA; ADC_RD = 1; ADC_CS = 1; return val; } /******************** LCD1602驱动程序 ********************/ void lcd_init() { delay_ms(15); write_cmd(0x38); write_cmd(0x0C); write_cmd(0x06); write_cmd(0x01); } void lcd_display(float now_temp, float set_temp) { uchar i; if(now_temp < 0) { sprintf(lcd_buf, "NOW:----.-%cC ", 0xDF); } else { sprintf(lcd_buf, "NOW:%5.1f%cC", now_temp, 0xDF); } write_cmd(0x80); for(i=0; lcd_buf[i]; i++) write_data(lcd_buf[i]); sprintf(lcd_buf, "SET:%5.1f%cC", set_temp, 0xDF); write_cmd(0xC0); for(i=0; lcd_buf[i]; i++) write_data(lcd_buf[i]); } void lcd_show_error(char *msg) { uchar i; write_cmd(0x01); write_cmd(0x80); for(i=0; msg[i]; i++) write_data(msg[i]); } void write_cmd(uchar cmd) { lcd_busy(); LCD_RS = 0; LCD_RW = 0; LCD_DB = cmd; LCD_EN = 1; _nop_(); LCD_EN = 0; delay_ms(2); } void write_data(uchar dat) { lcd_busy(); LCD_RS = 1; LCD_RW = 0; LCD_DB = dat; LCD_EN = 1; _nop_(); LCD_EN = 0; delay_ms(1); } void lcd_busy() { LCD_DB = 0xFF; LCD_RS = 0; LCD_RW = 1; do { LCD_EN = 1; _nop_(); LCD_EN = 0; } while (LCD_DB & 0x80); } /******************** 按键扫描程序 ********************/ void keyscan() { static bit key_lock = 0; if(!KEY_ENT && !key_lock) { delay_ms(20); if(!KEY_ENT) { set_mode = ~set_mode; key_lock = 1; BUZZER = 1; delay_ms(50); BUZZER = 0; } } else if(KEY_ENT) { key_lock = 0; } if(set_mode) { if(!KEY_UP) { delay_ms(20); if(!KEY_UP) { set_temp += SET_STEP; if(set_temp > MAX_TEMP) set_temp = MAX_TEMP; while(!KEY_UP); } } if(!KEY_DOWN) { delay_ms(20); if(!KEY_DOWN) { set_temp -= SET_STEP; if(set_temp < 0) set_temp = 0; while(!KEY_DOWN); } } } } /******************** 报警与安全系统 ********************/ void alarm_check() { static uchar alarm_cnt = 0; if(current_temp < 0 || current_temp > MAX_TEMP) { BUZZER = 1; TRIAC_CTRL = 0; alarm_flag = 1; } else if(fabs(current_temp - set_temp) > SAFE_MARGIN) { if(++alarm_cnt > 10) { BUZZER = ~BUZZER; alarm_cnt = 0; } alarm_flag = 1; } else { BUZZER = 0; alarm_flag = 0; alarm_cnt = 0; } } /******************** 延时函数 ********************/ void delay_ms(uint ms) { uint i, j; for(i=0; i<ms; i++) for(j=0; j<114; j++); } void delay_us(uint us) { while(us--) { _nop_(); _nop_(); _nop_(); _nop_(); } }这个代码LCD显示屏不显示是什么原因
05-10
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值