摘要:无论在flash中还是在内存中都只有一份,当不同的进程调用到同一个.so中的内容时,内存中也只有一份.so .so在第一个调用它的进程加载时,加载到内存中,但是它的代码段并不分布在进程的地址空间中,它只留下了一份内存映像在进程地址空间中的映射区 (映射区很神奇,进程地址空间中这段地址的页表都相同,也
阅读全文
摘要:Linux 对进程地址空间有个标准布局,地址空间中由各个不同的内存段组成 (Memory Segment),主要的内存段如下: 程序段 (Text Segment):可执行文件代码的内存映射 数据段 (Data Segment):可执行文件的已初始化全局变量的内存映射 BSS段 (BSS Segme
阅读全文
摘要:进程栈与线程栈 同一进程间的线程共享的资源有1.堆2.全局变量,静态变量3.文件设备资源等4.进程的代码段,打开的文件描述符,进程的当前目录。 独享的有1.栈2.寄存器,程序计数器pc3.线程id,线程优先级4.错误返回码 ulimit指令的使用:可以修改和查看栈的大小 线程栈默认大小是8M,而且线
阅读全文
摘要:虚拟地址转换物理地址的过程:打开mmu后,cpu访问的都是虚拟地址,当cpu访问一个虚拟地址的时候,会通过cpu内部的mmu来查询物理地址,mmu首先通过虚拟地址在tlb中查找,如果找到相应表项,直接获得物理地址;如果tlb没有找到,就会通过虚拟地址从页表基地址寄存器保存的页表基地址开始查询多级页表
阅读全文
摘要:这篇文章介绍得很好 https://blog.csdn.net/YuZhiHui_No1/article/details/38567399
阅读全文
摘要:先说结论:事实上在中断处理中调用schedule或sleep等函数,未必会直接进入panic(部分厂商提供的内核会,这样保证了程序员可以更早的发现问题) 有些内核版本,中断会单独开一些中断栈,并没有task_struct等结构,被调度走了以后,就调度不回来了,那么中断处理就有问题了 但早期有些内核版
阅读全文
摘要:开启debug的方法: 1、在想要打印log的文件下,添加一个#define DEBUG 2、在makefile中通过KCFLAGS传递 设置kernel printk的日志等级为8 修改printk的默认日志级别的方法有多种,例如直接修改printk.c(新kernel为printk.h)中的CO
阅读全文
摘要:上下半部 下半部三件套 中断中到底该用什么锁? 自旋锁。因为用互斥锁的话可能会让出CPU,在中断上下文中让出CPU是不可接受的
阅读全文
摘要:如何打开一个文件 首先贴出整体的流程: compat_sys_openat|-->do_sys_open |-->do_filp_open |-->do_filp_open |-->path_openat|-->path_init # nd初始化。|-->link_path_walk # 真实寻找。
阅读全文
摘要:进程页表与内核页表 所有的进程共享一份内核页表,所有的进程页表各不相同 内核页表在bring up的时候创建,而进程页表在进程创建的时候填写,对于内存页申请的同步(比如内核申请了一块内存,在进程页表中的同步)往往发生在pagefault的时候 CPU访问虚拟地址的时候总是通过MMU先访问TLB,再访
阅读全文
摘要:貌似只有硬件中断才是真正意义上的 异步,会在程序意想不到的位置发生,其他的机制诸如信号、系统调用、软中断等等,总是在某个 同步 的位置去处理他们 进程调度的时机 系统发生调度的时机如下: 调用cond_resched()时 显式调用schedule()时 从系统调用或者异常中断返回用户空间时 从中断
阅读全文
摘要:kmalloc,相当于kernel在访问硬件寄存器的时候,申请的内存,无论是物理还是虚拟地址空间都必须是连序的 vmalloc,虚拟连序,但物理地址上并不连序,vmalloc效率较低,因为要另外建立页表项,映射虚拟地址与物理地址 vmalloc一般在申请大内存的时候才会使用,此外不会立即更新到进程页
阅读全文