- 博客(154)
- 资源 (9)
- 收藏
- 关注
原创 vim个人配置总结
ctags 1.下载:http://sourceforge.net/projects/ctags/files/ctags/5.8/ctags-5.8.tar.gz/download 2.编译:./configure -prefix /usr/local/ctags 其中-prefix指定安装目录 make、make install 3.使用:ctags -R .
2015-01-06 19:10:35
1198
原创 网络子系统87_veth实现
//使用veth //1.创建两块虚拟网卡veth1、veth2,然后点对点连接,此后两块网卡的数据会互相发送到对方 $ ip link add veth1 type veth peer name veth2 //2.创建网络命名空间t1 $ ip netns add t1 //3.将veth0加入t1,此时veth0便看不到了,因为被加入到其他命名空间中了 $ ip link set vet
2014-08-14 17:59:28
5695
原创 cgroup子系统5_cpuset子系统
cpuset子系统为cgroup中的任务分配独立CPU(在多核系统)和内存节点。cpuset_cgroup的cpus_allowed和mems_allowed定义 了该cpuset包含的cpu和内存节点,其中进程的task_struct->cpus_allowed与进程所属cpuset的cpus_allowed保持一致,在进程分配 物理页框时(alloc_pages系函数),通过cpuset_
2014-08-13 17:05:26
1698
原创 cgroup子系统4_memory子系统
memory子系统设定cgroup中任务使用的内存限制,并自动生成那些任务使用的内存资源报告。memory子系统是通过 linux的resource counter机制实现的,在进程进行内存分配、释放时对进程进行charge、uncharge操作。 charge操作进行点: 1.分配新页框时(请求调页、copy on write),在do_falut,do_anonymous_pag
2014-08-13 15:56:08
1921
原创 cgroup子系统3_freezer子系统
freezer子系统用于挂起和恢复cgroup中的进程。freezer有一个控制文件:freezer.state,将FROZEN写入该文件,可以将cgroup中的进程挂起,将THAWED写入该文件, 可以将已挂起的进程恢复。通过遍历cgroup中的进程,对其freeze或者wake_up。freeze操作通过freeze框架实现,设置进程的TIF_SIGPENDING函数(伪信号),唤醒进程,
2014-08-12 20:43:50
2659
原创 cgroup子系统2_devices子系统
devices子系统用于控制cgroup中所有进程可以访问哪些设备,通过维护黑白名单,然后在inode_permission入口点, 通过devcgroup_inode_permission函数检查进程是否可以访问该设备。 参考博客: 1.devices子系统
2014-08-12 20:16:31
2266
1
原创 cgroup子系统1_cpu子系统
cpu子系统用于控制cgroup中所有进程可以使用的cpu时间片,通过组调度(将task_group作为调度实体)来实现。 参考博客: 1.cpu子系统 2.Linux内核之CFS调度和组调度
2014-08-12 19:39:33
1222
原创 graph driver-device mapper-04libdevmapper基本操作
// 创建thin pool // 调用路径:NewDeviceSet->initDevmapper->createPool 1.1 func createPool(poolName string, dataFile, metadataFile *os.File, poolBlockSize uint32) error { //通过task封装与libdevmapper的交互 task, er
2014-07-25 14:34:59
2028
原创 graph driver-device mapper-03thin pool基本操作
// 在thin pool中创建一个新thin device // 调用路径:driver.Create() 1.1 func (devices *DeviceSet) AddDevice(hash, baseHash string) error { //查找父device baseInfo, err := devices.lookupDevice(baseHash) if err != n
2014-07-25 12:47:22
2763
原创 graph driver-device mapper-02driver基本操作
// 清除thin pool 1.1 func (d *Driver) Cleanup() error { // 停止thin pool err := d.DeviceSet.Shutdown() return err } // 当加载新镜像时,添加一个新thin device // id为containerid或imageid 1.2 func (d *Driver) Create(i
2014-07-25 11:19:39
1504
原创 graph driver-device mapper-01driver初始化
// thin device数据结构 type DevInfo struct { Hash string `json:"-"` DeviceId int `json:"device_id"` Size uint64 `json:"size"` TransactionId uint64 `json:"tran
2014-07-25 10:23:07
3044
原创 fork与exit、_exit的配合使用
#include "light.h" int main(int argc, char *argv[]) { printf("Hello world\n"); write(STDOUT_FILENO, "Ciao\n", 5); if (fork() == -1) errExit("fork"); /* Both child and parent c
2014-03-07 10:06:11
2419
原创 clock_nanosleep避免过度睡眠
/* * “oversleeping” problem is particularly marked for a process that uses a loop to re start * a sleep that is interrupted by a signal handler. If signals are delivered at a high rate * , th
2014-03-06 19:43:02
8481
1
原创 网络子系统86_inet协议族-l4向下(一)
// l4数据向下l3传递 // 步骤: // 1.如果sock->sk_write_queue为空,初始化corking // 1.1 corking信息用于帮助ip层对数据进行分片 1.1 int ip_append_data(struct sock *sk, struct flowi4 *fl4, int getfrag(void *from, char *to, int o
2014-02-28 22:13:47
1937
原创 网络子系统85_inet协议族-l3向上
// ip数据报向本地传递 // 调用路径:ip_rcv->dst_input->...->ip_local_deliver 1.1 int ip_local_deliver(struct sk_buff *skb) { //如果ip数据报被分片,则重组 if (ip_is_fragment(ip_hdr(skb))) { if (ip_defrag(skb, IP_DEFRAG_LOCA
2014-02-28 11:41:23
1629
原创 网络子系统84_sock事件通知进程
// socket初始化 // 调用路径:inet_create->sock_init_data 1.1 void sock_init_data(struct socket *sock, struct sock *sk) { ... //sock状态改变的回调函数,当sock的状态变迁(如从established到close_wait)就会调用这个函数 sk->sk_state_change
2014-02-28 11:02:07
2171
原创 网络子系统83_inet协议族-SOCK_RAW(四)
// raw sock数据就绪函数 // raw sock在raw_recvmsg中阻塞,在raw_local_deliver通过sock->sk_data_ready通知输入数据就绪 // 步骤: // 1.过滤感兴趣的事件 // 2.唤醒阻塞进程,并将进程从wq上取下 1.1 static int receiver_wake_function(wait_queue_t *wait, un
2014-02-28 10:00:43
1489
原创 网络子系统82_inet协议族-SOCK_RAW(三)
// 向raw sock传递skb // 步骤: // 1.根据协议号获取监听指定protocol的sock // 2.向raw sock传递skb 1.1 int raw_local_deliver(struct sk_buff *skb, int protocol) { int hash; struct sock *raw_sk; //获取监听指定协议的raw sock hash
2014-02-27 21:36:40
1567
原创 网络子系统81_inet协议族-SOCK_RAW(二)
// struct sock->sk_prot字段 // struct proto为插口层到传输层的接口 4.1 struct proto raw_prot = { .name = "RAW", .owner = THIS_MODULE, .close = raw_close, .destroy = raw_destroy, .connect = i
2014-02-27 17:00:10
2126
原创 网络子系统80_inet协议族-SOCK_RAW(一)
// SOCK_RAW 1.1 static struct inet_protosw inetsw_array[] = { ... { .type = SOCK_RAW, .protocol = IPPROTO_IP, /* 通配符 */ .prot = &raw_prot, /* Networking protoco
2014-02-27 16:58:35
3150
原创 网络子系统79_inet协议族
// inet协议族默认支持的协议类型 // 在inet_init中,通过inet_register_protosw注册到inetsw邻接表 1.1 static struct inet_protosw inetsw_array[] = { //流类型 { .type = SOCK_STREAM, .protocol = IPPROTO_TCP, .prot =
2014-02-27 10:36:09
1642
原创 网络子系统78_inet套接字创建
// inet协议族控制块 // 1.在inet_init中,由sock_register(&inet_family_ops)注册给系统 // 2.在sys_socket系统调用中,通过协议族号查找对应的协议控制块,然后由 // 具体协议控制块的create函数创建套接字 1.1 static const struct net_proto_family inet_family_ops
2014-02-27 10:07:40
1398
原创 网络子系统77_套接字接收
// accept系统调用 // 步骤: // 1.由内核公共部分创建一个新套接字描述符,并分配其对应的文件描述符 // 2.新套接字使用accept之上的套接字相同的套接字类型和操作 // 3.交由具体协议完成accept // 4.如果accept调用者要求返回peer地址,通过新套接字获取地址,并复制到用户地址空间 // 5.将新套接字的文件描述安装到调用者的进程控制块,返回新套接
2014-02-26 11:25:02
1426
原创 网络子系统76_套接字绑定
// 绑定套接字到地址 // 步骤: // 1.根据用户空间的文件描述符查找socket描述符 // 2.复制地址信息到内核空间 // 3.由具体的协议族完成绑定 1.1 SYSCALL_DEFINE3(bind, int, fd, struct sockaddr __user *, umyaddr, int, addrlen) { struct socket *sock; struct
2014-02-26 11:05:25
1166
原创 网络子系统75_套接字创建
// 创建套接字,系统调用sys_socket // 步骤: // 1.分配套接字描述符 // 2.创建套接字对应的文件描述符 // 参数: // 协议族: 对于TCP/IP协议族,该参数为AF_INET // 套接字类型:流套接字类型为SOCK_STREAM, 数据报套接字类型为SOCK_DGRAM // 通信协议: 单个协议系列中的不同传输协议,在internet通信域中,此
2014-02-26 10:44:45
1241
原创 内存子系统1_分配接口
1.页 struct page; 内核把物理页作为内存管理的基本单位;内存管理单元(MMU)把虚拟地址转换为物理地址, 通常以页为单位进行处理。MMU以页大小为单位来管理系统中的也表。 内核struct page管理系统中所有的页. 2.区 struct zone; Linux将内核空间地址划分为三个区:ZONE_DMA、ZONE_NORMAL和ZONE_HIG
2014-02-10 17:03:23
1327
原创 Linux驱动4_NETFILTER
#include #include #include #include #include #include #include #include #include #include // hook函数 static unsigned int hook_func(unsigned int hooknum, struct sk_buff * sk
2014-01-14 17:30:28
1133
原创 Linux驱动3_总线设备(二)
#include #include #include "simple.h" // 在虚拟总线simple bus上边添加一个设备,并添加其驱动 int probe (struct simple_device *dev) { printk(KERN_ALERT "simple_device probe.\n"); return 0; } // simple bus上的设备 struct
2014-01-08 15:14:34
1129
原创 Linux驱动2_总线设备(一)
// 参考 Linux设备驱动程序(lld3) // 实现一个简单的虚拟总线 simple bus // simple_bus_type为总线类型 // simple_bus为总线设备 // // simple.c 实现 #include "simple.h" // 增加设备引用计数 static struct simple_device *simple_dev_get(struct
2014-01-07 22:05:12
1294
原创 调度子系统8_负载均衡(五)
// 计算group在给定domain中的imbalance // 调用路径:find_busiest_group->calculate_imbalance // 函数参数: // sds:sched domain的统计信息 // this_cpu:当前正在运行load balance的cpu // imbalance:保存imbalance值 // 函数任务: // 1.计算最忙grou
2013-12-23 22:02:14
1908
原创 调度子系统7_负载均衡(四)
// 寻找sched domain中最忙的group // 函数参数: // sd:待查找的sched domain // this_cpu:当前正在对其执行负载均衡的cpu // imbalance:为达到平衡需要移动的权重 // idle:this_cpu当前的状态 // sd_idle: sd空闲状态 // cpus:可作为源cpu的集合 // balance:指示this_c
2013-12-19 22:19:58
2608
原创 调度子系统6_负载均衡(三)
// 负载均衡 // 在sched_domain中进行负载均衡,检查是否可以通过最繁忙的组中迁移一些进程到本cpu // 函数参数: // this_cpu, 其上执行负载均衡的cpu // this_rq, 其上执行负载均衡的rq // sd, 其上执行负载均衡的sched domain // idle, this_cpu的状态 // CPU_SCHED_IDLE,this_cpu
2013-12-18 16:15:41
1719
原创 调度子系统4_负载均衡(一)
// 参考:http://blog.youkuaiyun.com/dog250/article/details/5303561 // 负载均衡 // 当rq->next_balance到时,触发负载均衡 // 调用路径:scheduler_tick->trigger_load_balance // 注: // nohz.cpu_mask中的cpu表示停用了周期时钟 // 函数任务: // 1.如果进
2013-12-11 22:09:41
2476
原创 调度子系统3_周期调度器
// 周期调度器 // 调用路径:update_process_times->scheduler_tick // 函数任务: // 1.更新rq的clock // 2.更新队列负载 // 3.通知调度器类更新进程运行时间 // 4.更新下一次load balance的时间戳 // 5.触发load balance 1.1 void scheduler_tick(void) { int
2013-12-11 17:18:32
1400
原创 调度子系统2_核心调度器
// 核心调度器 // 当进程决定让出cpu时调用 // 函数任务: // 1.禁止内核抢占 // 2.获取本cpu的rq // 3.取消为当前进程运行的hrtimer // 4.获取队列锁 // 5.更新队列时钟 // 6.清除当前进程need resched标志 // 7.如果当前进程为非运行状态,并且当前非内核抢占路径 // 7.1 如果当前进程有信号待处理,设置当前进程
2013-12-10 20:04:09
1581
转载 最牛B的编码套路
转自:http://blog.youkuaiyun.com/happydeer/article/details/17023229 同样感谢我家帅帅推荐的这篇文章,同与译者共勉^-^ 最近,我大量阅读了Steve Yegge的文章。其中有一篇叫“Practicing Programming”(练习编程),写成于2005年,读后令我惊讶不已: 与你所相信的恰恰相反,单纯地每天埋头于工作并不能算是
2013-12-05 17:09:52
1136
原创 调度子系统1_调度子系统初始化
unsigned int sysctl_sched_rt_period = 1000000; int sysctl_sched_rt_runtime = 950000; // 参考: // SMP负载均衡 // http://soft.chinabyte.com/os/22/12359522.shtml // linux组调度浅析 // http://hi.baidu.com/_kouu
2013-11-29 19:55:09
2735
1
原创 时间子系统17_hard lockup机制
// 使能hard lockup探测 // 调用路径:watchdog_enable->watchdog_nmi_enable // 函数任务: // 1.初始化hard lockup检测事件 // 2.hard lockup阈值为10s // 2.向performance monitoring子系统注册hard lockup检测事件 // 3.使能hard lockup检测事件 //
2013-11-28 14:38:48
3132
Rapid Object Detection using a Boosted Cascade of Simple Features
2013-10-28
An Extended Set of Haar-like Features for Rapid Object Detection
2013-10-28
IA32&64 Architecture Programmer’s Manual Vol1-3
2013-11-07
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅