- 博客(22)
- 资源 (13)
- 收藏
- 关注
原创 Linux内核源代码情景分析-nanosleep()和pause()
我们介绍nanosleep()和pause()两个系统调用。 系统调用nanosleep()在内核中的实现为sys_nanosleep(),代码如下:asmlinkage long sys_nanosleep(struct timespec *rqtp, struct timespec *rmtp)//第一个指针rqtp指向给定所需睡眠时间的数据结构;第二个指针rmtp,指向返回剩余时间的数
2015-03-22 12:54:45 2907
原创 Linux内核源代码情景分析-强制性调度
Linux内核中进程的强制性调度,也就是非自愿的、被动的、剥夺式的调度,主要是由时间引起的。前面讲过这种调度发生在中断,异常,系统调用从系统空间返回用户空间的前夕,也就是在ret_with_reschedule可以看出,此时是否真的调用schedule(),最终还要取决于当前进程task_struct结构中的need_resched是否为1(非0),因此,问题就结为当前进程的need_resche
2015-03-21 17:40:19 1305
原创 Linux内核源代码情景分析-exit()
执行完/bin/echo之后,会调动do_exit,销毁子进程: 我们还是先从系统调用exit()说起,先来看exit()的实现,进入到内核态执行sys_exit。asmlinkage long sys_exit(int error_code){ do_exit((error_code&0xff) 8);}NORET_TYPE void do_exit(long code){ st
2015-03-21 10:37:58 2529
原创 Linux内核源代码情景分析-execve()
子进程开始执行execve: execve("/bin/echo", args, NULL}); 系统调用execve内核入口是sys_execve,代码如下:asmlinkage int sys_execve(struct pt_regs regs){ int error; char * filename; filename = getname((char *) regs.
2015-03-20 19:25:52 4414
原创 Linux内核源代码情景分析-wait()、schedule()
父进程执行wait4,并调用schedule切换到子进程: wait4(child, NULL, 0, NULL); 像其他系统调用一样,wait4()在内核中的入口是sys_wait4(),代码如下:asmlinkage long sys_wait4(pid_t pid,unsigned int * stat_addr, int options, struct rusage * ru
2015-03-20 09:53:37 2010
原创 Linux内核源代码情景分析-fork()
父进程fork出子进程: fork经过系统调用,来到了sys_fork,详细过程请参考Linux内核源代码情景分析-系统调用。asmlinkage int sys_fork(struct pt_regs regs){ return do_fork(SIGCHLD, regs.esp, ®s, 0);}int do_fork(unsigned long clone_flags, u
2015-03-20 08:21:55 2135
原创 Linux内核源代码情景分析-进程的创建,执行,等待,消亡
我们先看下面的程序:#include int main(){ int child; char *args[] = {"/bin/echo", "Hello", "World!", NULL}; if(!(child = fork())) { /* child */ execve("/bin/echo", args, NULL}); printf("I am back,
2015-03-20 08:21:43 1306
原创 Linux内核源代码情景分析-系统调用
一、系统调用初始化void __init trap_init(void){ ...... set_system_gate(SYSCALL_VECTOR,&system_call);//0x80 ......} 对0x80中断向量,设置了系统调用的总入口system_call。static void __init set_system_gate(unsigned in
2015-03-13 18:46:35 2045
原创 Linux内核源代码情景分析-异常
一、异常初始化 中断向量表的IDT的初始化void __init trap_init(void){#ifdef CONFIG_EISA if (isa_readl(0x0FFFD9) == 'E'+('I'<<8)+('S'<<16)+('A'<<24)) EISA_bus = 1;#endif set_trap_gate(0,÷_error); set_trap_gate
2015-03-13 09:31:55 1234
原创 Linux内核源代码情景分析-中断下半部(软中断)
Tasklet机制是一种较为特殊的软中断。Tasklet一词的原意是“小片任务”的意思,这里是指一小段可执行的代码,且通常以函数的形式出现。软中断向量HI_SOFTIRQ和TASKLET_SOFTIRQ均是用tasklet机制来实现的。 从某种程度上讲,tasklet机制是Linux内核对BH机制的一种扩展。在2.4内核引入了softirq机制后,原有的BH机制正是通过tasklet机制
2015-03-13 08:25:47 1272
原创 Linux内核源代码情景分析-中断上半部
一、中断初始化 1、中断向量表IDT的初始化void __init init_IRQ(void){ int i;#ifndef CONFIG_X86_VISWS_APIC init_ISA_irqs();#else init_VISWS_APIC_irqs();#endif /* * Cover the whole vector space, no vector can
2015-03-13 08:25:26 1848
原创 Linux内核源代码情景分析-系统调用mmap()
一个进程可以系统调用mmap(),将一个已打开文件的内容映射到它的用户空间,其用户界面为: mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset)。 参数fd代表着一个已打开文件,offset为文件中的起点,而start为映射到用户空间中的起始地址,length则为长度。还有两个参数prot
2015-03-09 09:13:36 4924 2
原创 Linux内核源代码情景分析-系统调用brk()
首先看下进程地址空间示意图: 我们简单的说,从低地址到高地址,代码区和数据区,空洞,堆栈区。 在Linux内核源代码情景分析-内存管理之用户堆栈的扩展,我们申请了从堆栈区往下,数据区上面的页面。 在Linux内核源代码情景分析-内存管理之用户页面的换入,我们申请了用于换入/换出的页面。 在本文中,我们申请的是从数据区往上,堆栈区下面的页面。 我们通过一个实例来分析,b
2015-03-09 08:33:51 7485
原创 Linux内核源代码情景分析-外部设备存储空间的地址映射
随着计算机技术的发展,人们发现单纯的I/O映射方式是不能满足要求的。此种方式只适合于早期的计算机技术,那时候一个外设通常都只有几个寄存器,通过这几个寄存器就可以完成对外设的所有操作了。而现在的情况却不大一样。例如,在PC机上可以插上一块图像卡,带有2MB的存储器,甚至还可能带有一块ROM,里面装有可执行代码。所以要将外设卡上的存储器映射到内存空间,实际上是虚拟空间的手段。在Linux内核中,这样的
2015-03-06 09:04:25 1550
原创 Linux内核源代码情景分析-内存管理之slab-分配与释放
首先说缓存区的数据结构:struct kmem_cache_s {/* 1) each alloc & free */ /* full, partial first, then free */ struct list_head slabs;//指向所有的slab块链表,前面是完全块,然后是非完全块,最后是空闲块 struct list_head *firstnotfull;//指向第一个非
2015-03-04 19:32:08 2320 1
原创 Linux内核源代码情景分析-内存管理之slab-回收
在上一篇文章Linux内核源代码情景分析-内存管理之slab-分配与释放,最后形成了如下图的结构: 图 1 我们看到空闲slab块占用的若干页面,不会自己释放;我们是通过kmem_ca
2015-03-04 19:31:59 1514
原创 Linux内核源代码情景分析-内存管理之恢复映射
refill_inactive_scan和swap_out,把活跃的页面变成不活跃脏的页面。挑选的原则是最近没有被访问,且age小于0。 page_launder,把不活跃脏的页面变成不活跃干净的页面。 不活跃脏的页面,有如下特点: 使用计数为1; page->list链入mapping->dirty_pages/clean_pages; page->next_has
2015-03-04 09:10:35 1099
原创 Linux内核源代码情景分析-内存管理之用户页面的分配
首先介绍几个重要的数据结构。 1、pagetypedef struct page { struct list_head list; struct address_space *mapping; unsigned long index; struct page *next_hash; atomic_t count; unsigned long flags; /* atomic fl
2015-03-02 10:27:04 1354
原创 Linux内核源代码情景分析-内存管理之用户页面的换入
在下面几种情况下会发生,页面出错异常(也叫缺页中断): 1、相应的页面目录项或者页面表项为空,也就是该线性地址与物理地址的映射关系尚未建立,或者已经撤销。 2、相应的物理页面不在内存中。 本文讨论的就是这种情况。 3、指令中规定的访问方式与页面的权限不符,例如企图写一个“只读”的页面。 假设已经建立好了映射,但是页表项最后一位P为0,表示页面不在内存中;整个页表项如下图,
2015-03-01 17:06:13 2563
原创 Linux内核源代码情景分析-内存管理之用户堆栈的扩展
在下面几种情况下会发生,页面出错异常(也叫缺页中断): 1、相应的页面目录项或者页面表项为空,也就是该线性地址与物理地址的映射关系尚未建立,或者已经撤销。本文讨论的就是这种情况。 2、相应的物理页面不在内存中。 3、指令中规定的访问方式与页面的权限不符,例如企图写一个“只读”的页面。 首先看下进程地址空间示意图:
2015-03-01 12:10:36 1632
原创 Linux内核源代码情景分析-内存管理
用户空间的页面有下面几种: 1、普通的用户空间页面,包括进程的代码段、数据段、堆栈段、以及动态分配的“存储堆”。 2、通过系统调用mmap()映射到用户空间的已打开文件的内容。 3、进程间的共享内存区。 这些页面的的周转有两方面的意思。 1、页面的分配,使用,回收。如进程压栈时新申请的页面,这类页面不进行盘区交换,不使用时释放得以回收。 这部分通过一个场景来解释
2015-03-01 09:48:54 1337
压缩SDK demo
2014-08-01
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人