- 博客(404)
- 资源 (4)
- 收藏
- 关注
原创 Linux内核中文邮件列表的一个讨论
问题: 听了太多次大师的训诫:UNIX是如何如何的简约,如何如何的精致。以至于,几乎都快忘了这个通俗的道理:任何事物都会有它的生命期。我想,UNIX类操作系统应该也是一样。一个事物的腐烂,应该是从其最脆弱的地方开始吧?!那么,现代UNIX都有什么缺点呢?单从内核技术角度上有哪些呢?我想自己没有体会到显著缺点的最大原因是身在此山中且道行不深。 网友答复:...另外,现代OS对从嵌入式、移动、大型多
2010-02-09 22:37:00 5846 2
原创 对问题“为什么执行softirq时不能被抢占?”的解答
1.首先,在irq_exit中调用do_softirq前已经退掉了preempt_count中的HARDIRQ_MASK,因此softirq此时如果不在preempt_count加上SOFTIRQ_MASK位还是会被抢占的,我们看到softirq是在硬件中断后执行的,因此如果硬件中断是任意上下文的话那么softirq也是任意上下文,我们知道任意上下文下的睡眠或者调度会使得被中断的进程不确定而且对被
2010-02-09 22:36:00 5348
原创 对一个问题的解答
今天周日,陪老婆烫完头发回到家里,仍然不忘打开邮箱,一位朋友问了一个问题,说想用sysfs实现cdev,我觉得倒是没有什么不可,因为sysfs毕竟是一个内核和用户空间通信的接口,是个接口就可以被使用,我之所以敢打这个保票就是因为linux内核只提供机制而不提供任何策略,也就是说,只要你知道一个机制是内核和用户空间通信用的,那么你可以进行任何通信,内核机制丝毫不管你通信的内容,其实sysfs是向用户
2010-02-09 22:36:00 3784
原创 linux共享内存的设计
posix的共享内存是通过用户空间挂在的tmpfs文件系统实现的,而system V的共享内存是由内核本身的tmpfs实现的,这里可以看出,二者其实是用同一种机制实现的,不同的是用户接口不同,posix旨在提供一套统一的可用接口而不是实现,因此posix的上层根本就不会在意其机制是内核实现的还是用户空间实现的,因此用文件系统实现再好不过了,在linux上它实际上是通过用户空间挂载的tmpfs实现,
2010-02-09 22:35:00 7355
原创 NULL指针引起的一个linux内核漏洞
NULL指针一般都是应用于有效性检测的,其实这里面有一个约定俗成的规则,就是说无效指针并不一定是 NULL,只是为了简单起见,规则约定只要指针无效了就将之设置为NULL,结果就是NULL这个指针被用来检测指针有效性,于是它就不能用作其它了,而实际上NULL就是0,代表了数值编号为0的一个内存地址,抛开那个约定,它和别的addr没有任何区别,简单的说,完全可以选择一个其它的地址作为指针有效性检测,比
2010-02-09 22:35:00 5080 3
原创 linux内核的反复--一切都是过程
1. ZERO_PAGE 2.6.24内核中剔除了ZERO_PAGE这个鸡肋,然而近期又准备添加近来,这样做的原因还是在于当初它为何被当成了鸡肋,当成鸡肋的原因就是当zero页面加入反向映射的时候会更新其page结构体的引用计数,从而造成了固定cacheline的冲刷,仅仅这一点就将zero页面当成了鸡肋未免也太残酷了吧,所以2.6.32内核着手寻找更好的方法,为zero页面平反,也就是尽力去除
2010-02-09 22:35:00 5761
原创 TCP校验值的伪头以及校验值计算
tcp层的校验值难道还需要ip层的元数据也就是ip头吗?如果一切都是理想的显然不需要,因为这违背了分层隔离的原则,下层一定不能依赖上层,但是上层可以访问下层,还好tcp使用ip信息正是这一点。按照封包原则,封装到TCP层的时候,ip信息还没有封装上去,但是校验值却需要马上进行计算,所以必须手工构造一个伪头部来表示ip层的信息,怎么构造呢?在数据到tcp层的时候其实用户肯定知道数据发往何处,源地址和
2010-02-09 22:34:00 7754 5
原创 内核中实现负载均衡
在《实现一个简单的反向NAT并引申一个web请求内容过滤》中提到了一个内核nat的实现方式,如果nat可以用iptables实现而没有必要修改内核的话,那么负载均衡将是netfilter所不能做到的,虽然netfilter的灵活性足以让人们对它进行简单的修改就可以实现,但是修改内核(不使用netfilter)可以提高对内核的认识,并且策略更加灵活,netfilter毕竟是一个通用框架。实现很简单,
2010-02-09 22:34:00 3681
原创 TCP的syn-cookie以及SHA1摘要算法的实现
linux内核中实现了syn-cookie,可以有效阻止syn-flood攻击,syn-cookie理论上很简单,就是在服务器接收到客户端的syn包时并不分配任何内存空间,而是巧妙的选择服务器的isn值传给客户端,isn本地也并不保存(本地不保存任何东西),然后客户端发来synack的ack确认包后,从该确认包中取出确认号,然后利用确认号是上一次序列号加1的特性来得到原来的服务器发给客户端的syn
2010-02-09 22:34:00 6127 1
原创 再谈linux中为何没有网卡设备文件--深层次原因
这个问题其实没有什么意思,知道了问题的答案能表明一个人技术水平有多高吗?不能!这个问题有答案以及有意义吗?答案都是没有!那我还为何一直对这个问题死死揪住不放?这类问题可以提高一个人的素质以及了解一段关于网络和unix的历史,正是因为这些都很有趣,才如此值得关注。 在unix中,一切io相关的实体都被抽象成了文件,之所以抽象成文件第一是为了接口统一,第二是为了操作统一,第三是为了策略隐藏,比如这样
2010-02-09 22:33:00 11412 9
原创 实现一个简单的反向NAT并引申一个web请求内容过滤
如果不懂NAT怎么办,其实NAT基本谁都懂,关键是如果不懂配置怎么办,不精通iptables怎么办?幸亏我们玩的是linux内核,我们完全可以自己写一个简单的NAT,通过一个简单的思想就能实现一个简单的NAT,通过扩展这个思想,我们还能实现内容过滤呢。nat简单的说就是地址转换,通过将源地址转换或者目的地址转换可以实现私有网络拓扑隐藏或者网络代理,nat是十分复杂的,这里我就不仔细讲了,但是无论如
2010-02-09 22:33:00 4584 1
原创 为何UNIX/Linux中会有suid程序
linux的单点验证我已经说了不止一次了,linux的整体设计是机制和策略相分离的,单点验证显然是策略方面的东西,因此验证本身并没有内核的介入,那么什么是验证本身呢?其实就是诸如最简单的的密码验证和稍微复杂一点的指纹,声音或者瞳孔验证,不管怎么说这些都是策略,内核不应该介入,因此内核当中你无法知道怎么存储和验证用户的密码是否正确,这些都是用户空间完成的,这个事实似乎会让linux的初学者很惊讶,像
2010-02-09 22:32:00 5156
原创 ptrace接口和execve同步导致的一个内核漏洞
linux中是不可以依附别的进程的,更不可能创建远程线程,然而一种不太正规的方式却可以做到这一点,这就是ptrace接口,ptrace可以依附任何用户进程,用特殊的参数甚至可以更改任何进程的寄存器和内存映射,这个功力和创建远程线程不相上下,甚至比其更加灵活,如果理解了elf映像在内存的布局便可以通过ptrace修改被调试进程的任意内存。然而有一个限制就是ptrace接口只能调试属于自己用户的进程,
2010-02-09 22:32:00 3717
原创 木马程序的信息存储位置
将信息置于目前不使用的扩展字段或者在不和当前信息冲突的前提下将信息“挤”进当前字段,正如current->flags可以重用一样,比如,如果标准内核中已经定义个若干flag标志,比如running,sleeping等,我们就可以使用还没有使用的标志,要知道如果flags字段是一个32位的整型,那么标准的标志占有极少的一部分,我们可以随意使用剩下的部分用于我们自己的目的,例如我们在设置一个进程为隐藏
2010-02-09 22:31:00 3040
原创 关于linux栈的一个深层次的问题
内存不用白不用,何必在一开始就限制栈的大小,linux的机制是尽量多尽量紧凑的使用虚拟内存,原则就是你现在不用我就用,没有预留的概念,当然你可以通过系统调用实现预留,就像glibc的堆管理那样,这里所说的完全是针对于操作系统内核的,用户空间程序完全可以向操作系统通过brk或者mmap实现用户空间的内存预留。windows的实现就不是这样,windows要求程序在运行之前就限制好栈使用的内存的大小,
2010-02-09 22:31:00 5121
原创 两个linux内核rootkit--导语
曾经说过,linux由于其内秉的文件删除机制导致一旦发现有恶意代码很容易被清除掉,即使发现内核本身被感染也是很容易被清除掉,但是这并不能表示linux就是绝对安全的,这仅仅说明linux的补救措施很有效,因此如果想黑掉linux系统,那么首要的不是想如何让用户删不掉恶意程序,而是尽可能严谨的隐藏恶意程序,隐藏的含义有必要澄清一下。 考虑一下用户或者管理员通过什么来探知系统的行为,无非就是一些当前
2010-02-09 22:30:00 3924
原创 两个linux内核rootkit--之一:enyelkm
首先,这个rootkit其实是一个内核木马,和大多数木马不同的是,恶意木马所在的机器是客户端而不是服务器,而黑客所在的机器是服务器,这样做的好处在于可以躲避防火墙,一般的防火墙对外出的包审查不是那么严格而对进入的包审查严格,如果恶意程序是服务器,那么防火墙很可能会拦截连入服务器的黑客客户端进程导致攻击受到阻碍,现在的情况是黑客所在的机器是服务器,他首先发送召唤包到客户端,客户端收到召唤包以后就会连
2010-02-09 22:30:00 6802
原创 两个linux内核rootkit--之二:adore-ng
这个rootkit使用的技术不比前一个,它不是拦截系统调用,而是拦截具体文件系统的回调函数,本身文件系统的回调函数就是动态注册的,很是不确定,那么反黑软件自然就不能简单下结论说这个函数被黑掉了,因此这个rootkit看来比前一个略胜一筹,自然的,既然是内核模块,那么模块隐藏也是一个重要的内容,以下是一个简单的模块隐藏代码,使用此代码的前提就是将此模块紧接着希望被隐藏的模块之后加载: ...//省
2010-02-09 22:30:00 6888 2
原创 从linux的文件删除机制解释为何linux的病毒那么少
很多人曾经说过,linux下的病毒没有windows多的原因在于linux使用的人不多,人们不屑于开发linux下的病毒,看到这个言论我笑了,想必很多人都有过explorer被注入的经历吧,explorer被替换然后怎么也删除不掉,或者一个system32下的一个顽固文件怎么也删除不掉,更不幸的是,它就是一个木马,此时,网上流行的一些工具就显得有用了,比如icesword,这些工具不得不动用内核驱
2010-02-09 22:29:00 5575 3
原创 linux的正交性设计使之完全是windows的超集
linux是windows的超集的意思是说linux完全可以模拟成windows的系统界面,这个怎么理解呢?众所周知,linux的文件系统和windows的有着很大的区别,linux是以/为根的树形结构,而windows的却是分为好几个盘符,不过与其说这是它们的区别倒不如说windows的磁盘布局是linux的一个特殊情况,前面的文章说了,其实windows也拥有一个树形的文件系统,比如一个win
2010-02-09 22:29:00 3393
原创 linux内核中的服务器模式
广义上讲,内核本身就是一个服务器,为所有的用户模式进程提供服务,但是狭义上讲只有在真的有请求的时候内核采取的对策才叫做服务,比如注册-执行模式下的time以及hrtimer等等,用户空间的程序或者内核空间的执行绪可以随意注册一个timer之后就不管了,timer到期以后内核会执行之,这就相当于timer的创建者请求了内核的一项服务,就是执行timer,不光是这个,在内核中处处都是服务执行者,比如工
2010-02-09 22:29:00 2843
原创 linux底层内存管理--内核空间的伙伴系统
linux内核的伙伴算法最大限度的减少了内存的碎片,其实应该说成是尽自己最大的努力减少了内存 的碎片。其思想就是将物理内存分成10个链表,每一个链表的元素代表一系列的连续页面,连续页面的数量随链表的不同而不同,linux中有10个这样的链 表,按照2的从0到9次幂的连续页面数量组成,比如链表0中保存有代表2的0次幂个连续页面的页面,而链表k中保存有2的k次幂个连续的页面,linux 的伙伴系统的精
2010-02-09 22:28:00 4465 1
原创 linux底层内存管理--用户空间的分级分配系统以及懒惰的含义
大 内存如果从heap中分配,第一它如果释放了可能不会立即归还操作系统,第二它如果不释放,由于heap中小内存的分配和释放会造成很多碎片,再有大内存 分配需求时可能会失败,另外heap是要求很严格的一个虚拟内存区间,而且算法维护开销很大,最好让它和谐一些,就是说不要让内存分配的差别过于大,一会 很大的需求,一会一个字节的,由于用户程序内存需求的不确定性,它又不能像内核那样实现简单的页面对齐,最小分
2010-02-09 22:28:00 4121
原创 关于linux文件系统的一些感想
一个常规文件一般位于一个块设备上,而块设备也是一个文件,只不过它是一个特殊文件罢了,unix的著名的一切皆文件的原则使得用户拥有了一个一致的操作视图,一切皆文件的设计初衷我想是这样的:在操作系统刚开始被开发出来以后,操作系统本身代表的就是机器的抽象,人们使用机器的目的是为了得到信息,包括已经存在的信息或者老信息经过加工得到的新信息,于是有必要将信息的载体以一种统一的视图呈现给用户,然后用户可以用一
2010-02-09 22:28:00 5090 3
原创 读《linux开发工具箱》的一点感想
今天周六,又是清明节,我起床很晚,原因不是我懒,是因为我在被窝里看书了,看的是《linux开发工具箱》,书是老外写的,被翻译成了中文,可以说翻译的很差劲,很多地方感觉不通顺,于是我吭吭哧哧半天过不去一句话,好在我的linux基础比较好,读此书不是为了获取什么知识,而是为了得到一种截然不同的表达或者理解方式罢了,书的整体结构还是比较明朗的,今天主要读了第五章的第6节,讲的是“用户空间的内存管理”,本
2010-02-09 22:27:00 3763
原创 关于direct io
direct io是一种不用内核缓存的io,它可以做到直接将用户空间的内存直接写入磁盘或者将磁盘数据直接读到用户空间的缓冲区,这种策略就是不用内核的缓存而使用用户自己设计的缓存,这一般在数据库系统中用到,初用linux的人在调用free命令的时候都会大吃一惊,为何文件cache占用了那么多的内存,太可怕了啊,其实这正是表明了该用户是初用户,这正是linux的风格,空闲内存闲着也是闲着,既然没有用户
2010-02-09 22:27:00 4523
原创 linux线程的退出--附:一个变量,两个精彩
linux的2.6内核更好的实现了内核级别的线程,使得线程的语义更加符合posix的约定,总的来说,线程会在两种地方退出,第一个是正常退出,第二种是异常退出,正常退出的情况下,比如在一个进程的一个线程调用exec的时候,那么所有的别的线程都会退出,另外在一个线程调用exit库函数的时候或者调用group_exit系统调用的时候,整个线程都会退出,异常的情况下,接收到内核的严重错误信号的时候也会退出
2010-02-09 22:27:00 5979 2
原创 Linux中的各种锁
自从各种任务不再顺序执行的那一天起,自从多道程序设计开始上线的那天,进程就戴上了脚镣。古老的操作系统的变体当然也接过了父亲的狼牙棒,信号量杯证明是一种有效的互斥方式,可是它却存在很多弊端。其实unix不喜欢混乱,因此unix创造了进程这个可被操纵系统内核强制管理的执行绪概念,unix几乎给了所有可以执行的东西一个进程上下文,然后管理这些进程,unix的进程管理是很强大的,可是总有管不了的,就是中断
2010-02-09 22:26:00 7219 1
原创 浅谈Linux的设备文件
linux下的文件分为常规文件和设备文件,常规文件一定在某一个设备上被存储,不论这个设备是真实的还是虚拟的,这里的设备是linux中vfs层中的 设备,也就是前面所说的设备文件中的设备,vfs层的设备分为字符设备和块设备,字符设备可以类比为一个fifo的队列,无论读还是写都必须顺序进行,而 块设备就可以随机进行读写,常规的文件一般都在块设备上被存储,包括设备文件本身也在一个块设备上被存储着,可以说
2010-02-09 22:26:00 5847 1
原创 2.6.21开始取消了超线程的dependent_sleeper函数
在2.6.21以前的内核中有一个函数dependent_sleeper,该函数的意义就是,在schedule中,如果当前cpu的运行队列的进程数量不为0,那么还是不能简单的从这个队列中选择一个最高优先级的进程,而是要看看这个cpu是否拥有一个逻辑兄弟cpu,然后抉择,这种情况在intel的超线程中是可能的,由于超线程共享运算逻辑,而仅仅实现了两套寄存器组和中断控制逻辑,两个逻辑cpu共享一个mmu
2010-02-09 22:26:00 3490
原创 Linux的内存映像导出接口—kcore
/proc/kcore文件提供了整个机器的内存映像,和vmcore不同的是,它提供了一个运行时的内存映像,为此和vmcore一样,内核提供了一个类似的但是稍显简单的kcore_list结构体,我们比较一下它们: struct kcore_list { struct kcore_list *next; unsigned long addr;
2010-02-09 22:25:00 6343 2
原创 linux中的睡眠
在linux的内核中,有很多睡眠相关的函数,比如sleep_on,当然也有wake_up,睡眠的意义就是不能再运行了,那么睡眠总要有个地方啊,我们睡眠都要有个床,按照人性化设计出来的linux内核也应该有个睡眠用的床,这是对的,但是,睡眠一定要在床上吗?非也! 就好像现代的白领们,习惯就很不好,总喜欢伏案而小憩,这样不但不解乏而且还不利于健康,不管怎么说也算是一个休息方式,另外闲着没啥事的时候
2010-02-09 22:25:00 4161
原创 linux的多用户
linux继承了unix的很大一部分东西,自设计开始就是多用户的,那么这个多用户到底体现在什么地方呢?多用户和linux操作系统的设计又有何关联呢? 首先看看原始的多用户,所谓多用户就是有很多人公用一台机器,这在计算机开始的年代是很必要的,那个时候机器资源紧缺。于是一种对于计算机的新的使用方式开始流行,在那以前,机器的运作和操作员的使用是一体的,也就是说像织布机一样,一个工人操作一台织布机,当计
2010-02-09 22:24:00 6301 1
原创 linux的多任务
写过一篇关于linux多用户的文章,在提到多用户的时候,多任务的概念也是有必要提出的,实际上,多用户必然意味着多任务,每个用户起码一个任务。这么看来。多任务是比多用户更加基本的一个概念和特性了。 在计算机的远古时代,人们用作业来表示需要计算机代劳的任务,随之有了批处理系统,在批处理系统中,用户和机器无法很好的进行交互,进一步分时系统就出来 了。这个时期为了不浪费计算机资源,人们想到一台机器连接多
2010-02-09 22:24:00 4608 1
原创 linux用户空间和内核exit的语义--linux没有线程
如果你在程序中调用了exit,那么很显然你的程序会退出,可是至于为何会退出那就是库的事情了,我为什么说只是库的事情而不关linux内核的事情呢?那是因为linux内核根本不管用户空间的行为策略。库的策略是什么?很简单的退出当前进程吗?如果是多线程的程序呢?多线程的程序它的行为又是什么呢?在我们探究库的行为以及探究库为何会有这样的行为之前首先谈谈内核对exit的实现sys_exit,在sys_exi
2010-02-09 22:24:00 4796
原创 xinetd超级服务器进程
xinetd的实质和inetd差不多,只不过增加了访问控制功能,更加安全了。实际上xinetd就是一个超级服务器,是个把门的守护者,在linux 丰富的网络应用中实现单点验证,它继承了unix的传统工作方式,只提供机制,而将策略留给用户,正如unix的一个很重要的特性所说,一切都是可以配置 的。它的策略配置方式就是修改配置文件,在linux中不出意外的话,任何程序都要有一个配置文件,在这个配置文件
2010-02-09 22:23:00 3928
原创 linux的自动登录--理解linux的方式
今天在一个邮件列表中有朋友问在linux下如何做到自动登录,就是不用输入用户名和密码,我的回答是在桌面上进行设置,然后那位朋友就学会了并且很高兴,我敢肯定他是windows的下的老用户... 仅仅知道如何设置自动登录实在不够,自动登录不是linux的风格,我敢肯定如果不是在拥有桌面的linux下,在黑屏的命令行下是很少有人使用自动登录的,linux的一个意义就是网络,而网络的环境就是不安全,自动
2010-02-09 22:23:00 4247
原创 Linux守护进程--依然是进程
在linux中,服务是一种特殊的进程,可以说它和用户无关,它的作用不是完成用户任务,而是进行一些管理类的操作或者通用的服务类操作,实际上linux的服务就是一个进程,也仅仅是一个进程。 在linux中,服务叫做守护进程,和windows一样,它也执行和具体用户任务无关的支撑性质的任务,可是不同于windows服务复杂的架构,linux守护进程却是一个普通的进程,除此之外它的巧妙在于它是如何成为服
2010-02-09 22:23:00 3657
原创 linux中exec操作对线程组的影响
在linux的多线程程序中,如果一个线程调用了exec会怎样?是影响整个进程还是仅仅影响单个线程?实际上是影响整个进程,因为exec就是替换进程 地址空间的,而线程是共享进程地址空间的,从本质上讲,线程是没有地址空间这个概念的,只不过在linux中,其独特的线程实现方式使得进程和线程的概念 更加模糊了,在linux中只要一个执行绪就有一个task_struct结构体与之对应,但是实际上按照现代的操
2010-02-09 22:22:00 6501
原创 splice和sendfile
在linux2.6.17之后,内核提供了一个splice/tee系统调用,这可以让用户直接操作内核缓冲区了,这个特性特别适合做网络代理,本文简短的说明一下,快下班了。 在linux2.6.17之后,内核提供了一个splice/tee系统调用,这可以让用户直接操作内核缓冲区了,splice系统调用通过管道 (pipe)可以将文件描述符和管道联系起来,这里的管道实际上是内核借用的一个现成的概念而并
2010-02-09 22:22:00 5172
一个iptables的stateless NAT模块实现
2014-12-27
模块化的nf-HiPAC
2014-11-21
关于linux内核以及其他个人体会的文集
2009-09-07
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人