BUG_ON&&WARN_ON&BUILD_BUG_ON】的更多相关文章

转载:http://wenx05124561.blog.163.com/blog/static/124000805201223112811490/ 一.BUG_ON Linux中BUG_ON,WARN_ON用于调试,比如 #define BUG_ON(condition) do { /          if (unlikely((condition)!=0)) /                  BUG(); /  } while(0) 如果觉得该condition下是一个BUG,可以添加此…
Chapter 18 调 试 18.1 准备开始 1.准备工作: 一个bug 一个藏匿bug的内核版本 相关内核代码的知识和运气 2.执行foo就会让程序立即产生核心信息转储(dump core). 18.2 内核中的bug ##往往是经由连锁反应触发的.## 1.内核bug的原因: 错误代码(如没有把正确的值存放在恰当的位置) 同步时发生的错误(如共享变量锁定不当) 错误的管理硬件(如错误的控制寄存器发送错误的指令) 2.内核bug发作的症状可能有 降低所有程序的运行性能 毁坏数据 使得系统处…
第十八章 调试 18.1准备开始 需要的只是: 一个确定的bug.大部分bug通常都不是行为可靠而且定义明确的. 一个藏匿bug的内核版本. 相关的内核代码的知识和运气. 18.2内核中的bug 内核中的bug多种多样,它们的产生可以有无数的原因,同时他们的表象也变化多端. 从隐藏在源代码中的错误到展现在目击者面前的bug,往往都是经历一系列连锁反应的事件才可能触发. 内核与其他大型的软件项目没有什么太大的不同. 内核有一些独特的问题需要考虑:例如定时限制和竞争条件等,它们都是允许多个线程在内核…
知乎上个问题<C 语言有什么奇技淫巧?>排名第一的是一个“抖机灵”的答案. C有一个鲜为人知的运算符叫”趋向于”, 写作“-->”.比如说如果要实现一个倒数的程序,我们可以定义一个变量x,然后让它趋向与0: 其它答案也是蛮有意思的,有个和解答与它一样,可以看做"!!" 符号. /* Force a compilation error if condition is true */ #define BUILD_BUG_ON(condition) ((void)sizeo…
BUILD_BUG_ON() 在编译时调用,可以提前发现错误,这里利用了一些不常用的特性,当数组个数元素为负时会发生编译器错误,对于位域宽度而言,其为负数时也会发生编译器错误. #define BUILD_BUG_ON_ZERO(e) (sizeof(struct{int : -!!(e);})) #define BUILD_BUG_ON_NULL(e) ((void*)sizeof(struct{int : -!!(e);})) #define BUILD_BUG_ON(condition)…
一些内核调用可以用来方便标记bug,提供断言并输出信息.最常用的两个是BUG()和BUG_ON(). 当被调用的时候,它们会引发oops,导致栈的回溯和错误信息的打印.为什么这些声明会导致 oops跟硬件的体系结构 是相关的.大部分体系结构把BUG()和BUG_ON()定义成某种非法操作,这样自然会产生需要的oops.你可以把这些调用当作断言使用,想要断言某种情况不该发生: if (bad_thing)BUG(); //需要linux 内核开启General setup->Configure s…
有点空闲时间,让我们来总结一下内核DEBUG中的各个语句吧.随便找个内核驱动,在init函数里面加入如下代码测试: u8 a = 1, b = 0; printk("----------dump stack\n");dump_stack();printk("----------BUG_ON\n");BUG_ON(a<b);BUG_ON(a>b);printk("----------BUG\n");if(a<b)    BUG()…
关键词:fasync_helper.kill_async.sigsuspend.sigaction.fcntl.F_SETOWN_EX.F_SETSIG.select().poll().poll_wait()等. <Linux/UNIX系统编程手册>第63章主要介绍了select()/poll().信号驱动IO.epoll三方面,以及他们之间异同.优劣点. 这里准备结合项目中遇到的问题,分两个方向进行归纳总结.一是一个IO模型从测试程序.API.内核实现进行纵向分析:二是横向不同IO模型的优缺…
=============  参考  ============= 代码:linux-3.10.65/kernel/workqueue.c =============================== 1. workqueue 是什么? workqueue是对内核线程封装的用于处理各种工作项的一种处理方法, 由于处理对象是用链表拼接一个个工作项, 依次取出来处理, 然后从链表删除,就像一个队列排好队依次处理一样, 所以也称工作队列, 所谓封装可以简单理解一个中转站, 一边指向“合适”的内核线程,…
0x00 宏的基本知识 // object-like #define 宏名 替换列表 换行符 //function-like #define 宏名 ([标识符列表]) 替换列表 换行符 替换列表和标识符列表都是将字符串 token 化以后的列表.区别在于标识符列表使用,作为不同参数之间的分割符.每一个参数都是一个 token 化的列表.在宏中空白符只起到分割 token 的作用,空白符的多少对于预处理器是没有意义的. 宏的一些奇技淫巧: https://gaomf.cn/2017/10/06/C…
本文介绍的内核调试宏属于静态调试方法,通过调试宏主动触发oops从而打印出函数调用栈信息. 1) BUG_ON 查看bug处堆栈内容,主动制造oops Linux中BUG_ON,WARN_ON用于调试,比如 #define BUG_ON(condition) do { / if (unlikely((condition)!=0)) / BUG(); / } while(0) 如果觉得该condition下是一个BUG,可以添加此调试信息,查看对应堆栈内容 具体的BUG_ON最终调用__bug _…
1 cgroup介绍 CGroup是control group的简称,它为Linux kernel提供一种任务聚集和划分的机制,可以限制.记录.隔离进程组(process groups)所使用的资源(cpu.memory.I/O等).CGroup也是LXC为实现虚拟化所使用的资源管理手段.CGroup本身是提供将进程进行分组化管理的功能和接口的基础结构,I/O或内存的分配控制等具体的资源管理功能是通过这个功能来实现的.这些具体的资源管理功能称为CGroup子系统. CGroup子系统包含如下:…
转自:http://blog.chinaunix.net/uid-20672257-id-3147337.html 一.kobject的定义:kobject是Linux2.6引入的设备管理机制,在内核中由struct kobject结构表示,这个结构使所有设备在底层都具有统一的接口.kobject提供了基本的对象管理能力,是构成Linux2.6设备模型的核心结构,它与sysfs文件系统紧密联系,每个在内核中注册kobject对象都对应与sysfs文件系统中的一个目录;kobject--->sys…
catalog . 设备驱动程序简介 . I/O体系结构 . 访问设备 . 与文件系统关联 . 字符设备操作 . 块设备操作 . 资源分配 . 总线系统 1. 设备驱动程序简介 设备驱动程序是内核的关键领域,在很多时候,判断一个操作系统的性能时,主要是通过现有驱动程序可用的外设数目和驱动程序对外设的支持程序来判断,例如 . 显卡驱动能够多大程序地发挥显卡硬件本身的性能 . 网卡驱动能否100%挖掘硬件的处理速度 .. 因此,内核源代码的相当大一部分是在致力于设备驱动程序的实现设备驱动程序基于中心…
linux 平台总线的实现有三大块  , platform bus , platform device , platform drvice 平台类型结构体: /** * struct bus_type - The bus type of the device * * @name: The name of the bus. * @bus_attrs: Default attributes of the bus. * @dev_attrs: Default attributes of the dev…
第18章 调试 调试内核艰难且风险高,关键在于对内核的深刻理解. 18.1 准备开始 需要的是: 一个bug 一个藏匿bug的内核版本 相关内核代码的知识和运气 内核中的bug不是很清晰,调试成功的关键点在于精确的重现一个bug. 18.2 内核中的bug 内核bug多种多样,表象也变化多端: 明白无误的错误代码 同步时发生的错误 错误管理硬件 降低程序运行性能 毁坏数据 使系统死锁 bug展现出来往往是经历一系列的连锁反应,内核调试没有特别难,但也有一些独特的问题:如定时限制和竞争条件,这些是…
目录 . 引言 . 页表 . 结构化内存管理 . 物理内存的管理 . SLAB分配器 . 处理器高速缓存和TLB控制 . 内存管理的概念 . 内存覆盖与内存交换 . 内存连续分配管理方式 . 内存非连续分配管理方式 . 虚拟内存的概念.特征及其实现 . 请求分页管理方式实现虚拟内存 . 页面置换算法 . 页面分配策略 . 页面抖动和工作集 . 缺页异常的处理 . 堆与内存管理 0. 引言 有两种类型的计算机,分别以不同的方法管理物理内存 . UMA计算机(一致内存访问 uniform memor…
转自:http://www.wowotech.net/linux_kenrel/device_resource_management.html . 前言 蜗蜗建议,每一个Linux驱动工程师,都能瞄一眼本文. 之所以用“瞄”,因此它很简单,几乎不需要花费心思就能理解.之所有这建议,是因为它非常实用,可以解答一些困惑,可以使我们的代码变得简单.简洁.先看一个例子: : /* drivers/media/platform/soc_camera/mx1_camera.c, line 695 */ :…
转载: http://blog.csdn.net/wuhzossibility/article/details/8079025 http://blog.chinaunix.net/uid-27717694-id-4286337.html 内核通知链 1.1. 概述 Linux内核中各个子系统相互依赖,当其中某个子系统状态发生改变时,就必须使用一定的机制告知使用其服务的其他子系统,以便其他子系统采取相应的措施.为满足这样的需求,内核实现了事件通知链机制(notificationchain). 通知…
本文将对Linux系统中的sysfs进行简单的分析,要分析sysfs就必须分析内核的driver-model(驱动模型),两者是紧密联系的.在分析过程中,本文将以platform总线和spi主控制器的platform驱动为例来进行讲解.其实,platform机制是基于driver-model的,通过本文,也会对platform机制有个简单的了解. 内核版本:2.6.30 1. What is sysfs? 个人理解:sysfs向用户空间展示了驱动设备的层次结构.我们都知道设备和对应的驱动都是由内…
转自:http://blog.chinaunix.net/u1/51562/showart_1076295.html 一:前言 在设备模型中,sysfs文件系统用来表示设备的结构.将设备的层次结构形象的反应到用户空间中.用户空间 可以修改sysfs中的文件属性来修改设备的属性值,今天我们就来详细分析一下,sysfs的实现. 二:sysfs的初始化和挂载 Sysfs文件系统的初始化是在sysfs_init()中完成的,代码如下: int __init sysfs_init(void) { int …
  Linux设备模型——设备驱动模型和sysfs文件系统解读 内核版本:2.6.30 1. What is sysfs? 个人理解:sysfs向用户空间展示了驱动设备的层次结构.我们都知道设备和对应的驱动都是由内核管理的,这些对于用户空间是不可见的.现在通过sysfs,可以在用户空间直观的了解设备驱动的层次结构. 我们来看看sysfs的文件结构: [root@yj423 /sys]#ls block     class     devices   fs        module bus   …
include/linux/i2c.h struct i2c_msg;struct i2c_algorithm;struct i2c_adapter;struct i2c_client;struct i2c_driver;union i2c_smbus_data; I2C驱动主要包含三部分:I2C核心.I2C总线驱动.I2C设备驱动,它们主要的数据结构在目录:/include/linux/i2c.h struct i2c_driver /* * A driver is capable of ha…
int platform_driver_register(struct platform_driver *drv) { drv->driver.bus = &platform_bus_type;/*关联总线*/ /*关联driver的设备方法*/ if (drv->probe) drv->driver.probe = platform_drv_probe; if (drv->remove) drv->driver.remove = platform_drv_remov…
原文网址:http://blog.chinaunix.net/uid-28685940-id-3889878.html /*************************************************************************************************************************************//* bus.c */ /* *  linux/drivers/mmc/core/bus.c * *  Cop…
bus,device,driver三个很重要的概念贯穿Linux内核驱动架构,特转载一篇博文: (转载自http://blog.csdn.net/gdt_a20/article/details/6425894) 内核的开发者将总线,设备,驱动这三者用软件思想抽象了出来,巧妙的建立了其间的关系,使之更形象化.结合前面所学的知识,总的来说其三者间的关系为bus有两条链表,分别用于挂接设备和驱动,指定了其自身bus的device或者driver最后都会分别连接到对应bus的这两条链表上,而总线又有其始…
原文网址:http://www.xuebuyuan.com/1023185.html 1. repo init -u git://review.sonyericsson.net/platform/manifest -b volatile-jb-mr1-yangtze2. https://wiki.sonyericsson.net/androiki/CN3-II/Bringup_Trail_FC34  如何编译3. https://wiki.sonyericsson.net/androiki/PL…
i2c_devinfo全局链表: __i2c_board_list 用来挂接 i2c_board_info,这个信息用来生成 i2c_client i2c_client 链表: i2c_bus_type->p->klist_devices i2c_driver 链表:i2c_bus_type->p->klist_drivers  硬件i2c控制器硬件初始化完成,注册 adapter时,依据__i2c_board_list 中信息生成i2c_client,并挂接在klist_devi…
内核版本:2.6.37参考[作者:kendo的文章(基于内涵版本2.6.12)] 第一部份 Socket套接字的创建 socket 并不是 TCP/IP协议的一部份. 从广义上来讲,socket 是Unix/Linux 抽像的进程间通讯的一种方法.网络 socket 通讯仅仅是其若干协议中的一类.而tcp/ip 又是网络这类中的一种. 从tcp/ip 的解度看 socket ,它更多地体现了用户 API 与协议栈的一个中间层接口层.用户通过调用socket API 将报文递交给协议栈,或者从协议…
目录[-] 一  调试前的准备 二  内核中的bug 三  内核调试配置选项 1  内核配置 2  调试原子操作 四  引发bug并打印信息 1  BUG()和BUG_ON() 2  dump_stack() 五  printk() 1  printk函数的健壮性 2  printk函数脆弱之处 3  LOG等级 4  记录缓冲区 5  syslogd/klogd 6  dmesg 7 注意 8 内核printk和日志系统的总体结构 9  动态调试 六  内存调试工具 1  MEMWATCH 2…