2016年10月27日

Linux内核情景分析之异常访问,用户堆栈的扩展

摘要: 情景假设:在堆内存中申请了一块内存,然后释放掉该内存,然后再去访问这块内存。也就是所说的野指针访问。当cpu产生页面错误时,会把失败的线性地址放在cr2寄存器.线性地址缺页异常的4种情况1.如果cpu访问的行现地址在内核态,那么很可能访问的是非连续区,需要vmalloc_fault处理.2.缺页异常发生在中断或者内核线程时,直接失败,因为不可修改页表3.地址在一个区间内,那就可能是已经物理地址映射... 阅读全文

posted @ 2016-10-27 11:10 笨拙的菜鸟 阅读(1674) 评论(0) 推荐(0) 编辑

Linux内核情景分析的alloc_pages

摘要: NUMA结构的alloc_pages==================== mm/numa.c 43 43 ====================43 #ifdef CONFIG_DISCONTIGMEM==================== mm/numa.c 91 128 ====================91 /*92 * This can be refined. Cur... 阅读全文

posted @ 2016-10-27 11:07 笨拙的菜鸟 阅读(2901) 评论(0) 推荐(0) 编辑

linux内核情景分析之execve()

摘要: 用来描述用户态的cpu寄存器在内核栈中保存情况.可以获取用户空间的信息struct pt_regs {long ebx; //可执行文件路径的指针(regs.ebx中long ecx; //命令行参数的指针(regs.ecx中)long edx; //环境变量的指针(regs.edx中)。long... 阅读全文

posted @ 2016-10-27 11:00 笨拙的菜鸟 阅读(1179) 评论(0) 推荐(0) 编辑

linux内核情景分析之exit与Wait

摘要: //第一层系统调用asmlinkage long sys_exit(int error_code){ do_exit((error_code&0xff)pid)//空转进程也就是0号进程禁止退出 panic("Attempted to kill the idle task!"); if (tsk->pid == 1)//1号进程禁止退出 panic("Attempted to kill ini... 阅读全文

posted @ 2016-10-27 10:59 笨拙的菜鸟 阅读(1845) 评论(0) 推荐(0) 编辑

linux内核情景分析之强制性调度

摘要: 从系统调用返回到用户空间是否调度,从ret_with_reschedule可看出,是否真正调度,取决于当前进程的pcb中的need_resched是否设置为1,那如何设置为1取决于以下几种情况:时间中断处理程序,发现当前进程运行时间过长:每次发生时间中断,都要递减该进程的时间片,一旦count为0,强制调度,剥夺当前进程运行void update_process_times(int user_ti... 阅读全文

posted @ 2016-10-27 10:57 笨拙的菜鸟 阅读(1122) 评论(0) 推荐(0) 编辑

linux内核之系统调用nanosleep与pause()

摘要: nanosleep()使得进程进入睡眠状态,指定时候后唤醒进程,sleep()基于其实现asmlinkage long sys_nanosleep(struct timespec *rqtp, struct timespec *rmtp)//第一个指针rqtp指向给定所需睡眠时间的数据结构;第二个指针rmtp,指向返回剩余时间的数据结构,可能收到信号提前唤醒.{ struct timespec t... 阅读全文

posted @ 2016-10-27 10:56 笨拙的菜鸟 阅读(3370) 评论(0) 推荐(0) 编辑

linux内核情景分析之锁机制

摘要: /* * These are the generic versions of the spinlocks and read-write * locks.. *///自旋锁加锁,irqsave表示把标志寄存器存储起来#define spin_lock_irqsave(lock, flags) do { local_irq_save(flags);//关闭本地中断,保存标志位 spin_... 阅读全文

posted @ 2016-10-27 10:54 笨拙的菜鸟 阅读(908) 评论(0) 推荐(0) 编辑

linux内核情景分析之内核中的互斥操作

摘要: 信号量机制:struct sempahore是其结构,定义如下struct semaphore { atomic_t count;//资源数目 int sleepers;//等待进程数目 wait_queue_head_t wait;//等待队列#if WAITQUEUE_DEBUG long __magic;#endif};down操作成功(减后结果非负数)那就在标号1处结束down操作,转到临... 阅读全文

posted @ 2016-10-27 10:54 笨拙的菜鸟 阅读(593) 评论(0) 推荐(0) 编辑

linux内核之情景分析mmap操作

摘要: 进程可以通过mmap把一个已打开文件映射到用户空间.mmap(void*start,size_t length,int prot,int flags,int fd,off_t offset)start表示用户空间映射的起始地址,offset文件的起始length长度.asmlinkage long sys_mmap2(unsigned long addr, unsigned long len, u... 阅读全文

posted @ 2016-10-27 10:53 笨拙的菜鸟 阅读(2177) 评论(0) 推荐(0) 编辑

linux内核情景分析之匿名管道

摘要: 管道的机制由pipe()创建,由pipe()所建立的管道两端都在同一进程.所以必须在fork的配合下,才可以在具有亲缘关系的进程通信/* * sys_pipe() is the normal C calling standard for creating * a pipe. It's not the way Unix traditionally does this, though. */asmli... 阅读全文

posted @ 2016-10-27 10:52 笨拙的菜鸟 阅读(590) 评论(0) 推荐(0) 编辑

linux内核情景分析之命名管道

摘要: 管道是一种"无名","无形文件,只可以近亲进程使用,不可以再任意两个进程通信使用,所以只能实现"有名","有形"的文件来实现就可以克服其缺点,这里的有名:一个文件应该有文件名,使得任何进程可以通过文件名或者路径找到该文件,有形指的是文件的inode应该存在与磁盘或者其他文件熊截止上.使得任何进程可以再任何时间都可以建立联系.命名管道的创建用mknod,当然也可以使用mknod函数创建命名管道.建立... 阅读全文

posted @ 2016-10-27 10:51 笨拙的菜鸟 阅读(711) 评论(0) 推荐(0) 编辑

linux内核情景分析之信号实现

摘要: 信号在进程间通信是异步的,每个进程的task_struct结构有一个sig指针,指向一个signal_struct结构定义如下struct signal_struct { atomic_t count; struct k_sigaction action[_NSIG];//类似一个信号向量表,每个元素就是一个函数指针 spinlock_t siglock;};struct k_sigactio... 阅读全文

posted @ 2016-10-27 10:50 笨拙的菜鸟 阅读(1128) 评论(0) 推荐(0) 编辑

Linux内核情景分析之消息队列

摘要: 早期的Unix通信只有管道与信号,管道的缺点:所载送的信息是无格式的字节流,不知道分界线在哪,也没通信规范,另外缺乏控制手段,比如保温优先级,管道机制的大小只有1页,管道很容易写满而读取没有及时,发送者只能休眠,强化了管道机制同步要求.另外管道机制开销不少,尤其是当发送信息量很少时,平均每个字节所耗费的代价非常高Linux内核为系统IPC提供了一个统一的系统调用ipc()int ipc(unsig... 阅读全文

posted @ 2016-10-27 10:49 笨拙的菜鸟 阅读(830) 评论(0) 推荐(1) 编辑

导航