10年以上工作经验,主要从事系统软件开发,涵盖:系统库开发、指令集优化、Linux内核开发等。累计为某些开源社贡献过一定数量的patch。...在 Linux 内核启动之后,对于 32 位的系统来说,他会把 0 ~ 896M 这部分低端内存(low memory)都做线性映射,不管这部分内存是否需要用到。...注意:linux内核虽然在开机的时候,映射了(对于64为平台来说)所有物理内存,但是他并没占有这些内存,只是为了访问方便。 以下代码来自于:linux-5.15,ARM64架构。...注意,对于一个典型ARM64 Linux架构来说,pte能映射2^9*4K = 2M地址空间。...注意,对于一个典型ARM64 Linux架构来说,pmd能映射2^9*2M = 1G地址空间。
2.Panic – 困惑,恐慌,它表示Linux kernel遇到了一个不知道该怎么继续的情况。内核行为表现为通知感兴趣模块,死机或者重启。...在Linux平台,程序发生异常之后会转储core dump,而此coredump可以用调试器GDB来进行调试。而内核的异常也可以进行类似的转储。...对linux kernel来讲,目前配置为39bit的kernel空间。...ram console 这个结构体里的off_linux指向了struct last_reboot_reason,里面保存了重要的信息: ?...使用方式如下 if (condition) BUG(); 或者 : BUG_ON(condition); //只是在BUG基础上多层封存而已: ` #define BUG_ON(condition
内核启动源码 start_kernel ---- 在 Linux 内核初始化完成后 , 会在 " 初始化内存 " 时 , 输出 内存布局 ; Linux 内核启动源码是定义在 linux-5.6.18...%4ld kB)\n", mem_init 源码 : void __init mem_init(void) { pci_iommu_alloc(); #ifdef CONFIG_FLATMEM BUG_ON...BUILD_BUG_ON(VMALLOC_START >= VMALLOC_END); #undef high_memory #undef __FIXADDR_TOP #ifdef CONFIG_HIGHMEM BUG_ON...(PKMAP_BASE + LAST_PKMAP*PAGE_SIZE > FIXADDR_START); BUG_ON(VMALLOC_END > PKMAP_BASE); #endif BUG_ON...(VMALLOC_START >= VMALLOC_END); BUG_ON((unsigned long)high_memory > VMALLOC_START); test_wp_bit
前面已经分析了linux内存管理算法(伙伴管理算法)的准备工作。...(PKMAP_BASE + LAST_PKMAP*PAGE_SIZE > FIXADDR_START); BUG_ON(VMALLOC_END > PKMAP_BASE); #endif...BUG_ON(VMALLOC_START >= VMALLOC_END); BUG_ON((unsigned long)high_memory > VMALLOC_START); if...managed_pages则是记录管理区的管理页面数,totalhigh_pages则是记录高端内存的页面总数; 具体看一下__free_reserved_page(): 【file:/include/linux...ClearPageReserved(page); init_page_count(page); __free_page(page); } 其中ClearPageReserved定义在/include/linux
内核源码的 linux-5.6.18\kernel\sched\rt.c 源文件中定义 , 实时调度 相关的 核心函数 也定义在该源码中 ; 一、enqueue_task_rt 函数 ( 插入进程到执行队列...task_current(rq, p) && p->nr_cpus_allowed > 1) enqueue_pushable_task(rq, p); } 源码路径 : linux-5.6.18\...)) return NULL; p = _pick_next_task_rt(rq); set_next_task_rt(rq, p, true); return p; } 源码路径 : linux...sched_rt_entity *rt_se; struct rt_rq *rt_rq = &rq->rt; do { rt_se = pick_next_rt_entity(rq, rt_rq); BUG_ON...sched_rt_entity *next = NULL; struct list_head *queue; int idx; idx = sched_find_first_bit(array->bitmap); BUG_ON
1、为什么要使用反向映射 物理内存的分页机制,一个PTE(Page Table Entry)对应一个物理页,但一个物理页可以由多个PTE与之相对应,当该页要被回收时,Linux2.4的做法是遍历每个进程的所有...之后确实采用过此方法,为每个页结构(Page)维护一个链表,这样确实节省了时间,但此链表所占用的空间及维护此链表的代价很大,在2.6中弃之不用,但反向映射机制的思想不过如此,所以还是有参考价值的 2、Linux2.6...(PageReserved(page)); BUG_ON(!...Linux采用三级页表: PGD:顶级页表,由pgd_t项组成的数组,其中第一项指向一个二级页表。...* See handle_pte_fault() ... */ BUG_ON(!
->sd. */ ops = kobj_child_ns_ops(kobj); //namespace的知识 if (ops) { BUG_ON...(ops->type <= KOBJ_NS_TYPE_NONE); BUG_ON(ops->type >= KOBJ_NS_TYPES); BUG_ON(!...int sysfs_create_dir_ns(struct kobject *kobj, const void *ns) { struct kernfs_node *parent, *kn; BUG_ON...#include #include #include #include #include #include #include
本文是我几个月前在研究linux kernel Cgroups时整理的。...__init cgroup_init(void) { struct cgroup_subsys *ss; unsigned long key; int ssid; BUG_ON...(percpu_init_rwsem(&cgroup_threadgroup_rwsem)); BUG_ON(cgroup_init_cftypes(NULL, cgroup_dfl_base_files...)); BUG_ON(cgroup_init_cftypes(NULL, cgroup_legacy_base_files)); mutex_lock(&cgroup_mutex);...>id = cgroup_idr_alloc(&ss->css_idr, css, 1, 2, GFP_KERNEL); BUG_ON
Linux系统一次读取磁盘的大小是一个块,而不是一个扇区,块设备驱动由此得名。 二、块设备处理过程 1、linux 内核中,块设备将数据存储与固定的大小的块中,每个块都有自己的固定地址。...Linux内核中块设备和其他模块的关系如下。 ? 1、块设备的处理过程涉及Linux内核中的很多模块,下面简单描述之间的处理过过程。 ... ?...buffer_locked(bh)); BUG_ON(!buffer_mapped(bh)); BUG_ON(!...bh->b_end_io); BUG_ON(buffer_delay(bh)); BUG_ON(buffer_unwritten(bh)); /* * Only clear
其错误处理风格,依然是Linux内核的标准方式。如netdev_upper_dev_link失败的话,就跳转到out_unregister_netdev,进行unregister。...因此触发了BUG_ON条件,直接导致内核panic。如果去掉了这个BUG_ON,在此处不直接panic,就会引发double free的问题。这样的内存Bug,查起来就痛苦多了。
, int node, gfp_t gfp_mask, const void *caller) { struct vmap_area *va; struct vm_struct *area; BUG_ON...vmap_area *va; struct rb_node *n; unsigned long addr; int purged = 0; struct vmap_area *first; BUG_ON...size); BUG_ON(size & ~PAGE_MASK); BUG_ON(!...flags = 0; __insert_vmap_area(va); free_vmap_cache = &va->rb_node; spin_unlock(&vmap_area_lock); BUG_ON...(va->va_start & (align-1)); BUG_ON(va->va_start < vstart); BUG_ON(va->va_end > vend); return va;
struct task_struct { volatile long state; int exit_state; ... } 看看include/linux...这是因为linux里的进程都属于一颗树,树的根结点是linux系统初始化结束阶段时启动的init进程,这个进程的pid是1,所有的其他进程都是它的子孙。...这个树状关系也比较健壮,当某个进程还在运行时,它的父进程却退出了,这个进程却没有成为孤儿进程,因为linux有一个机制,init进程会接管它,成为它的父进程。...strong>forget_original_parent(tsk, &ptrace_dead); BUG_ON...list_empty(&tsk->children)); BUG_ON(!
/usr/bin/stap %{ #include #include #include #include #include #include #include #include <linux/buffer_head.h...dump_dentry.txt 因为SystemTap运行时会关闭中断,而当调用file_open打开ext3/ext4文件系统的文件时内核接口函数 __find_get_block会检查是否关闭中断,如果关闭中断就BUG_ON
业余时间写的玩具操作系统,准备把内存管理部分加强一下,伙伴系统分配页面算法已经完成,下面就要开始写更加细粒度的内存分配,毕竟伙伴系统是按照页为基本单位分配的,参考内核版本linux2.6.30,没分析高版本的源码...cache_cache.buffer_size, cache_line_size(), 0, &left_over, &cache_cache.num); if (cache_cache.num) break; } //BUG_ON...array_cache *ptr; ptr = kmalloc(sizeof(struct arraycache_init), GFP_KERNEL); //local_irq_disable(); //BUG_ON...local_irq_enable(); ptr = kmalloc(sizeof(struct arraycache_init), GFP_KERNEL); //local_irq_disable(); // BUG_ON
比如在笔者的 Linux 机器下就注册有 "rootfs"、"proc"、"ext2"、"sockfs" 等十几种文件系统。...3.1 文件系统的数据结构 在 Linux 源代码中,每种实际的文件系统用以下的数据结构表示(include/linux/fs.h): 1 struct file_system_type { 2...-- 3.2 注册 rootfs 文件系统 在众多的实际文件系统中,之所以单独介绍 rootfs 文件系统的注册过程,实在是因为该文件系统 VFS 的关系太过密切,如果说 ext2/ext3 是 Linux...宏的声明及 arch\i386\vmlinux.lds 文件来理解这一过程),但是 rootfs 的注册却是通过 init_rootfs() 这一初始化函数来完成,这意味着 rootfs 的注册过程是 Linux...struct file_system_type * fs) 2 { 3 int res = 0; 4 struct file_system_type ** p; 5 6 BUG_ON
] oops_end, 1, 11 [ 4.354740] -(2)[1:swapper/0]Kernel panic - not syncing: Fatal exception 这是linux...有过驱动调试经验的人肯定都知道这个东西,这里的BUG跟我们一般认为的“软件缺陷”可不是一回事,这里说的BUG()其实是linux kernel中用于拦截内核程序超出预期的行为,属于软件主动汇报异常的一种机制...BUG()跟BUG_ON(1)其实本质是一回事,后者只是在前者的基础上做了简单的封装而已,BUG()的实现 本质是埋入一条未定义指令:0xe7f001f2,触发ARM发起Undefined Instruction...) sig = 0; oops_end(flags, regs, sig); } 总流程大致如下: 通常来说,代码分析过程结合kernel log一起看会理解来得更加深刻,如果是BUG()/BUG_ON...例如: 从上面log知PC死在的地址,通过add2Line工具结合内核符号映射表 vmlinux 就可以定位出具体代码所在文件行号: arm-linux-androideabi-addr2line -e
set_pgd(pgd, __pgd(__pa(pmd_table) | _PAGE_PRESENT)); pud = pud_offset(pgd, 0); BUG_ON...&& (vaddr >> PMD_SHIFT) <= pmd_idx_kmap_end) { pte_t *newpte; int i; BUG_ON...init_mm, __pa(newpte) >> PAGE_SHIFT); set_pmd(pmd, __pmd(__pa(newpte)|_PAGE_TABLE)); BUG_ON...flush_tlb_all(); paravirt_release_pte(__pa(pte) >> PAGE_SHIFT); pte = newpte; } BUG_ON
0] oops_end, 1, 11 [ 4.354740] -(2)[1:swapper/0]Kernel panic - not syncing: Fatal exception 这是linux...有过驱动调试经验的人肯定都知道这个东西,这里的BUG跟我们一般认为的“软件缺陷”可不是一回事,这里说的BUG()其实是linux kernel中用于拦截内核程序超出预期的行为,属于软件主动汇报异常的一种机制...BUG()跟BUG_ON(1)其实本质是一回事,后者只是在前者的基础上做了简单的封装而已,BUG()的实现 本质是埋入一条未定义指令:0xe7f001f2,触发ARM发起Undefined Instruction...(1)那么内核一定会挂掉重启,而__WARN()只会dump_stack()而不会死机, 从源码跟log信息也可以容易区分两种情况,如果是BUG()/BUG_ON(1)的话一定有类似下面的log输出,只要搜索关键字...例如: 从上面log知PC死在的地址,通过add2Line工具结合内核符号映射表 vmlinux 就可以定位出具体代码所在文件行号: arm-linux-androideabi-addr2line
Linux内核中do{...}while(0)意义: 辅助定义复杂的宏,避免引用的时候出错,如果不用{},if后面的语句只有第一条进行了判断。同时避免宏展开后“;”造成编译不通过....warning 定义一个单独的函数块来实现复杂的操作 0x01 常见宏整理 __CONCAT宏 "##"用于粘贴两个参数,"#"用于替换参数 #define __CONCAT(a, b) a ## b BUG_ON...(condition) 条件为真,产生崩溃, 原理:未定义的异常 相对应的有 WARN_ON #define BUG() assert(0)#define BUG_ON(x) assert(!...*/#define WARN() BUG()#define WARN_ON(x) (BUG_ON(x), false) BUILD_BUG_ON宏 #define BUILD_BUG_ON(condition...= PER_LINUX32) PER_LINUX32 = 0x0008,PER_MASK = 0x00ff, /*, * Return the base personality
Linux的文档里没有详细说明dma-coherent的用法。...Linux会根据direction的值invalidate或者clean cache。...dir, unsigned long attrs) { const struct dma_map_ops *ops = get_dma_ops(dev); dma_addr_t addr; BUG_ON...dma_data_direction dir, unsigned long attrs) { const struct dma_map_ops *ops = get_dma_ops(dev); BUG_ON...dev_is_dma_coherent的定义在文件include\linux\dma-noncoherent.h中。
领取专属 10元无门槛券
手把手带您无忧上云