摘要: (学习的参考资料主要是《算法导论》。) 首先是红黑树的性质。一棵二叉查找树满足以下的红黑性质,则为一棵红黑树。 1)每个结点或是红的,或是黑的。 2)根结点是黑的。 3)每个叶结点(NIL)是黑的。 4)红结点的两个孩子都是黑的。 5)对任意结点,从它到其子孙结点所有路径上包含相同数目的黑结点。 初学时并不在意,但是仔细研究相关算法就会知道,算法都是围绕保持这些性质来进行的。性质5)保证了红黑树使用时的高效。定理证明了n个内结点的红黑树高度至多为2lg(n+1)。 不同于一般二叉查找树,红黑树一般采用一个哨兵结点代表NIL,这对算法的使用提供了很多方便,具体编写时可以体会的到。... 阅读全文
posted @ 2012-09-28 17:12 五岳 阅读(493) 评论(0) 推荐(0) 编辑
摘要: 实例出自Simon Hayking的《神经网络原理》多层感知器一节。 问题简单叙述如下:从0和1的重集中选择2个元素进行异或,其输入是非线性可分模式。即,不能用一条直线将(0,0)、(0,1)、(1,0)、(1,1)根据它们异或的结果用一条直线进行划分。因此,一个简单感知器不能解决XOR问题。这里使用隐藏神经元进行解决划分问题。程序比较简单,也没什么泛用性。 激活函数phi(这里使用阈值函数)、神经元neuron、权值、偏置等术语请参照原书。模拟程序如下:#include <stdio.h>#include <stdlib.h>struct neuron { int w 阅读全文
posted @ 2012-09-17 19:14 五岳 阅读(1018) 评论(0) 推荐(0) 编辑
摘要: 在这两种架构下添加系统调用的步骤是类似的,简要地比较一下,以2.6.28.6内核为例。 1.在内核源码相应位置(如sys.c或其他与这个函数联系紧密的文件)添加新的内核函数作为系统调用,形如asmlinkage long sys_foo(void) {} 2.加入系统调用表。ARM架构存放于/arch/arm/kernel/call.S中,形如CALL(sys_foo);x86架构放于/arch/x86/kernel/syscall_table_32.S中,形如.longsys_foo。 3.定义系统调用号。ARM架构存放于/arch/arm/include/asm/unistd.h... 阅读全文
posted @ 2012-08-09 10:02 五岳 阅读(1124) 评论(0) 推荐(0) 编辑
摘要: 以S3C6410为例,此时arm-none-linux-gnueabi-4.3.2已经安装完毕。 首先把和板子上烧写的内核同样的内核源码放置到任意目录下,如/usr/src/s3c-linux-2.6.28.6-Real6410。(内核源码需要配置,而板子附带CD上一般是配置好的,在上面修改简单一些) 进行make或./build。遇到了报错,找不到XX文件。查看了一下,指定目录下是有这个文件的。make clean再进行./build就行了。 在需要编译的目标代码目录下编写makefile文件,内容如下:CROSS_COMPILE:= arm-linux-ARCH:= armCC:... 阅读全文
posted @ 2012-08-07 11:40 五岳 阅读(8759) 评论(0) 推荐(1) 编辑
摘要: 需求源于项目中一部分设计的代码。struct semaphore类型的信号量,使用up()进行释放,down_interruptible()和down()获得指定信号量(前者中,若该信号量已争用则进入可中断睡眠,后者进入不可中断睡眠)。 理想中的流程应该是线程调用down()阻塞一个信号量,等待另一个线程调用up()释放,从而实现同步。但如果另一个线程使用up()释放多次,会有怎样的结果呢?LKD上没有进行详细的解释,我使用一个简单的测试程序,其中的核心代码如下:/* A线程,释放信号量 */while(!kthread_should_stop()){ up(&my_sem); ... 阅读全文
posted @ 2012-07-21 20:09 五岳 阅读(1134) 评论(0) 推荐(0) 编辑
摘要: EXPORT_SYMBOL出现于2.6内核,可以把内核中的函数导出到全局符号表供其他内核模块(包括用户自己写的内核模块)使用。有个限制是,这个导出的符号不能是static类型。由于需要使用内核的do_adjtimex()函数进行tick_length的调节,而这个函数在/kernel/time/ntp.c中,这里便以此为例。 首先需要在函数定义后加入“EXPORT_SYMBOL(do_adjtimex);”并且在这个c文件开头进行module.h头文件的包含(#include <linux/module.h>)。这时需要编译内核。 然后,在自己编写的内核模块用extern声明这个函 阅读全文
posted @ 2012-07-12 15:29 五岳 阅读(1003) 评论(0) 推荐(0) 编辑
摘要: (转载注:这篇文章对于我有很大的帮助,只看了一半就把目前手上的内核线程的问题解决了,而这个问题之前并没有找到合适的解决方法)原文地址:http://yijunzhu.diandian.com/?tag=%E5%86%85%E6%A0%B8【问题】编译Linux下面的代码,经常会遇到这种错误:undefined reference to `__udivdi3'【解决过程】之前遇到过几次了,都是类似的原因导致此问题的。后来才了解,其根本原因:嵌入式中,32位系统中(目前多数系统都是,比如ARM的片子),对于普通的a除以b(b为32位):(1)当a为32位,Linux 内核中,常用uint3 阅读全文
posted @ 2012-07-05 11:29 五岳 阅读(1448) 评论(0) 推荐(0) 编辑
摘要: 接上一篇,能正确启动内核线程,就可以进行进一步的使用了。这里介绍下更改内核线程调度策略和优先级的方法。 个人理解,内核级线程和进程是一样的,前者与POSIX线程(pthread)有很大的区别。因此,内核的进程调度策略和系统调用也适用于内核级线程。 调度策略有三种: 1.SCHED_NORMAL 非实时调度策略,默认情况下是100~139,由nice值决定; 2.SCHED_FIFO实时调度策略,先到先服务。一旦占用cpu则一直运行。一直运行直到有更高优先级任务到达或自己放弃 3.SCHED_RR实时调度策略,时间片轮转。当进程的时间片用完,系统将重新分配时间片,并置于... 阅读全文
posted @ 2012-07-04 15:54 五岳 阅读(4027) 评论(0) 推荐(0) 编辑
摘要: 启发主要来自于http://blog.csdn.net/newnewman80/article/details/7050090,基本是根据自己的习惯重组的。相关函数:kthread_create():创建内核线程struct task_struct *kthread_create(int (*threadfn)(void *data), void *data, const char namefmt[], ...); kernel thread可以用kernel_thread创建,但是在执行函数里面必须用daemonize释放资源并挂到init下,还需要用completion等待这一过程的... 阅读全文
posted @ 2012-06-28 17:39 五岳 阅读(1563) 评论(0) 推荐(0) 编辑
摘要: 原先曾以Socket编程为入口开始自己的新的学习,毕竟未曾致用,时至今日已比较生疏。借着阅读《UNIX网络编程(卷一)》(简称UNPv1)的机会,正好复习一番,而且希望将新的感受记录下来。一些技术细节翻阅原书即可,点到为止,不在这篇博文详述。 作者推荐在网络编程中使用snprintf()代替sprintf()、用fget()、strncat()和strncpy()分别代替gets()、strcat()和strcpy();同时提到了更好的替代函数strlcat()和strlcpy()。具体原因是前者的调用会使缓冲区溢出,而这是黑客网络入侵的一种方式。snprintf()需要缓冲区长度作为显... 阅读全文
posted @ 2012-06-19 20:48 五岳 阅读(1282) 评论(0) 推荐(0) 编辑
摘要: 在open、read、write的参数中,mode的接口提供的比较方便,通过对fs/namei.c中vfs_create()中添加判断,解除对高位的事后修改就能传入到文件的i_mode。然而i_mode各个位基本已被使用完毕,使用新的组合的mode可能会将这一类文件变为“古怪的文件”,虽然能用open()、read()、write()进行操作,但是不能用vi等工具打开,原因可能是没有针对这种mode添加进一步的其他操作,用起来并不像S_IFREG这种普通文件这么方便。 经指点和启发,使用这三个函数的flag位进行扩充是可行的,以下是实现方法。本文以2.6.13的内核为例。 /inclu... 阅读全文
posted @ 2012-06-04 11:44 五岳 阅读(3062) 评论(0) 推荐(0) 编辑
摘要: 来源:http://blog.chinaunix.net/uid-12567959-id-161000.htmlopen()系统调用的服务例程为sys_open()函数,该函数接收的参数为:要打开的文件的路径名filename、访问模式的一些标志flags,以及如果该文件被创建所需要的许可位掩码mode。如果该系统调用成功,就返回一个文件描述符,也就是指向文件对象的指针数组current-> files-> fd_array或者current-> files-> fdtable.fd中新分配给文件的索引;否则,返回-1。open()系统调用的所有标志---------- 阅读全文
posted @ 2012-05-24 21:06 五岳 阅读(599) 评论(0) 推荐(0) 编辑
摘要: 来源:http://blog.csdn.net/p_panyuch/article/details/5648007SYSCALL_DEFINE3 在何处定义?#define SYSCALL_DEFINE3(name, ...) SYSCALL_DEFINEx(3, _##name, __VA_ARGS__)#define SYSCALL_DEFINEx(x, sname, ...) / __SYSCALL_DEFINEx(x, sname, __VA_ARGS__)#define __SYSCALL_DEFINEx(x, name, ...) ... 阅读全文
posted @ 2012-05-22 16:04 五岳 阅读(2057) 评论(0) 推荐(0) 编辑
摘要: 转载自maypeng.cublog.cnEXPORT_SYMBOL标签内定义的函数或者符号对全部内核代码公开,不用修改内核代码就可以在您的内核模块中直接调用,即使用EXPORT_SYMBOL可以将一个函数以符号的方式导出给其他模块使用。您还可以手工修改内核源代码来导出另外的函数,用于重新编译并加载新内核后的测试。Linux symbol export method:[1] If we want export the symbol in a module, just use theEXPORT_SYMBOL(xxxx)in the C or H file. And compile the mod 阅读全文
posted @ 2012-05-21 10:55 五岳 阅读(218) 评论(0) 推荐(0) 编辑
摘要: 其实用这个标题随便baidu、Google出来都是一大堆,大部分都是转来转去,代码无非那么几种。可是真正编译通过还是费了不少功夫,我在双系统的Ubuntu10.04和虚拟机里的Red Hat9里来来回回不知折腾了多少次。所以本文更多的是记录下自己调试的细节,而不是简单的粘代码和转载。 目的是在不重新编译内核的前提下添加系统调用,思路倒是很简单,修改映射在内存中的系统调用表,把一个空闲的系统调用表项指向自己写的模块中的函数,如果是已使用的表项,甚至可以实现系统调用劫持。 分配的空闲的系统调用号依然要在源码的asm/unistd.h中去找,只是不用修改。如果没有unused的,怕是还是得重... 阅读全文
posted @ 2012-05-20 17:41 五岳 阅读(3583) 评论(0) 推荐(0) 编辑
摘要: 来源:http://hi.baidu.com/niuniu_2006923/blog/item/8cd001dda717103d5882dd34.htmlO'REILLY 写的《LINUX 设备驱动程序》中作者一再强调在编写驱动程序时必须 建立内核树。所谓内核树,我的理解和网上资料说的一致就是内核源码的一种逻辑形式。先查看自己OS使用的内核版本shana@shana:~$ uname -r2.6.22-14-generic /* 这是我显示的结果 */如果安装系统时,自动安装了源码。在 /usr/src 目录下有对应的使用的版本目录。例如下(我是自己下的)shana@shana:/us 阅读全文
posted @ 2012-05-18 10:37 五岳 阅读(208) 评论(0) 推荐(0) 编辑
摘要: 近日按照《Linux内核的设计与实现》尝试编译内核,遇到很多问题,也学到不少经验。1. 由于需要使用一个较老版本的内核,而后从别人处拷贝的tag.bz2是损坏的。原先并没有在http://www.kernel.org/看到所需要的内核,通过搜索知道较旧的内核可以从类似于http://www.kernel.org/pub/linux/kernel/v2.6/命名规则的页面下载。2. 如果已经安装Win7且磁盘系统转换为NTFS,用EasyBCD硬盘安装Win7+Ubuntu双系统不可行3. 2.6.13内核需要2.95.3版本的gcc4. 练习内核编译时,可以使用比系统自带内核稍微新一些... 阅读全文
posted @ 2012-05-07 09:35 五岳 阅读(1115) 评论(1) 推荐(0) 编辑
摘要: 原文链接:http://blog.csdn.net/ljx0305/article/details/4065058epoll - I/O event notification facility在linux的网络编程中,很长的时间都在使用select来做事件触发。在linux新的内核中,有了一种替换它的机制,就是epoll。相比于select,epoll最大的好处在于它不会随着监听fd数目的增长而降低效率。因为在内核中的select实现中,它是采用轮询来处理的,轮询的fd数目越多,自然耗时越多。并且,在linux/posix_types.h头文件有这样的声明:#define __FD_SETSI 阅读全文
posted @ 2012-05-02 13:03 五岳 阅读(153) 评论(0) 推荐(0) 编辑
摘要: select提供的轮询会随着fd数目的增长降低效率,并且其上限是系统定义过的。UNP上select的例子需要编程者自己维护一个fd使用情况的结构,很抽象繁琐。后面的poll的例子和本文提到的epoll使用方法差不多,这是因为高级polling技术没有标准,各个操纵系统的实现不一样,而epoll是由Linux提供的,是对poll的改进。个人感觉区别在于epoll对缓冲池的维护(事件的加入和维护)更简单。 通过对一篇文章(http://blog.csdn.net/ljx0305/article/details/4065058,已转载至“文章”一栏)的学习,笔者试着修改了并调试通过了C语言版的... 阅读全文
posted @ 2012-05-02 11:38 五岳 阅读(3617) 评论(0) 推荐(1) 编辑
摘要: 原文:http://www.sandihouse.com/2011-11-17/linux-interupt作者SandiHouse 软件中断:从字面上理解就是由软件、即指令触发的中断,也就是上面提到的由CPU的内部逻辑,比如特定的中断指令、除数为0的除法指令等产生的中断。在x86体系结构规范中,将这样在某一条指令执行完毕后才会产生的中断定义为“同步中断”,也可称之为“异常”。 软中断:原始表述为“softirq",是Linux中断处理机制的一个组成部分。简单地说就是中断产生后(包括硬件中断与软件中断),CPU会执行一段固定的逻辑,这段逻辑的结果就是准备好一些参数并最终跳转到操作系统 阅读全文
posted @ 2012-04-20 09:29 五岳 阅读(1319) 评论(0) 推荐(0) 编辑
摘要: 原文:http://blog.csdn.net/wd4084/article/details/6452574最近在学习Unix网络编程(UNP),书中steven在处理网络编程时只用了一个#include “unp.h” 相当有个性并且也很便捷于是我把第三版的源代码编译实现了这个过程,算是一种个性化的开发环境的搭建吧,顺便把过程记录下来,以便自己以后查阅。首先去网上找到源代码包unpv.13e.tar.gz 一找一大堆解压缩到你的某个目录,unpv13e里面大致有这些目录├── aclocal.m4├── advio├── bcast├── config.guess├── config.h├─ 阅读全文
posted @ 2012-04-18 20:36 五岳 阅读(1752) 评论(1) 推荐(0) 编辑
摘要: 笔者编码经验比较少,union只知概念,几乎没用过。昨日看到在UNP上一个示例程序如下判断系统使用大端还是小端1 #include "stdio.h" 2 int 3 main(int argc, char **argv) 4 { 5 union { 6 short s; 7 char c[sizeof(short)]; 8 } un; 9 un.s = 0x0102;10 printf("%s: ", CPU_VENDOR_OS);11 if (sizeof(short) == 2) {12 ... 阅读全文
posted @ 2012-04-13 09:41 五岳 阅读(307) 评论(0) 推荐(0) 编辑
摘要: 以前在课堂上学习过《Unix初级教程(第四版)》,对于Unix有了一点了解。由于以后使用的需要,要对它进行比较深入的学习,为此需要阅读不少的书籍,这本《Unix环境高级编程》便在此列。希望能通过这本书了解Linux的API,并在这个过程中了解Linux系统的机制。书中内容丰富,有以前了解的,更多的是不了解的。作为第一次阅读,目的不在于事无巨细,过目不忘,而是有个大体了解,从点到面地熟悉这个系统。为了构建整体的印象,对已知的和刚刚了解的都有所涉及。同时作为笔记,不希望成为对目录的简单复制,而是能成为对学习的程度和体会的记录。第一章 基础知识 这一章本身就是概括,略。 旧知: 体系结构、... 阅读全文
posted @ 2012-04-11 20:50 五岳 阅读(2849) 评论(0) 推荐(0) 编辑
摘要: (这篇文章网络上转载来转载去,我也搞不清原作者是谁。只贴了一部分)本函数影响由fd参数引用的一个打开的文件。#include<unistd.h>int ioctl( int fd, int request, .../* void *arg */ );返回0:成功 -1:出错第三个参数总是一个指针,但指针的类型依赖于request参数。我们可以把和网络相关的请求划分为6类:套接口操作文件操作接口操作ARP高速缓存操作路由表操作流系统下表列出了网络相关ioctl请求的request参数以及arg地址必须指向的数据类型:类别Request说明数据类型套接口SIOCATMARKSIOCSP 阅读全文
posted @ 2012-04-10 11:40 五岳 阅读(681) 评论(0) 推荐(0) 编辑
摘要: 有了之前的基础,此文只是把一些以前没有注意到的和值得学习的知识做一个记录。第一章 作者认为使用#if 0 .... #endif比用/*和*/好,因为后者不能嵌套。但是对于//并没有说明。第二章 三字母词,用两个问号加一个符号表示另一个符号,比较类似于转义字符。查阅了一些资料,它的使用与编译器有关,了解即可,防止字符串常量被错误的解释。??( ==> [ ??< ==> { ??= ==> #??) ==> ] ??> ==> } ??/ ==> \??! ==> | ??' ==> ^ ??- ==> ~ 对于嵌套较深 阅读全文
posted @ 2012-01-11 21:21 五岳 阅读(607) 评论(4) 推荐(0) 编辑
回到顶部