06 2012 档案

摘要:针对相应设备定义描述该PCI设备的数据结构:struct device_private{ /*注册字符驱动和发现PCI设备的时候使用*/ struct pci_dev *my_pdev;// struct cdev my_cdev;// dev_t my_dev; atomic_t created; /* 用于获取PCI设备配置空间的基本信息 */ unsigned long mmio_addr; unsigned long regs_len; int irq;//中断号 /*用于保存分配给PC... 阅读全文
posted @ 2012-06-30 22:10 KingsLanding 阅读(14242) 评论(1) 推荐(0) 编辑
摘要:Linux将所有外部设备看成是一类特殊文件,称之为“设备文件”,如果说系统调用是Linux内核和应用程序之间的接口,那么设备驱动程序则可以看成是 Linux内核与外部设备之间的接口。设备驱动程序向应用程序屏蔽了硬件在实现上的细节,使得应用程序可以像操作普通文件一样来操作外部设备。1. 字符设备和块设备Linux抽象了对硬件的处理,所有的硬件设备都可以像普通文件一样来看待:它们可以使用和操作文件相同的、标准的系统调用接口来完成打开、关闭、读写和 I/O控制操作,而驱动程序的主要任务也就是要实现这些系统调用函数。Linux系统中的所有硬件设备都使用一个特殊的设备文件来表示,例如,系统中的第 一个I 阅读全文
posted @ 2012-06-30 22:04 KingsLanding 阅读(6522) 评论(0) 推荐(0) 编辑
摘要:游程编码是对数据压缩的一种方式,这写了一个简单的二值游程编码程序,程序功能如:原始输入:0001110011010100001100 ,压缩之后输出:33221111422也就是相当于记录每个值连续出现的次数,作为编码值。#include <iostream>#include <string>#include <vector>#include <queue>#include <iterator>using namespace std;int main(){ string str("0001110011010100001100 阅读全文
posted @ 2012-06-27 22:28 KingsLanding 阅读(1587) 评论(0) 推荐(0) 编辑
摘要:最近C++程序写的比较少,需要平时多写才行啊。写了一个大整数运算的程序。#include <iostream>#include <vector>#include <cstring>#include <algorithm>#include <ostream>using namespace std;typedef vector<int>::iterator Iter;class bign{ public: bign() { num.clear(); } bign(int n) { ... 阅读全文
posted @ 2012-06-27 21:37 KingsLanding 阅读(3635) 评论(0) 推荐(0) 编辑
摘要:CONST:the C++ compiler avoids creating storage for a const, but instead holds the definition in its symbol table. When you use extern with const, however, you force storage to be allocated .const modified value cannot be used at compile time because the compiler is not required to know the contents 阅读全文
posted @ 2012-06-25 19:29 KingsLanding 阅读(874) 评论(0) 推荐(0) 编辑
摘要:图的m-着色判定问题——给定无向连通图G和m种不同的颜色。用这些颜色为图G的各顶点着色,每个顶点着一种颜色,是否有一种着色法使G中任意相邻的2个顶点着不同颜色?图的m-着色优化问题——若一个图最少需要m种颜色才能使图中任意相邻的2个顶点着不同颜色,则称这个数m为该图的色数。求一个图的最小色数m的问题称为m-着色优化问题。算法思路:color[n]存储n个顶点的着色方案,可以选择的颜色为1到mt=1对当前第t个顶点开始着色:若t>n则已求得一个解,输出着色方案即可否则,依次对顶点t着色1到m, 若t与所有其它相邻顶点无颜色冲突,则继续为下一顶点着色;否则,回溯,测试下一颜色。/*===== 阅读全文
posted @ 2012-06-20 23:01 KingsLanding 阅读(943) 评论(0) 推荐(0) 编辑
摘要:这里介绍的马尔科夫链算法实现的功能是:读入一段英文文本,构造出由这个文本中语言使用情况而形成的统计模型,然后根据统计模型随机输出另一段文本。 马尔科夫链算法的基本思想是:将输入想象成一些相互重叠的短语构成的序列,把每个短语分割为两个部分:一部分是由多个词构成的前缀,另一部分是只包含一个词的后缀。马尔科夫链算法能够生成输出短语的序列,其方法是依据原文本的统计性质,随机地选择跟在前缀后面的特定后缀。采用三个词的短语就能够很好工作,这三个词中前两个词构成前缀来选择作为后缀的一个词设置:w1和w2为文本的前两个词输出w1和w2循环: 随机地选出w3,它是文本中w1w2的后缀中的一个 打印w3 把w.. 阅读全文
posted @ 2012-06-18 22:27 KingsLanding 阅读(10512) 评论(0) 推荐(1) 编辑
摘要:使用gvim在windows环境下搭建简单的IDE环境可以参见:http://my.oschina.net/u/146511/blog/50717该文章讲的很详细,而且给出了各种辅助插件的下载链接。这里主要讲如何在gvim环境下通过快捷键编译程序。如果需要编译C/C++程序,首先将微软的cl 编译器 加入到环境变量中,也就是说在cmd 模式下能够使用cl。这里就首先来讲一下如何将 cl 加入到环境变量中。如果是使用VS2010及更低版本需要这样做:我的电脑->属性->高级系统设置->环境变量新建:INCLUDE 、LIB、PATH 三个变量,填入下面的值:假设我的VS2010 阅读全文
posted @ 2012-06-16 22:56 KingsLanding 阅读(9729) 评论(0) 推荐(0) 编辑
摘要:这里主要实现两个线程间通信,当flag = 10 之后通知另外一个线程(也就是“Linux内核多线程(二)”中的程序的各种平台实现)。首先是C++ 11 的方式:#include <thread>#include <iostream>#include <mutex>#include <queue>#include <condition_variable>#include <atomic>using namespace std;const int M = 10;int main(){ mutex lockBuffer; in 阅读全文
posted @ 2012-06-14 23:05 KingsLanding 阅读(2566) 评论(0) 推荐(0) 编辑
摘要:自己创建的内核线程,当把模块加载到内核之后,可以通过:ps –ef 命令来查看线程运行的情况。通过该命令可以看到该线程的pid和ppid等。也可以通过使用kill –s 9 pid 来杀死对应pid的线程。如果要支持kill命令自己创建的线程里面需要能接受kill信号。这里我们就来举一个例,支持kill命令,同时rmmod的时候也能杀死线程。#include <linux/kernel.h>#include <linux/module.h>#include <linux/init.h>#include <linux/param.h>#includ 阅读全文
posted @ 2012-06-13 21:12 KingsLanding 阅读(6254) 评论(0) 推荐(0) 编辑
摘要:接上 一篇文章,这里介绍另一种线程间通信的方式:completion机制。Completion机制是线程间通信的一种轻量级机制:允许一个线程告诉另一个线程工作已经完成。为使用 completion, 需要包含头文件 <linux/completion.h>。可以通过以下方式来创建一个 completion :DECLARE_COMPLETION(my_completion);或者, 动态创建和初始化:struct completion my_completion;init_completion(&my_completion);等待 completion 是一个简单事来调用: 阅读全文
posted @ 2012-06-13 20:49 KingsLanding 阅读(5734) 评论(0) 推荐(0) 编辑
摘要:内核多线程是在项目中使用到,自己也不熟悉,遇到一个很囧的问题,导致cpu运行100%。这是写的第一个内核线程程序,通过全局变量来实现两个内核线程之间的通信。但是这里遇到致命错误,就是:每当 wait_event_interruptible()被wake_up_interruptible 唤醒之后线程就进入死循环。后面发现是线程不会主动的自己调度,需要显式的通过schedule 或者 schedule_timeout()来调度。如果不加tc = 0 这一行,wait_event_intrruptible()就一直不会睡眠(参见前面的文章“等待队列”),不会被调度放弃CPU,因此进入死循环。这个过 阅读全文
posted @ 2012-06-11 23:34 KingsLanding 阅读(7821) 评论(1) 推荐(0) 编辑
摘要:Linux内核可以看作一个服务进程(管理软硬件资源,响应用户进程的种种合理以及不合理的请求)。内核需要多个执行流并行,为了防止可能的阻塞,支持多线程是必要的。内核线程就是内核的分身,一个分身可以处理一件特定事情。内核线程的调度由内核负责,一个内核线程处于阻塞状态时不影响其他的内核线程,因为其是调度的基本单位。这与用户线程是不一样的。因为内核线程只运行在内核态,因此,它只能使用大于PAGE_OFFSET(3G)的地址空间。内核线程和普通的进程间的区别在于内核线程没有独立的地址空间,mm指针被设置为NULL;它只在 内核空间运行,从来不切换到用户空间去;并且和普通进程一样,可以被调度,也可以被抢占 阅读全文
posted @ 2012-06-11 22:17 KingsLanding 阅读(36152) 评论(0) 推荐(1) 编辑
摘要:import urllibimport urllib2import cookielibimport jsonimport reimport getpassclass Login_kp: def __init__(self): cj = cookielib.CookieJar() self.opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj)) urllib2.install_opener(self.opener) self.opener.addheaders = ... 阅读全文
posted @ 2012-06-09 21:35 KingsLanding 阅读(1003) 评论(0) 推荐(0) 编辑
摘要:通过 前一篇文章的介绍我们队等待队列有了一个比较具体的认识,本文将来分析一下等待队列是如何睡眠一个进程和如何唤醒一个进程的。使用等待队列前通常先定义一个等待队列头:static wait_queue_head_t wq ,然后调用wait_event_*函数将等待某条件condition的当前进程插入到等待队列wq中并睡眠,一直等到condition条件满足后,内核再将睡眠在等待队列wq上的某一进程或所有进程唤醒。这里我们来分析一下唤醒的过程,举比较常用的wait_event_interruptible来分析:/** * wait_event_interruptible - sleep unt 阅读全文
posted @ 2012-06-09 10:23 KingsLanding 阅读(6905) 评论(2) 推荐(4) 编辑
摘要:在Linux内核中等待队列有很多用途,可用于中断处理、进程同步及定时。我们在这里只说,进程经常必须等待某些事件的发生。等待队列实现了在事件上的条件等待: 希望等待特定事件的进程把自己放进合适的等待队列,并放弃控制全。因此,等待队列表示一组睡眠的进程,当某一条件为真时,由内核唤醒它们。等待队列由循环链表实现,其元素包括指向进程描述符的指针。每个等待队列都有一个等待队列头(wait queue head),等待队列头是一个类型为wait_queue_head_t的数据结构(1)定义等待队列头(相关内容可以在linux/include/wait.h中找到)等待队列头结构体的定义:struct __w 阅读全文
posted @ 2012-06-09 10:16 KingsLanding 阅读(15769) 评论(2) 推荐(7) 编辑
摘要:指针的运算和普通的算术运算是不同的,支持的运算符也很少,有时候你把两个指针相减得到的结果可能会不如你所想。今天来稍微总结一下:1.指针的有限算术运算:自增(++), 自减(--), 加上一个整数(+, +=), 减去一个整数(-, -=), 以及减去另一个指针2.指针加上或减去一个整数时,并非简单地加上或减去该整数值,而是加上该整数与指针引用的对象的大小的乘积。对象的大小(字节数)取决于对象的数据类型。3.对于x=p1-p2,是把从p2到p1的数组元素的个数赋给x。因为除了数组元素外,我们不能认为两个相同类型的变量是在内存中连续存储的,所以指针算术运算除了用于数组外没有什么意义。两个指针相减的 阅读全文
posted @ 2012-06-06 23:07 KingsLanding 阅读(1185) 评论(0) 推荐(0) 编辑
摘要:下面列举了一些常见的宏写法:#include <stdio.h>#include <stdlib.h>#define byte char#define word short//得到指定地址上的一个字节或字#define MEM_B( x ) ( *( (byte *) (x) ) )#define MEM_WORD( x ) ( *( (int *) (x) ))//得到一个field在结构体(struct)中的偏移量#define FPOS(type,member) ((size_t) &((type *)0 )->member)//得到一个结构体中fi 阅读全文
posted @ 2012-06-05 22:32 KingsLanding 阅读(6779) 评论(0) 推荐(1) 编辑
摘要:前一篇文章讨论了list_head 结构的基本结构和实现原理,本文主要介绍一下实例代码。自己如果想在应用程序中使用list_head 的相应操作(当然应该没人使用了,C++ STL提供了list 用起来貌似更方便), 在应用程序中需要包含自己的 "list.h" 头文件:/*注:这个list.h 是为了配合示例程序而建的,内容来自:linux/include/linux/list.h 和相关文件*/#ifndef _LINUX_LIST_H#define _LINUX_LIST_H struct list_head { struct list_head *next, *pr 阅读全文
posted @ 2012-06-02 21:52 KingsLanding 阅读(11084) 评论(0) 推荐(1) 编辑
摘要:在Linux内核中,提供了一个用来创建双向循环链表的结构 list_head。虽然linux内核是用C语言写的,但是list_head的引入,使得内核数据结构也可以拥有面向对象的特性,通过使用操作list_head 的通用接口很容易实现代码的重用,有点类似于C++的继承机制(希望有机会写篇文章研究一下C语言的面向对象机制)。下面就是kernel中的list_head结构定义:struct list_head { struct list_head *next, *prev;};#define LIST_HEAD_INIT(name) { &(name), &(name) }需要注 阅读全文
posted @ 2012-06-02 21:25 KingsLanding 阅读(32477) 评论(1) 推荐(6) 编辑

点击右上角即可分享
微信分享提示