随笔分类 - kernel
摘要:1为什么要使用cpu的保护模式呢? 经常有不懂的人会问我这个问题,第一次我也被问住了,只是在看cpu是如何实现的,可却从来没有真正的跳出来思考过,cpu的保护模式带给我们什么好处?答:我非常总结的说一下。保护模式主要目的保护多任务之间代码访问的完全隔离(使用虚拟地址),单任务的用户代码和系统代码的访问格式(使用cpu的privilege环)。当然虚拟地址也给内存管理带来了其他的好处,更细节的看下面的文章转载。2 为什么一定要从实模式切换到保护模式,而不是开机就是保护模式? 最主要的原因是:兼容以前的软件,不兼容以前的软件就会失去市场,所以intel处理器发展到今天回如此的复杂。++++++..
阅读全文
摘要:1 schedule的调用时机×××正常情况下进程上下文中的直接调用schedule(),就会尝试着进行上下文切换。比如:int down_interruptible(struct semaphore *sem)copy_from_user(to, from, n)--------只能在用户上下文中调用.×××抢占式的调用schedule()。比如:在中断里面返回时候,即in_irq() != 0(当前处于中断上下文),检查当前进程的TIF_NEED_RESCHED标志位,看是否需要进行preempt_schedule_irq()进行
阅读全文
摘要:由于2.6内核可以抢占,应该在驱动程序中使用 preempt_disable() 和 preempt_enable(),从而保护代码段不被抢占(禁止 IRQ 同时也就隐式地禁止了抢占)。preempt_disable和preempt_enable 调用。spin_lock_irq的功能和上面的spin_lock提供的功能差不多,只不过它还多做了一步,就是把中断也关上,主要用于当前保护的数据在可能的中断程序中也要用到的情况。spin_lock_irqsave和spin_lock_irq的功能一样,只不过调用这个函数以后可以把当前的中断状态记下了,以备以后恢复。在多CPU的环境下情况就比较复杂了,
阅读全文
摘要:VMA和PAGE结构 和mmap函数(关键在最后)1.page 主要成员。。。//查源码2.vm_area_struct 主要成员。。。//查源码3.mmap用户空间调用与内核空间调用void *mmap(void *start,size_t length,int prot,int flags,int fd,off_t offset);//看man mmap内核空间调用int (*mmap) (struct file *filp, struct vm_area_struct *vma);4.mmap执行的顺序 a.在用户进程创建一个vma区域 b.驱动程序获得页 c.将获得的页分配给vma区域
阅读全文
摘要:如何编译一个内核 - Ubuntu方式2011-09-19 15:40 转载地址:http://hi.baidu.com/1101050240/blog/item/69e3d0d92f2b297dd1164e79.html每一个Linux发行版都有自己专门的工具去构建自定义的内核. 本文主要介绍在Ubuntu平台上编译内核, 如何从www.kernel.org(也叫vanilla kernel)获得最新且未改动的内核源代码来构建一个自定义的内核, 这样你可以使用自己的内核而不是发行版的内核, 另外也介绍了如何给内核打补丁, 从而方便增加新的功能.下面的工作我都在Ubuntu 6.10 Serv
阅读全文
摘要:Linux 2.6.19.x 内核编译配置选项简介作者:金步国,转载地址:http://lamp.linux.gov.cn/Linux/kernel_options.html版权声明本文作者是一位自由软件爱好者,所以本文虽然不是软件,但是本着 GPL 的精神发布。任何人都可以自由使用、转载、复制和再分发,但必须保留作者署名,亦不得对声明中的任何条款作任何形式的修改,也不得附加任何其它条件。您可以自由链接、下载、传播此文档,但前提是必须保证全文完整转载,包括完整的版权信息和作译者声明。其他作品本文作者十分愿意与他人共享劳动成果,如果你对我的其他翻译作品或者技术文章有兴趣,可以在如下位置查看现有作
阅读全文
摘要:Linux Kernel : likely/unlikely macrosEver wondered what the likely and unlikely macros in the linux kernel are ?The macros are defined as :#define likely(x) __builtin_expect((x),1)#define unlikely(x) __builtin_expect((x),0)The __builtin_expect is a method that gcc (versions >= 2.96) offer ...
阅读全文
摘要:linux强调的是进程自主性,windows则是对象自主性,其中线程本身也是一个对象,进程也是,所以一个进程可以操作另外一个进程的地址空间也就不足 为奇了,windows的通信实际上是对象间通信,而linux因为一切围着进程转,最新的内核中断也被线程化了,因此通信就是进程间通信,linux 中进程作为超级容器的意义要比windows的更大些,windows中进程是一个容器,也是一个对象,某种意义上它作为容器的意义是容纳别的对象。 windows的模块化思想更加鲜明。 windows中将缺页,调度等概念从线程,进程中分离,专门安排一个irql级别来处理之,而linux下相应的概念则永远和进程相绑
阅读全文
摘要:今晚尝试编译ldd3书中的short模块的的代码。可以在编译的过程中爆出了找不到"AS_INTERRUPT"等等各种找不到变量的错误,显然是GCC在编译的时候找不到head file,1 刚开始查到它在<asm/signal.h>中,于是尝试加上这个头文件,可是依然无效。2 网上乱查,无效【很傻叉的方法】3 在linux cross reference 上搜索,因为我尝试编译链接的内核版本是2.6.35的,然后查到AS_INTERRUPT --- not used.3方法之后,恍然大悟,原来在2.6.35的内核版本中,该变量被去除了。汗那。。浪费了我这么久的时间
阅读全文
摘要:Reason to use per-CPU variable1 Remember that the 2.6 kernel is preemptible; it would not do for a processor to be preempted inthe middle of a critical section that modifies a per-CPU variable.2 It also would not be good if your process were to be moved to another processor in the middle of a per-CP
阅读全文
摘要:1 首先要说的最简单的是在一个process在运行的时候,它看到的内存是这个样子的。3G以后是给kernel使用的运行和动态分配的内存的空间,注意因为是process所看到的,下面全部都是虚拟地址空间。如下:2 然后需要说的是Linux Physical Memory Layout下面这段话解释了为什么linux不能占用所有的Ram内存:Why isn't the kernel loaded starting with the first available megabyte of RAM? Well, the PC architecture hasseveral peculiarit
阅读全文
摘要:打好linux基础,不断的跟随这篇文章中的建议,适应linux kernel开发的流程。虽然需要很久甚至几年的时间,但我相信坚持就会前进!加油!HOWTO do Linux kernel development - take 3 (中文版)译者:张乐 robert_AT_thizlinux_DOT_com 原作:Greg KH 译注:本文依据take 3翻译,应该不会再有大的改动了,如果有本文会随时更新 时间仓促,恐难免错漏,欢迎指正 原文:http://permalink.gmane.org/gmane.linux.kernel/349656 (转贴说明:也可以在内核源代码目录下的Docum
阅读全文
摘要:我言简意赅的说:1 if the timer expires in the next 0 to 255 jiffies, it is added to one of the 256 lists devoted to short-range timers using the least significant bits of the expires field.2 If it expires farther in the future (but before 16,384 jif-fies), it is added to one of 64 lists based on bits 9–14 o
阅读全文
摘要:你知道吗?我今天花了一天的时间,就是为了搞清楚linux中时间是从哪儿来的?都快哭了,它的时间咋就那么的乱呢?还有时钟中断,怎么说呢?与其看他的杂乱无章的代码,不如暂时的囫囵吞枣先以为自己理解了。等到以后有机会再细看kernel代码。开始时间之旅:硬件所提供的功能:RTC(Real Time Clock)--------The RTC continues to tick even when the PC is switched off, because it is energized by a small battery.Linux uses the RTC only to derive th
阅读全文
摘要:一 。因为我是在写driver的时候,学会的这个问题,就以driver的代码来理解吧。 while (dev->rp == dev->wp) { /* nothing to read */ up(&dev->sem); /* release the lock */ if (filp->f_flags & O_NONBLOCK) return -EAGAIN; PDEBUG("\"%s\" reading: going to sleep\n", current-...
阅读全文
摘要:如何将shell script功能模块化,并且对外留出函数和参数接口。要写出这种高质量的模块化的东西,需要对要写的这一块的业务非常理解,知道哪些是通用的,哪些是不通用的。从而将其分离,废话不多说直接看一个我感觉很牛B的脚本。以下脚本的作用:我新写了一个内核device driver模块,下面的脚本是尝试将我的模块,加载模块,在/dev目录下创建结点+++删除文件,卸载模块。参数接口部分:#!/bin/bash# Sample init script for the a driver module <rubini@linux.it>DEVICE="scull"SE
阅读全文
摘要:主要的Makefile内容如下,非常的绕。 1 ifneq ($(KERNELRELEASE),) 2 # call from kernel build system 3 4 scull-objs := main.o pipe.o access.o 6 obj-m := scull.o 7 8 else 9 10 KERNELDIR ?= /lib/modules/$(shell uname -r)/build11 PWD := $(shell pwd)12 13 modules:14 $(MAKE) -C $(KERNELDIR) M=$(PWD) LDD...
阅读全文
摘要:DescriptionFor the purpose of performing permission checks, traditional Unix implementations distinguish two categories of processes: privileged processes (whose effective user ID is 0, referred to as superuser or root), and unprivileged processes (whose effective UID is non-zero). Privileged proces
阅读全文
摘要:要理解,当然要从数据结构去理解以下代码来自<linux/sched.h> <asm-generic/signal.h> <linux/signal.h>。每一个process的task descriptor task_struct中跟signal有关的field:task_struct{ .... struct signal_struct *signal; struct sighand_struct *sighand; struct sigpending pending; //private pending signal for every LWP sigs
阅读全文
摘要:poll的作用:同时探测n个drivers,找到可以直接使用的driver,从而尽量block进程。以下kernel源代码来自于:<linux/poll.h> 与 fs/select.cstatic unsigned int scull_p_poll(struct file *filp, poll_table *wait){ struct scull_pipe *dev = filp->private_data; unsigned int mask = 0; /* * The buffer is circular; it is considered full ...
阅读全文

浙公网安备 33010602011771号