- 浏览: 76515 次
- 性别:
- 来自: 苏州
-
最新评论
文章列表
了解分布式存储的朋友 一定知道 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 ...