Linux 内核源码分析
文章平均质量分 73
raintungli
这个作者很懒,什么都没留下…
展开
-
Linux下关于TCP的keep alive的实现源码分析
TCP下的Keep Alive我们常说的TCP的keep alive,就是为了保证连接的有效性,在间隔一定的时间发探测包,根据回复来确认该连接是否有效。通常上层应用会自己提供心跳检测机制,而Linux内核本身也提供了从内核态确保连接有效性的方式。在sock 函数中可以设置是否需要打开keep alive开关,默认建立socket 是关闭keep alive的。代码如下 opt原创 2015-01-14 21:14:49 · 4907 阅读 · 0 评论 -
jvm crash 的崩溃日志详细分析及注意点
生成1. 生成error 文件的路径:你可以通过参数设置-XX:ErrorFile=/path/hs_error%p.log, 默认是在java运行的当前目录 [default: ./hs_err_pid%p.log]2. 参数-XX:OnError 可以在crash退出的时候执行命令,格式是-XX:OnError=“string”, 可以是命令的集合,用分号做分隔符, 可以用"%p原创 2012-06-07 17:00:01 · 50175 阅读 · 2 评论 -
linux里的backlog详解
说起backlog, 都会想起socket编程中的listen backlog 参数,而这个backlog 是linux内核中处理的backlog么?int listen(int sockfd, int backlog)man listen 可以看到关于listen 的解释The backlog argument defines the maximum length to wh原创 2014-07-18 19:00:59 · 39349 阅读 · 5 评论 -
IPVS(也叫LVS)的源码分析之persistent参数
IPVS 也叫LVS的源码分析之persistent参数原创 2014-09-04 19:04:23 · 8928 阅读 · 1 评论 -
lvs DR模式的笔记
最近在配置lvs,想用lvs做个VIP原创 2014-07-26 18:21:31 · 2767 阅读 · 0 评论 -
linux上TCP connection timeout的原因查找
最近在产线上经常出现connection timeout的问题原创 2014-07-16 17:37:44 · 39619 阅读 · 1 评论 -
jsvc 启动java 在linux下的实现原理
jsvc 是在apache的daemon项目下开源项目,主要功能可以使一些运行在普通用户下的java进程获取一些root权限下的权利,比如端口在1024下等。如何运行在自己的java代码中,实现start, init , stop,destroy的方法,将自己的编译打成jar文件, 通过调用jsvc 来启动./jsvc -java-home /usr/java/jdk1.7原创 2012-12-06 16:03:38 · 14445 阅读 · 0 评论 -
JVM源码系列: java InetAddress.getLocalHost() 在linux里实现
java 中的 InetAddress.getLocalHost() 在Inetaddress.getLocalHost()中最终调用的是Inet6AddressImpl.java(取决于你使用ipv4,还是ipv6) 中getLocalHostName的native代码最终在native代码中 JNIEXPORT jstring JNICALLJava_java_net_In...原创 2012-11-16 17:34:24 · 14441 阅读 · 0 评论 -
Linux+page+cache+里的几个函数的源码分析
page cache 在linux vfs 中是比较重要的一层,其功能就不详细介绍了。主要介绍了几个关键性函数,容易帮助了解page cache里的整体逻辑和流程先看一下page 的结构体/* * Each physical page in the system has a struct page associated with * it to keep track of whatev原创 2011-09-02 16:58:58 · 4484 阅读 · 0 评论 -
JVM源码系列:RandomAccessfile vs FileChannel 写文件
RandomAccessFile 和 FileChannel 是常用的写文件的方式,而一般都会推荐使用FileChannelImpl ,同事做了个测试,却发现FileChannelImpl写文件的性能比RandomAccessFile差。调用接口:RandomAccessFile.write(byte[] bytes)FileChannel.write(ByteBuffer src)...原创 2012-08-03 16:23:48 · 8516 阅读 · 4 评论 -
Centos Oprofile 安装过程的几个错误注意点
1. 确认oprofile 是否被编译进内核,是模块方式还是别的方式cat /boot/config-2.6.18-128.el5 |grep OPROFILE2. 配置中错误 ./configurechecking dynamic linker characteristics... GNU/Linuxld.so checking how to hardcode lib原创 2011-10-27 10:37:52 · 7761 阅读 · 3 评论 -
Linux tmpfs 源码分析(一)
Tmpfs是linux 系统中基于内存/交换分区作的文件系统,与ramdisk不同的是,ramdisk是作为块设备,基于ext的文件系统,所以不可绕过的是page cache的内存复制,具体可以参考前面写的关于ramdisk, 对tmpfs来说就是直接操作内存做为文件系统的,而不原创 2011-10-18 14:38:52 · 5128 阅读 · 0 评论 -
Linux RAMDisk 源码分析
在产品中使用了ramdisk, 看了一部分的源码,分析和共享一下。内核源码 2.6.18安装ramdiskramdisk 在linux里面被认为是个内存的块设备,通常以rm0,rm1... 挂在dev下,首先需要格式化块设备成linux的文件系统,然后在将想使用的目录mo原创 2011-08-12 15:59:21 · 2608 阅读 · 0 评论 -
Linux 2.6如何使用时间中断来完成进程调度
进程调度:Linux里的进程管理调度,如何调度使用不同的进程占用不同的时间片段,主要在核心函数 scheduler_tick (kernel/sched.c) 硬中断触发对操作系统来说,中断是一种电信号,由硬件设备产生,并直接送入中断控制器(如8259A)的输入引脚上,然后再由中原创 2011-07-19 16:37:48 · 3379 阅读 · 1 评论 -
Linux Direct IO 写文件的问题
很多的时候,在应用层中会做一些文件的cache ,那么绕开linux vfs提高读写文件的性能就显的比较重要,由于Direct IO 中操作文件有buffer地址和大小 页对齐, 那么在copy file 的时候,用direct IO,就会碰到如果文件大小不是原创 2011-07-04 21:01:20 · 3940 阅读 · 0 评论 -
x86 下的 Ptrace 的 PTRACE_GETREGS 取寄存器的值
在java里的jstack -F/-m 在打线程的堆栈的信息在linux下的实现是用ptrace 来取被跟踪的进程的寄存器的信息,而这个取的request 的类型 是用PTRACE_GETREGS。 在linux 内核里2.6.35调用的ptrace系统函数是在kernel/ptrace.c里实现的.SYSCALL_DEFINE4(ptrace, long, request, long原创 2011-06-23 16:36:00 · 7528 阅读 · 0 评论 -
自旋锁(spinlock)
<br /><br />自旋锁(spinlock)<br />自旋锁与互斥锁有点类似,只是自旋锁不会引起调用者睡眠,如果自旋锁已经被别的执行单元保持,调用者就一直循环在那里看是否该自旋锁的保持者已经释放了锁,"自旋"一词就是因此而得名。由于自旋锁使用者一般保持锁时间非常短,因此选择自旋而不是睡眠是非常必要的,自旋锁的效率远高于互斥锁。<br />信号量和读写信号量适合于保持时间较长的情况,它们会导致调用者睡眠,因此只能在进程上下文使用(_trylock的变种能够在中断上下文使用),而自旋锁适合于保持时间非常转载 2010-11-02 16:14:00 · 1654 阅读 · 0 评论 -
CentOS 上 关于 SystemTap 安装
首先运行: yum install systemtap kernel-devel yum-utils 建立debuginfo 的 repository for yuma. 在yum.repos.d下建立repo 的仓库文件 vi /etc/yum.repos.d/Debuginfo.repob. 添加[debuginfo]name=CentOS-$releasever - debuginfobaseurl=http://debuginfo.centos.org/$releasever/$basearch/p原创 2010-10-12 13:26:00 · 8612 阅读 · 0 评论 -
编译linux 内核2.6.32.16
下载linux-2.6.32.16.tar.bz2到/usr/src # wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.32.16.tar.bz2# tar -jxvf linux-2.6.32.16.tar.bz2 # cd linux-2.6.27 # make mrproper # make menuconfig # make clean # make bzImage # make modules # make modules_i转载 2010-07-13 17:19:00 · 1740 阅读 · 0 评论 -
Linux proc 的文件系统的源码分析
proc 的文件系统是linux 里面常用的基于内存的文件系统。linux的内核版本 2.6.18重要的struct:struct proc_dir_entry {unsigned int low_ino;unsigned short namelen;const char *name;mode_t mode;nlink_t nlink;uid_t uid;gid原创 2011-11-25 10:29:54 · 2911 阅读 · 0 评论 -
Java 工具(jmap,jstack)在linux上的源码分析(一)
在我们常用的Jstack, Jmap 用于分析java虚拟机的状态的工具,通过起另一个虚拟机通过运行sun.tools包下的java文件,去跟踪另一个虚拟机的状态。如果让你设计一个跟踪另一个进程的方法,你也通常会考虑这几种常用的方式。第一种,就是通知被跟踪的进程,让进程执行相应的消息,同时对该消息做出反应。第二种,就是通过内核的调用,直接能够访问进程的内存,堆栈情况,通过分析被原创 2011-11-29 14:56:06 · 6619 阅读 · 0 评论 -
Java 工具(jmap,jstack)在linux上的源码分析(三)执行的线程vm thread
在前面的博客中(http://blog.csdn.net/raintungli/article/details/7034005)所提到的信号转发线程,Attach Listener 线程都只是操作socket文件,并没有去执行比如stack 分析,或者heap的分析,真正的工作线程其实是vm thread.(一)启动vm threadjint Threads::create_vm(Java原创 2011-12-06 17:00:26 · 7640 阅读 · 0 评论 -
Java 工具(jmap,jstack)在linux上的源码分析(七) -F 参数 如何读取线程列表
在java中,如何通过访问内存拿到线程列表,用于跟踪线程的运行状态,这也是jstack的主要功能。 在jvm里,有没有F的参数实现笔者前面的博客已经说明了。因为-F是通过访问java的内存来取的信息的,所以当使用-F参数的时候,需要知道java运行过程中内存的结构,从而通过访问内存能获取到你所需要的信息。1. 结构体 VMStructEntry 和 VMTypeEntry t...原创 2012-03-10 16:25:26 · 3477 阅读 · 0 评论 -
JVM源码系列:java 中关于自定义信号在linux下的实现
在java 中调用Signal的方法handle可以去注册一个信号的处理函数,方法的如下: public static synchronized SignalHandler handle(Signal sig, SignalHandler handler) {....}比如常用的addShutdownHook钩子函数,在收到SHUTDOWN1_SIGNA...原创 2012-03-01 17:19:25 · 4776 阅读 · 0 评论 -
Java 工具(jmap,jstack)在linux上的源码分析(六) -F 参数 读取动态链接共享库文件中的符号表
通常我们使用jmap,jstack 去检查堆栈信息的时候,是不会使用-f参数的,但有的时候系统在无法打印出堆栈信息的时候,会建议你使用参数-F。关于-F参数与非-F参数的区别笔者已经在前面的博客中讲述(http://blog.csdn.net/raintungli/article/details/7023092),简单的说也就是一种是让jvm进程自己打印出堆栈信息,另有一种是直接访问jvm的堆原创 2012-02-24 14:25:53 · 3544 阅读 · 0 评论 -
Java 工具(jmap,jstack)在linux上的源码分析(五) -F 参数的bug
当使用jmap,jstack是用-F参数的时候,是通过调用系统调用ptrace来取的寄存器的信息,关于linux下的ptrace实现可以参考我的博客(http://blog.csdn.net/raintungli/article/details/6563867)在jdk6u23版本之前你会发现,当你使用jstack -F的时候 经常在logger 里面 看到错误信息,直接抛出异常,根本无法看到原创 2012-02-09 16:32:32 · 11540 阅读 · 1 评论 -
在centos上编译jdk 问题大全
为了解决博客Jstack -F 参数在低版本的问题,必须重新编译自己的jdk,按着java里面自带的build的文档,基本就傻眼了,没想到作为开源之首的java,编译自己的jdk的文档尽然如此陈旧,不得已还是自己摸石子过河吧。1. 下载源码 ,直接去oracle 的官方网站:http://download.java.net/jdk6/source/注意你要下载2个jarJDK 6u原创 2012-02-14 16:04:16 · 2762 阅读 · 1 评论 -
Java 工具(jmap,jstack)在linux上的源码分析(四)safe point
safe point 顾明思意,就是安全点,当需要jvm做一些操作的时候,需要把当前正在运行的线程进入一个安全点的状态(也可以说停止状态),这样才能做一些安全的操作,比如线程的dump,堆栈的信息。在jvm里面通常vm_thread(我们一直在谈论的做一些属于vm 份内事情的线程) 和cms_thread(内存回收的线程)做的操作,是需要将其他的线程通过调用SafepointSynchroni原创 2011-12-30 09:58:39 · 4212 阅读 · 0 评论 -
Java 工具(jmap,jstack)在linux上的源码分析(二)信号处理
当java虚拟机启动的时候,会启动很多内部的线程,这些线程主要在thread.cpp里的create_vm方法体里实现而在thread.cpp里主要起了2个线程来处理信号相关的 JvmtiExport::enter_live_phase(); // Signal Dispatcher needs to be started before VMInit event is posted原创 2011-12-02 17:00:18 · 8031 阅读 · 0 评论 -
java 中关于信号的处理在linux下的实现
linux 的线程和信号基于 NPTL 的线程库,多线程应用中的每个线程有自己独特的线程 ID,并共享同一个进程ID。应用程序可以通过调用 kill(getpid(),signo) 将信号发送到进程,如果进程中当前正在执行的线程没有阻碍此信号,则会被中断,线号处理函数会在此线程的上下文背景中执行。应用程序也可以通过调用 pthread_kill(pthread_t thread, int si原创 2012-01-06 15:18:01 · 8736 阅读 · 0 评论 -
JVM源码研读:Java 中自旋锁的实现
Java中初始是使用mutex互斥锁,因为互斥锁是会线程等待挂起,而对获取锁后的操作时间比较短暂的应用场景来说,这样的锁会让竞争锁的线程不停的park,unpark 的操作,这样的系统的调用性能是非常糟糕的,为了提高锁的性能,java 在6 默认使用了自旋锁。 在Linux中本身就已经提供了自旋锁的系统调用,在glibc-2.9中就有它的比较简单的实现方法 int pthread...原创 2011-12-28 17:44:07 · 9706 阅读 · 1 评论 -
软中断/tasklet/工作队列
软中断、tasklet和工作队列并不是Linux内核中一直存在的机制,而是由更早版本的内核中的“下半部”(bottom half)演变而来。下半部的机制实际上包括五种,但2.6版本的内核中,下半部和任务队列的函数都消失了,只剩下了前三者。本文重点在于介绍这三者之间的关系。(函数细节将不会在本文中出现,可以参考文献,点这里)(1)上半部和下半部的区别上半部指的是中断处理程序,下半部则指的是一些虽然与中断有相关性但是可以延后执行的任务。举个例子:在网络传输中,网卡接收到数据包这个事件不一定需要马上被处理,适合用转载 2010-07-12 15:26:00 · 6296 阅读 · 0 评论