Linux下的套接口选项SO_LINGER
Linux提供了一个套接口选项SO_LINGER,可以改变在套接口上执行close()函数时的默认行为,对于改变之后的行为如何,网上有大量的资料人云亦云的对其进行了说明,但是事实上却并非如此。
选项SO_LINGER用到的相关参数主要是一个linger结构体:
Linux提供了一个套接口选项SO_LINGER,可以改变在套接口上执行close()函数时的默认行为,对于改变之后的行为如何,网上有大量的资料人云亦云的对其进行了说明,但是事实上却并非如此。
选项SO_LINGER用到的相关参数主要是一个linger结构体:
ACPI的介绍能Google到很多,今天遇到一个与此相关的问题。一同事说设备nmi中断不触发,凌动D425的CPU芯片,2.4.37的linux内核,把设备拿来启动看看,发现启动参数里acpi=off,而/proc/cpuinfo显示为1个cpu,查看/proc/interrupts,发现中断类型皆为最原始的XT-PIC,想到nmi需要apic支持,难道是apic被连带的禁用了?试试将内核参数改为acpi=on,结果还真成了,nmi能够得以触发,/proc/cpuinfo显示出2个cpu,原来D425是单核心双线程,/proc/interrupts里显示的各个中断类型为IO-APIC-edge或IO-APIC-level。
试了2.6的内核,禁用acpi貌似并不会导致apci也无法使用,不知是否是因为2.4的内核太矬了?嘛,算了,贴一下相关内核参数:
在linux 2.6内核上使用direct io不难,只需按照如下几点来做即可:
1,在open文件时加上O_DIRECT旗标,这样以通告内核我们想对该文件进行直接io操作。
2,在源文件的最顶端加上_GNU_SOURCE宏定义,或在编译时加在命令行上也可以,否则将提示:
之前写在CU的博客上的文章,今天又看了看,转过来。
Linux 2.6.35于2010年8月1号发布,新增特性比较多,而其中最引我注意的为第一点:Transparent spreading of incoming network traffic load across CPUs。
关于此点改进的详细介绍可以查看LWN上的两篇文章:”Receive packet steering” and “Receive flow steering“。
下面我就自己的理解来做一下阐述,不当之处,多多包涵。
在linux下统计时间有很多种方法,在内核代码里,最简单方便的方法自然是利用全局变量jiffies,这个字段记录了自系统启动以来产生的节拍总数,而系统每1秒钟将产生HZ次节拍,HZ是个常数,在内核2.6版本,编译时可选择,100/250/300/1000,可以查看内核编译选项:
前面曾提到Linux 2.6.x内核在X86 32位架构上可以配置内核栈大小(在进行内核编译时,Kernel hacking下进行配置,默认8K,配置之后对应的宏为CONFIG_4KSTACKS),具体生效代码可以看:
http://lxr.linux.no/#linux+v2.6.36/arch/x86/include/asm/page_32_types.h
不同于Linux应用程序的栈能够动态增长,Linux内核栈是固定的,并且比较小,比如Linux 2.6.x内核,在X86 32位架构上一般是4K或8K(在进行内核编译时,Kernel hacking下进行配置,默认8K),而在X86 64位架构上固定为8K。Linux内核会分配一页(4K stack)或两页连续(8K stack)不可交换(non-swappable)内存来作为内核栈使用。Linux 2.4.x内核在X86位架构上,内核栈固定为8K。
关于ELF(Executable and Linking Format)文件格式的基本介绍无需多说,这里直接进入正题。ELF格式文件有好几种类型:
1,可重定位文件(Relocatable file),也就是通常所说的编译中间文件,这些文件包含有代码和数据,但尚未进行形成最终的可执行文件或库。比如如下的test.o文件,另外内核模块.ko也属于此类ELF。
Windows下有很多逆向工具,Linux下也有,当然,和Windows平台有所不同的是,Linux下的逆向工具主要是用来定位和分析程序的问题,比如当应用程序崩溃之后,如何从core文件里给出的信息查出原因所在。
曾经用过的一些命令如下(只列出主要功能):
addr2line:根据一个代码地址,定位到对应的源文件与代码行。
nm:列出程序里的符号。
objdump:反汇编。
readelf:显示任何ELF格式目标文件里的相关符号信息。
等等。
随着硬件的快速发展,大多数操作系统都已经在使用64位系统,对于Linux下X86-64的进程内存空间布局并没有Google到很好的资料,而对于32位系统倒有不少描述得非常清晰的文档,比如:【图解】Linux下C程序进程地址空间布局,linux 下 C 程序(进程) 内存布局,等等。对于Linux X86-64,刚好利用现成的系统环境做了一下简单的对比测试。测试的代码: