module_init/module_exit分别用于指定模块的加载和卸载函数。
加载模块(insmod)时,会调用mytimer_init函数。这个函数设置一个定时器,在定时器超时时执行myfunc函数,指定函数参数为“Hello,world!”。
myfunc执行时,会输出“Hello,world!”,mod_timer函数会将定时器重新计时,两秒后到期。
因此整个代码执行起来后的现象就是每两秒输出一次Hello,world!
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结构进行 *** 作。
有的。具体步骤:
1、默认情况下系统节拍率选择100Hz。
2、设置好后在Linux内核源码根目录下的config文件中可见系统节拍率被设置为100Hz。
3、Linux内核会使用CONFIGHZ来设置自己的系统时钟,文件includeasmgenericparamh。
Linux内核使用全局变量jiffies来记录系统从启动以来的系统节拍数,系统启动的时候会将jiffies。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)