linux源码分析

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux源码分析相关的知识,希望对你有一定的参考价值。

linux多任务策略大体是:先将定时器设定十毫秒周期,定时器反复向处理器中断,每次由中断服务程序调用调度程进行任切挽。不解的是:由于x86的特征是每次调用前都会压栈当前处理器状态,用于返回。显然调度程序是由定时器中断服务重复调用的,并不需要返回。那么就必须任务切换前丢弃这些栈,但源代码中并没有丢弃栈的代码,这样一来随着切换次数增多,系统内存会被这些无用的信息占满。是否有高手明白?linux又是怎样解决这种问题。我的邮箱:huwenjuan2@163.com

linux的tcp-ip栈代码的详细分析

1.数据结构(msghdr,sk_buff,socket,sock,proto_ops,proto)

bsd套接字层,操作的对象是socket,数据存放在msghdr这样的数据结构:

创建socket需要传递family,type,protocol三个参数,创建socket其实就是创建一个socket实例,然后创建一个文件描述符结构,并且互相建立一些关联,即建立互相连接的指针,并且初始化这些对文件的写读操作映射到socket的read,write函数上来。

同时初始化socket的操作函数(proto_ops结构),如果传入的type参数是STREAM类型,那么就初始化为SOCKET->ops为inet_stream_ops,如果是DGRAM类型,则SOCKET-ops为inet_dgram_ops。对于inet_stream_ops其实是一个结构体,包含了stream类型的socket操作的一些入口函数,在这些函数里主要做的是对socket进行相关的操作,同时通过调用下面提到的sock中的相关操作完成socket到sock层的传递。比如在inet_stream_ops里有个inet_release的操作,这个操作除了释放socket的类型空间操作外,还通过调用socket连接的sock的close操作,对于stream类型来说,即tcp_close来关闭sock

释放sock。

创建socket同时还创建sock数据空间,初始化sock,初始化过程主要做的事情是初始化三个队列,receive_queue(接收到的数据包sk_buff链表队列),send_queue(需要发送数据包的sk_buff链表队列),backlog_queue(主要用于tcp中三次握手成功的那些数据包,自己猜的),根据family、type参数,初始化sock的操作,比如对于family为inet类型的,type为stream类型的,sock->proto初始化为tcp_prot.其中包括stream类型的协议sock操作对应的入口函数。

在一端对socket进行write的过程中,首先会把要write的字符串缓冲区整理成msghdr的数据结构形式(参见linux内核2.4版源代码分析大全),然后调用sock_sendmsg把msghdr的数据传送至inet层,对于msghdr结构中数据区中的每个数据包,创建sk_buff结构,填充数据,挂至发送队列。一层层往下层协议传递。一下每层协议不再对数据进行拷贝。而是对sk_buff结构进行操作。

参考资料:http://networking.ctocio.com.cn/tips/91/9385591.shtml

参考技术A 这是汇编语言
。。。
ESP是堆栈指针寄存器
EBX是基址寄存器
ECX一般用来当作计数器
引用寄存器要在寄存器号前加%
。。。

linux kvm源码分析

技术图片

这个kvm源码不知道该如何下手,按照右侧的ioctl进行分析:

ioctl(fd , KVM_CREAT_VM, 0) 创建内核虚拟机相关数据结构.

未完..................

 

以上是关于linux源码分析的主要内容,如果未能解决你的问题,请参考以下文章

转:《Linux设备驱动程序3》源码目录结构和源码分析经典链接

Linux内核源码分析

linux kvm源码分析

Linux系统移植:内核源码目录分析

Linux 内核源码分析 -- getuid, geteuid

Linux 内核源码分析 -- getuid, geteuid