`
sunzixun
  • 浏览: 74790 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论
文章列表
   了解分布式存储的朋友 一定知道 lvm2 , PV LV VG等 ,简单看看lvm2是如何和内核交互的,为下一步开发自己的lvm 做准备     首先看 lvcreate 的调用走向  希望你自己摸索过lvm 也熟悉vfs ,fs子系统 ,这样可以一看就知道什么意思,然后大家一起交流。   lvm: dev_manager.c     /* * Add LV and any known dependencies */ static int _add_lv_to_dtree(struct dev_manager *dm, struct dm_tree *dtr ...
  假期结束, 根据上次讲的 ip_local_deliver int ip_local_deliver(struct sk_buff *skb) { if (ip_hdr(skb)->frag_off & htons(IP_MF | IP_OFFSET)) { if (ip_defrag(skb, IP_DEFRAG_LOCAL_DELIVER))/*还原包*/ return 0; } return NF_HOOK(NFPROTO_IPV4, NF_INET_LOCAL_IN, skb ...
  先来回顾一个潜在的结构 在skb的 pskb_copy, skb_copy  等操作中起到了关键作用    写道 struct skb_shared_info { unsigned short nr_frags; unsigned short gso_size; /* Warning: this field is not always filled in (UFO)! */ unsigned short gso_segs; unsigned short gso_type; __be32 ip6_frag_id; __u8 tx_flags; struct sk_ ...
  __netif_receive_skb 是一个很关键的函数 ,可以看成L2-L3 的分水岭(如果该协议需要到L3的话)   net_rx_action 做完了之后基本上    struct sk_buff {         //... ... ...         unsigned short  protocol;        // ... ... ...
  这个函数在2.6.35之后改动还是很大的      先回顾几个和 可调文件系统有关的 变量,下面的代码里面要提到用处   netdev_max_backlog ------------------   Maximum number  of  packets,  queued  on  the  INPUT  side, when the interf ...
  书中 很多 地方 新的内核 除了壳子 都面目全非了, 研究内核就是痛苦终身的事情  。如果你订阅了mail list  那你肯定坚持不了一个月就 unsubscribe了  。     上层 recv send 二十年如一日 的调用  kernel 里面早就翻天覆地了 ...
  现在开始看看这个大家认为最应该阻塞的函数  , 从现在开始呢 我会通过源码分析一些 大家对 epoll 模糊的地方   SYSCALL_DEFINE4(epoll_wait, int, epfd, struct epoll_event __user *, events, int, maxevents, int, timeout) { int error; struct file *file; struct eventpoll *ep;   /* 这个最大值 你不用担心 , 你永远也不会有这个多连接 , 
  下面来看看 epoll 的操作函数  epoll_ctl    SYSCALL_DEFINE4(epoll_ctl, int, epfd, int, op, int, fd, struct epoll_event __user *, event) { int error; struct file *file, *tfile; struct eventpoll *ep; struct epitem *epi; struct epoll_event epds; error = -EFAULT; /*很简单 如果有事件过来了, 首先把用户空间的 struc ...
首先介绍一下Epoll 主要需要3个级别的锁    * 1) epmutex   互斥锁mutex  * 2) ep->mtx   互斥锁mutex  * 3) ep->lock   自旋锁spinlock   需要的顺序是从1-3 .    1 ) 需要自旋锁 : 是因为我们掌管着 poll 回调方法内部的资源 , 这些资源的触发可能发生在中断上下文 的wake_up 中 所以呢我们不能再poll 回调方法里面睡眠 因此自旋吧
之后会把nginx使用的简单epoll skeleton  总结一下        // epoll检测到 EPOLLIN 调用之前注册的 ngx_connection_t r结构体指针 1:         ngx_epoll_module.c :            rev->handler(rev);   //开始处理http请求 2:          ng ...
  在我想办法弄懂supermirco 服务用的Super IO w83795的驱动的时候 ,我不幸又陷入了mutex_lock :   具体的设计文档见 document/mutex-design. 我这里只是摘录演义~   故事开始:   "为什么在这个地球上 ,我们需要一个新的mutex 子系统 ,   原来的semaphore怎了么他不行了吗 "      让我来帮大家怀恋一下他吧 struct semaphore { spinlock_t lock; unsigned int count; struct list_head w ...
记得去年的一个 enhance FTP 的项目里, 有一个需求是要求   “针对每个IP进行限速 k ,然后对来自这个区域的所有IP 也要限速 K ”    因为应用是多线程多进程的。 就用了一个比较搞笑的方法 我叫他为《水桶法》   准备工作是创建一个消息队列 ,赶项目 就用了Posix的  1 每个连接都对应一个 con_id(独一无二)  2 每次该con_id收满 M 字节 就往队列中插入一个 segment,    里面优先级是con_id buf 就是当前的时间戳 struct msgbuf{ long con_id; char time_stamp ...
今天在看ldd网卡驱动的时候,发现一个有趣的函数 printk_ratelimit()    他的主要做用和 prco文件系统下的,这两个接口有关系 printk_ratelimit 定义了消息之间允许的最小时间间隔。 printk_ratelimit_burst 定义消息数量     于是我机器上显示的就是 5s 内最多10条。   只是一个非常有意义的函数。 我们知道 ldd3 写道 hundreds or thousands of console messages per second is a good way to bog down the system enti ...
当然首先还是说 一下,好像在RISC 思想中, 使用 原子交换好像并不能让 CPU在处理流程上变得更快更高效.  反而浪费了CPU的处理能力, 下面是转载 ===================================================================  但是随着计算机硬件的快速发展,获得这种锁的开销相对于CPU的速度在成倍地增加,原因很简单,CPU的速度与访问内存的速度差距越来越大,而这种锁使用了原子操作指令,它需要原子地访问内存,也就说获得锁的开销与访存速度相关,另外在大部分非x86架构上获取锁使用了内存栅(Memory Barrier),这会导 ...
  1.1 gdb 1) info registers   : 显示所有寄存器的值   2 )print : 打印特定寄存器 (gdb) p $edi   print/d 显示 10进制 print/t  显示 2进制 print/x 显示 16进制   3) x 显示特定内存的位置 值 x/ABC A : 个数 B : c 字符  d 同上 C : b 字节 ; h 字 ;w ;双字   (gdb) x/16cb &mystr   4) 从开始点 (gdb) b *_start 1.2 as 命令 as -o xxx.o xxx.s ...
Global site tag (gtag.js) - Google Analytics