linux调试模式,linux进入命令模式
本篇文章给大家谈谈linux调试模式,以及linux进入命令模式对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。
Linux内核中断之中断调用流程
本文基于 RockPI 4A单板Linux4.4内核介绍中断调用流程。
ARMv8包括两种运行状态:AArch64和AArch32。
AArch64中不再使用AArch32中的7种特权模式,而是提出了Exception Levels的概念,包括:
1)EL0:用于用户态程序,权限最低
2)EL1:给内核使用,权限稍高
3)EL2:虚拟化相关,权限更高
4)EL3:安全相关,权限最高
Linux内核中一般只使用EL0和EL1。
AArch64异常向量表中的异常包括:
1)Synchronous exception(同步异常)
2)SError
3)IRQ
4)FIQ
注:SError、IRQ和FIQ属于异步异常。
在Linux内核中,在 arch/arm64/kernel/entry.S文件中定义了异常向量表,内容如下:
选取 el1_irq()函数介绍Linux内核中断的调用流程。
文件: arch/arm64/kernel/entry.S,调用流程如下:
1、handle_irq()初始化
在 DTS解析阶段完成 handle_irq()函数的初始化,流程如下:
gic_irq_domain_map()函数中完成了 handle_irq()函数的赋值,具体执行如下:
2、handle_irq()实现
以共享外设中断 SPI的中断处理函数 handle_fasteoi_irq()为例,继续跟踪中断的执行过程。
handle_irq_event_percpu()函数会调用已经注册的中断处理函数,同时唤醒 irq_thread线程。
3、中断处理线程
在使用 request_threaded_irq()函数申请中断时,会创建一个 irq_thread线程,调用流程如下:
irq_thread线程平时在睡眠状态,等待 handle_irq_event_percpu()函数唤醒,进一步执行已注册的中断处理线程函数。
使用 DRM框架中 HDMI中断验证中断调用流程。
文件: drivers\gpu\drm\bridge\synopsys\dw-hdmi.c
在中断处理函数 dw_hdmi_hardirq()和中断处理线程函数 dw_hdmi_irq中增加 dump_stack()调用(注:仅限于调试验证)。
插入 HDMI线,系统启动后,显示中断调用流程的日志如下:
和
Linux下调整网卡的工作模式
现在的网卡一般都是10/100M自适应工作模式,在配置网卡参数时我们很少考虑它的工作模式,但是在路由器、交换机、代理服务器等通信量比较大的关键设备上,我们应该为它指定正确的工作模式,这样可以提高通信效率。在Linux环境下,我们可以使用系统自带的工具mii-tool(这是专门设置网卡工作模式的命令)来配置网卡工作模式。下面我们具体来谈一下它的使用方法。
1.查看网卡的工作模式,输入命令:
#mii-tool-v
eth0: negotiated 100baseTx-FD,link ok
product info:Vendor 00:05:be,model 8 rev 0
basic status: autonegotiation complete,link ok
basic mode:autonegotiation enabled.
Capabilities:..............
从以上信息中可以看出,这块网卡工作在100M全双工自适应模式下,“100BaseTx-FD”意为100M Full Duplex。
2.更改网卡的工作模式,输入命令:
#mii-tool-F media [interface]
media可选的模式有100baseTx-FD、100baseTx-HD、10baseT-FD、10baseT-HD等。 Interface代表所选择的网卡,如eth0、eth1等,默认为eth0。
例如,设置网卡工作在10M半双工模式下,输入命令:
#mii-tool-F 10baseT-HD eth0
3.恢复网卡的自适应工作模式,输入命令:
#mii-tool-r eth0
更详细的使用方法可以用mii-tool-h来获得。
在《调谐LINUX网络性能之调试工具篇》和《调谐LINUX网络性能之网络配置文件详解》两篇文章中,我们介绍了route、netstat、tcpdump三种网络调谐测试工具的使用方法及其可实现的功能和网络配置文件的内容,本文我们将从实战的角度介绍网络性能调谐的方法。
下面,我们先来介绍网络性能调谐的第一种方法:服务方式选择。
服务方式选择
网络服务器由于要同时为多个客户提供服务,就必须使用某种方式来支持这种多任务的服务方式。一般情况下可以有三种方式来选择,多进程方式、多线程方式及异步方式。其中,多进程方式中服务器对一个客户要使用一个进程来提供服务,由于在操作系统中,生成一个进程需要进程内存复制等额外的开销,这样在客户较多时的性能就会降低。为了克服这种生成进程的额外开销,可以使用多线程方式或异步方式。在多线程方式中,使用进程中的多个线程提供服务,由于线程的开销较小,性能就会提高。事实上,不需要任何额外开销的方式还是异步方式,它使用非阻塞的方式与每个客户通信,服务器使用一个进程进行轮询就行了。异步方式下,多个任务之间的调度是由服务器程序自身来完成的,而且一旦一个地方出现问题则整个服务器就会出现问题,不在讨论的范围内。增大系统线程的数量:限制线程的数量的因素很多,主要有进程数量的限制,内存大小的限制,mutex/semaphore/shm/ipc的限制;一般情况下先增大进程最大数,再扩充内存,在增大线程最大数,而增大线程最大数的方法很简单,只需改变glibc中两处即可:线程最大数和线程堆栈区的大小;线程最大数的增加是以进程的异步 I/O性能下为代价;所以需要加以平衡。
络配置文件中有用的内容
1.对于数据库而言,增大共享内存段和信号量的多少,对数据传输效率的提高起到很重要的作用;
方法:只需编辑文件linux/include/linux/sem.h和linux/include/asm-i386/shmparam.h即可。
2.先增大进程最大数,再扩充内存,再增大线程最大数,而增大线程最大数的方法很简单,只需改变glibc中两处即可:线程最大数和线程堆栈区的大小;
3.把"/etc/inittab"文件中的一行注释掉可以禁止用Control-Alt-Delete关闭计算机。如果服务器不是放在一个安全的地方,这非常重要。
编辑inittab文件(vi/etc/inittab)把这一行:
ca::ctrlaltdel:/sbin/shutdown-t3-r now
改为:
#ca::ctrlaltdel:/sbin/shutdown-t3-r now
用下面的命令使改变生效:
[root@deep]#/sbin/init q
4./etc/host.conf文件指定如何解析主机名。Linux通过解析器库来获得主机名对应的IP地址。下面是一个"/etc/host.conf"的示例:
order bind,hosts:指定主机名查询顺序,这里规定先使用DNS来解析域名,然后再查询"/etc/hosts"文件(也可以相反)。
可以在该文件后加上以下两句:
multi on:指定的主机可以有多个地址,拥有多个IP地址的主机一般称为多穴主机。
ospoof on:指不允许对该服务器进行IP地址欺骗,以提高服务器的安全性。IP欺骗是一种攻击系统安全的手段,通过把IP地址伪装成别的计算机,来取得其它计算机的信任。
可调谐的Linux内核网络参数
ICMP相关内核配置参数
概述:通常我们使用icmp包来探测目的主机上的其它协议(如tcp和udp)是否可用。比如包含"destination unreachable"信息的icmp包就是最常见的icmp包。
(1) icmp_destunreach_rate:设置内容为"Destination Unreachable"icmp包的响应速率。设置值应为整数。
应用实例:假设有A、B两部主机,首先我们在主机A上执行以下ipchains语句:
ipchains-A input-p icmp-j REJECT
这里的REJECT和DENY不同,DENY会丢掉符合条件的包如同没有接收到该包一样,而REJECT会在丢掉该包的同时给请求主机发回一个"Destination Unreachable"的icmp。
然后在主机B上ping主机A,这时候我们会发现"Destination Unreachable"icmp包的响应速度是很及时的。接着我们在主机A上执行:
echo"1000">/proc/sys/net/ipv4/icmp_destunreach_rate
也即每10秒钟响应一个"Destination Unreachable"的icmp包。
这时候再从主机B上ping主机A就会发现"Destination Unreachable"icmp包的响应速度已经明显变慢,我很好奇的测试了一下,发现刚好是每10秒响应一次。
(2)icmp_echo_ignore_broadcasts:设置是否响应icmp echo请求广播,设置值应为布尔值,0表示响应icmp echo请求广播,1表示忽略。
注意:windows系统是不响应icmp echo请求广播的。
应用实例:
在我的RedHat6.x和RedHat7上该值缺省为0,这样当有个用户ping我的服务器所在的网段的网络地址时,所有的linux服务器就会响应,从而也能让让该用户得到我的服务器的ip地址,可以执行
echo"1">/proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
来关闭该功能。从而防止icmp风暴,防止网络阻塞。
(3)icmp_echoreply_rate:设置系统响应icmp echo请求的icmp包的响应速度,设置值为整数。
应用实例:
假设有A、B两部主机,首先我们在主机B上ping主机A,可以看到响应很正常,然后在主机A上执行
echo"1000">/proc/sys/net/ipv4/icmp_echoreply_rate
也即每10秒钟响应一个icmp echo请求包。然后再ping主机A就可以看到响应速度已经变成10秒一次。
最好合理的调整该参数的值来防止icmp风暴。
(4)icmp_echo_ignore_all:设置系统是否忽略所有的icmp echo请求,如果设置了一个非0值,系统将忽略所有的icmp echo请求。其实这是icmp_echoreply_rate的一种极端情况。参数值为布尔值,1:表示忽略,0:表示响应。
(5)icmp_paramprob_rate:当系统接收到数据报的损坏的ip或tcp头时,就会向源发出一个包含有该错误信息的icmp包。这个参数就是用来设置向源发送这种icmp包的速度。当然,在通常情况下ip或tcp头出错是很少见的。参数值为整数。
(6)icmp_timeexceed_rate:数据报在网络上传输时,其生存时间(time to live)字段会不断减少,当生存时间为0时,正在处理该数据报的路由器就会丢弃该数据报,同时给源主机发送一个"time to live exceeded"的icmp包。该参数就是用来设置这种icmp包的发送的速度。当然,这通常用于充当路由器的linux主机。
IP相关内核配置参数
linux内核网络参数中关于ip的配置参数通常是用来定义或调整ip包的一些特定的参数,除此之外还定义了系统的一些网络特性。
(1)ip_default_ttl:设置从本机发出的ip包的生存时间,参数值为整数,范围为0~128,缺省值为64。在windows系统中, ip包的生存时间通常为128。如果你的系统经常得到"Time to live exceeded"的icmp回应,可以适当增大该参数的值,但是也不能过大,因为如果你的路由坏路的话,就会增加系统报错的时间。
(2)ip_dynaddr:该参数通常用于使用拨号连接的情况,可以使系统能够立即改变ip包的源地址为该ip地址,同时中断原有的tcp对话而用新地址重新发出一个syn请求包,开始新的tcp对话。在使用ip欺骗时,该参数可以立即改变伪装地址为新的ip地址。该参数的参数值可以是:
1:启用该功能
2:使用冗余模式启用该功能
0:禁止该功能
应用实例:在使用ipchains配置ip欺骗带动局域网共享一个ppp连接上网时,有时会出现刚开时连接一个站点连不通,再次刷新又可以连接的情况,这时候就可以设置该参数的值为1,从而立即改变伪装地址为新的ip地址,就可以解决这类问题。命令为:
echo"1">/proc/sys/net/ipv4/ip_dynaddr
(3)ip_forward:可以通过该参数来启用包转发功能,从而使系统充当路由器。参数值为1时启用ip转发,为0时禁止ip转发。注意,我们可以在单网卡或双网卡的主机上实现ip转发。
应用实例:
假设我们使用一部装有双网卡的linux主机充当防火墙,这时候我们就必须执行以下命令来打开ip转发功能:
echo"1">/proc/sys/net/ipv4/ip_forward
(4) ip_local_port_range:设置当本地系统向外发起tcp或udp连接请求时使用的端口范围。设置值为两个整数,缺省为"1024 4999"。
应用实例:
echo"1450 6000">/proc/sys/net/ipv4/ip_local_port_range
tcp相关内核配置参数
通过tcp配置参数可以控制tcp会话过程中的各个方面。
(1) tcp_fin_timeout:在一个tcp会话过程中,在会话结束时,A首先向B发送一个fin包,在获得B的ack确认包后,A就进入FIN WAIT2状态等待B的fin包然后给B发ack确认包。这个参数就是用来设置A进入FIN WAIT2状态等待对方fin包的超时时间。如果时间到了仍未收到对方的fin包就主动释放该会话。参数值为整数,单位为秒,缺省为180秒。
(2) tcp_syn_retires:设置开始建立一个tcp会话时,重试发送syn连接请求包的次数。参数值为小于255的整数,缺省值为10。假如你的连接速度很快,可以考虑降低该值来提高系统响应时间,即便对连接速度很慢的用户,缺省
ZYNQ+linux网口调试笔记(3)PL-ETH
在ZYNQ上使用gigE Vision协议的网络接口相机。
第一步:调通PS侧网口GEM0(Xilinx BSP默认配好)。
第二步:调通PS侧网口GEM1(见前一篇文档:开发笔记(1))。
第三步:调通PL侧网口(本文阐述)。
第四步:在PL侧网口上验证Jumbo Frame特性,并在应用层适配gigE Vision协议。
根据《xapp1082》可知,PL侧的PHY支持1000Base-X和SGMII两种配置,这两种配置对应两种不同的PHY引脚接口(连接到MAC)。而我们的hdf文件使用的是1000Base-X的配置。
关于网口的Linux驱动,我们在官网找到一份资料: Xilinx Wiki- Zynq PL Ethernet。资料很长,我们只看与我们相关的2.4.1 PL Ethernet BSP installation for 1000Base-X”这一章节就可以了。
首先导入FPGA设计同事提供的hdf文件:
在弹出的图形界面里,进入Subsystem AUTO Hardware Settings——Ethernet Settings——Primary Ethernet,确认可以看到PL侧网络设备axi_ethernet_0,说明hdf文件里已包含了必要的网口硬件信息:
上图中被选中的网口将成为Linux上的设备eth0。这里我们默认选择ps7_ethernet_0,即使用GEM0作为首选网口。
启用Xilinx AXI Ethernet驱动
进入Device Drivers-- Network device support–选中Xilinx AXI Ethernet(以及Xilinx Ethernet GEM,这是PS侧网口的驱动)
进入Networking support–选中 Random ethaddr if unset
进入Device Drivers-- Network device support-- PHY Device support and infrastructure–启用Drivers for xilinx PHYs
进入~~~~Device Drivers-- DMA Engine Support-–禁用~~~~Xilinx AXI DMAS Engine~~~(对应的配置项名为~~ CONFIG_XILINX_DMA~~~)
注意: Xilinx Wiki里对设备树节点的引用有误(&axi_ethernet),导致编译报错,应改为&axi_ethernet_0。
注:PL-ETH驱动所在路径:<project>/build/tmp/work-shared/plnx_arm/kernel-source/drivers/net/ethernet/xilinx/xilinx_axienet_main.c和xilinx_axienet_mdio.c。对应的内核配置项为CONFIG_NET_VENDOR_XILINX和CONFIG_XILINX_AXI_EMAC。
启用ethtool和tcpdump(调试用,非必须):
然后将生成的BOOT.BIN和image.ub拷贝到SD卡根目录下,将SD卡插入板子上,上电运行。
上电后,使用ifconfig eth1查看网口信息,观察MAC地址与设置的一致,且ifconfig eth1 192.168.1.11 up没有报错。
测试网络通路:ping PC是通的。说明网口工作正常。
Linux下eth1(即PL-ETH)的MAC地址有误
问题描述:
开机打印:
注意:
MAC地址是错的,驱动里解析出的是GEM0的MAC地址。
试验发现,即使在system-user.dtsi里不写local-mac-address,也照样解析出的是GEM0的MAC。
而将system-user.dtsi里的local-mac-address改名为pl-mac-address,并将驱动里解析的字符串也对应更改为pl-mac-address,则可以正确解析出来:
Passing MAC address to kernel via Device Tree Blob and U-Boot:
通过更改u-boot环境变量和设备树,为每个板子设置一个独特的MAC地址:
U-Boot里的环境变量ethaddr会覆盖掉设备树里pl-eth的local-mac-addr字段,从而影响Linux启动后的网卡MAC地址;
但U-Boot里的环境变量ipaddr不会对Linux启动后的配置产生任何影响。因为设备树里根本就没有关于IP地址的配置。
phy-mode怎么会是sgmii?查了下官方的提供的BSP里,也是“sgmii”。说明这个没问题。具体原因不清楚。
@TODO:设备树里的中断号的顺序如何影响功能?
为何读出来的IRQ号不对呢?这是因为这里读到的不是硬件的中断号,而是经过系统映射之后的软件IRQ number。两者不具有线性关系。
关于中断号的疑问:
Linux上的网口eth0、eth1的顺序,似乎是按照phy地址从小到大来排布的。
Xilinx xapp1082-zynq-eth.pdf(v5.0) July 16, 2018
Xilinx Wiki- Zynq PL Ethernet:
Xilinx Wiki- Linux Drivers:
Xilinx Wiki- Linux Drivers- Macb Driver:
Xilinx Wiki- Zynq Ethernet Performance:
查到关于Jumbo frame MTU的定义,当前值为9000,可否改大一些?
驱动源码里关于jumbo frame的说明:
设置MTU为9000,发现ping包最大长度只能设为ping 192.168.1.10-s 1472
【完】