摘要:
第1章 unix基础知识1. char *strerror(int errnum)该函数将errnum(就是errno值)映射为一个出错信息字符串,返回该字符串指针。声明在string.h文件中。2.void perror(const char *s) 该函数基于当前的errno值,在标准出错文件中... 阅读全文
摘要:
直到今日,才发现自己对重载的认识长时间以来都是错误的。幸亏现在得以纠正,真的是恐怖万分,雷人至极。一直以来,我认为重载可以发生在基类和派生类之间,例如: 1 class A { 2 public: 3 void test(int); 4 }; 5 class B : pub... 阅读全文
摘要:
所谓进程的地址空间,指的就是进程的虚拟地址空间。当创建一个进程时,内核会为该进程分配一个线性的地址空间(虚拟地址空间),有了虚拟地址空间后,内核就可以通过页表将进程的物理地址地址空间映射到其虚拟地址空间中,程序员所能看到的其实都是虚拟地址,物理地址对程序员而言是透明的。当程序运行时,MMU硬件机制会... 阅读全文
摘要:
进程调度所使用到的数据结构:1.就绪队列内核为每一个cpu创建一个进程就绪队列,该队列上的进程均由该cpu执行,代码如下(kernel/sched/core.c)。1 DEFINE_PER_CPU_SHARED_ALIGNED(struct rq, runqueues);定义了一个struct rq... 阅读全文
摘要:
在linux c编程中,我们可以使用fork,vfork,clone三个系统调用来创建子进程。下面我们先分析下fork系统调用的实现原理。代码如下(kernel/fork.c): 1 #ifdef __ARCH_WANT_SYS_FORK 2 SYSCALL_DEFINE0(fork) 3 { 4 ... 阅读全文
摘要:
众所周知,进程调度使用schedule()函数来完成,下面我们从分析该函数开始,代码如下(kernel/sched/core.c):1 asmlinkage __visible void __sched schedule(void)2 {3 struct task_struct *tsk =... 阅读全文
摘要:
在3.16-rc4内核源码中,内核给每个进程分配的内核栈大小为8KB。这个内核栈被称为异常栈,在进程的内核空间运行时或者执行异常处理程序时,使用的都是异常栈,看下异常栈的代码(include/linux/sched.h):1 union thread_union {2 struct thre... 阅读全文
摘要:
tasklet是在HI_SOFTIRQ和TASKLET_SOFTIRQ两个软中断的基础上实现的(它们是在同一个源文件中实现,由此可见它们的关系密切程度),它的数据结构和软中断比较相似,这篇博文将分析tasklet的初始化过程。1.和tasklet相关的数据结构tasklet_vec和tasklet_... 阅读全文
摘要:
1.和软中断相关的数据结构:softing_vec数组(kernel/softirq.c)1 static struct softirq_action softirq_vec[NR_SOFTIRQS] __cacheline_aligned_in_smp;NR_SOFTIRQS值为10,说明内核支持... 阅读全文
摘要:
上一篇博文我们分析了中断描述符表的中断门初始化过程,并且在interrupt数组中初始化过程中,可以看到每个中断处理程序都会跳入common_interrupt中。下面我们分析下common_interrupt汇编片段(arch/x86/kernel/entrt_32.S)。 1 .p2al... 阅读全文