Linux内核
williamwanglei
这个作者很懒,什么都没留下…
展开
-
转载_zImage和uImage的区别
一、简介对于Linux内核,编译可以生成不同格式的映像文件,例如:# make zImage# make uImagezImage是ARM Linux常用的一种压缩映像文件,uImage是U-boot专用的映像文件,它是在zImage之前加上一个长度为0x40的“头”,说明这个映像文件的类型、加载位置、生成时间、大小等信息。换句话说,如果直接从uImage的0x40位置开始执行,z转载 2012-12-14 17:32:34 · 313 阅读 · 0 评论 -
转载_Linux 内核驱动--阻塞与非阻塞机制及Poll/Select分
阻塞操作是指,在执行设备操作时,若不能获得资源,则进程挂起直到满足可操作的条件再进行操作。非阻塞操作的进程在不能进行设备操作时,并不挂起。被挂起的进程进入sleep状态,被从调度器的运行队列移走,直到等待的条件被满足。 在Linux驱动程序中,我们可以使用等待队列(wait queue)来实现阻塞操作。wait queue很早就作为一个基本的功能单位出现在Linux内核里了,它以队列为基转载 2013-08-23 11:20:05 · 649 阅读 · 0 评论 -
转载_uboot传递内核参数全解析
一:启动参数的传递过程 启动参数是包装在数据结构里的,在linux kernel启动的时候,bootloader把这个数据结构拷贝到某个地址, 在改动PC跳向内核接口的同时,通过通用寄存器R2来传递这个地址的值,下面这句话就是uboot跳向linux kernel的代码(bootm命令) theKernel (0, bd->bi_arch_number, bd->bi_boot_p转载 2013-08-12 20:19:22 · 616 阅读 · 0 评论 -
转载_linux 两种方式 创建内核线程
kernel_thread()、daemonize()------------------------------------------------------int thread_func(void *arg){ /* * 设置线程名 -- thread_name,ps可以看到的线程名 * 如果不使用daemonize设置内核线程名,并且kern转载 2013-08-13 16:41:55 · 1868 阅读 · 0 评论 -
转载_linux锁机制
在linux内核中,有很多同步机制。比较经典的有原子操作、spin_lock(忙等待的锁)、mutex(互斥锁)、semaphore(信号量)等。并且它们几乎都有对应的rw_XXX(读写锁),以便在能够区分读与写的情况下,让读操作相互不互斥(读写、写写依然互斥)。而seqlock和rcu应该可以不算在经典之列,它们是两种比较有意思的同步机制。为什么需要内核锁?多核处理器下,转载 2013-04-02 15:01:12 · 1115 阅读 · 0 评论 -
转载_kdump的出现(基于嵌入式Linux的内核错误跟踪技术)
随着嵌入式Linux系统的广泛应用,对系统的可靠性提出了更高的要求,尤其是涉及到生命财产等重要领域,要求系统达到安全完整性等级3级以上[1],故障率(每小时出现危险故障的可能性)为10-7以下,相当于系统的平均故障间隔时间(MTBF)至少要达到1141 年以上,因此提高系统可靠性已成为一项艰巨的任务。对某公司在工业领域14 878个控制器系统的应用调查表明,从2004 年初到2007 年9月底转载 2013-08-26 19:51:05 · 1688 阅读 · 0 评论 -
转载_如何得知深睡眠等各类进程的函数堆栈 -- DW-SW等
1. Abstract.2. Introduction我们开发的时候很痛苦的一件事情就是在进程进入深睡眠以后,没有调试手段,往往这种问题还都是一些很难解的概率性难题,而此时又不知道这个进程到底在什么地方深睡眠了。针对此问题,我开发了相应的驱动(请参考文章后附录的完整源代码)和应用 tool ,大家使用该方法就能够将一个进程的函转载 2013-08-27 10:17:16 · 3174 阅读 · 0 评论 -
转载_Linux内核延时研究与函数代码分析
jiffies 以前提过,但是用来计算函数调用的时间确实显得粒度太大(一个 jiffies = 1ms or 4ms )gettimeofday (用户态)和do_gettimeofday(内核态)用下来感觉不错。粒度可以达到us级别。试验过一个while 循环unsigned long i =0xffffffff; while(i--);按代码来讲,这个时间应该不算短,测出来的时间却是0. 估计转载 2013-08-27 10:18:32 · 691 阅读 · 0 评论 -
转载_Linux内核调试方法
kdb:只能在汇编代码级进行调试; 优点是不需要两台机器进行调试。 gdb:在调试模块时缺少一些至关重要的功能,它可用来查看内核的运行情况,包括反汇编内核函数。 kgdb:能很方便的在源码级对内核进行调试,缺点是kgdb只能进行远程调试,它需要一根串口线及两台机器来调试内核(也可以是在同一台主机上用vmware软件运行两个操作系统来调试)printk() 是调试内核代码时最常转载 2013-08-27 16:00:34 · 2272 阅读 · 0 评论 -
转载_Linux procfs开发指南(部分翻译并做了精简)
Linux Kernel Procfs Guide Chapter 1. Introduction /proc文件系统(procfs)在linux内核中是一个特殊的文件系统,是一个虚拟的文件系统,只存在于内存中 注:proc/sys是sysctl文件,不属于procfs Chapter 2. Managing procfs entries 要使用proc转载 2013-08-09 14:24:38 · 1157 阅读 · 0 评论 -
转载_获取Linux内核未导出符号的几种方式
从Linux内核的2.6某个版本开始,内核引入了导出符号的机制。只有在内核中使用EXPORT_SYMBOL或EXPORT_SYMBOL_GPL导出的符号才能在内核模块中直接使用。然而,内核并没有导出所有的符号。例如,在3.8.0的内核中,do_page_fault就没有被导出。 而我的内核模块中需要使用do_page_fault,那么有那些方法呢?这些方法分别有什么优劣呢?转载 2013-08-28 10:31:18 · 973 阅读 · 0 评论 -
转载_linux内核分析(某位大牛的文章)
启动 当PC启动时,Intel系列的CPU首先进入的是实模式,并开始执行位于地址0xFFFF0处的代码,也就是ROM-BIOS起始位置的代码。BIOS先进行一系列的系统自检,然后初始化位于地址0的中断向量表。最后BIOS将启动盘的第一个扇区装入到0x7C00,并开始执行此处的代码.这就是对内核初始化过程的一个最简单的描述。 最初,Linux核心的最开始部分是用8086汇转载 2013-08-29 15:11:06 · 20150 阅读 · 1 评论 -
转载_Linux 运行时内核分析
我们基于RH9 内核从两部分来分析Linux系统动态运行过程 一: 系统初始化开始,Linux进入保护模式,初始内存系统、中断系统、文件系 统等,直到创建第一个用户进程。 二: 用户进程通过系统调用主动进入内核,CPU 接受中断请求被动执行各种中断服务。 第一部分 系统初始化 进入保护模式 Arch/i386/boot/Setup.s gdt: .fil转载 2013-08-29 13:54:10 · 1802 阅读 · 0 评论 -
转载_armlinux中一些重要的宏-如unlikely、container_of及地址定义
TEXT_OFFSET 内核在RAM中的起始位置相对于RAM起始地址偏移。值为0x00008000./arch/arm/Makefile118 textofs-y := 0x00008000222 TEXT_OFFSET := $(textofs-y)PAGE_OFFSE 内核镜像起始虚拟地址。值为0xC0000000/arch/arm/configs转载 2013-09-03 17:49:33 · 1210 阅读 · 0 评论 -
Linux内核及驱动学习笔记---持续更新
Linux内核及驱动学习笔记1、内核中对于不同数据的提示在你通读 file_operations 方法的列表时, 你会注意到不少参数包含字串 __user. 这种注解是一种文档形式, 注意, 一个指针是一个不能被直接解引用的用户空间地址. 对于正常的编译, __user 没有效果, 但是它可被外部检查软件使用来找出对用户空间地址的错误使用.2、使用scull设备进行原创 2013-06-03 19:20:10 · 1022 阅读 · 0 评论 -
转载_理解poll_wait
poll_wait()是用在select系统调用中的. 一般你的代码会有一个struct file_operations结构, 其中fop->poll函数指针指向一个你自己的函数, 在这个函数里应该调用poll_wait() 当用户调用select系统调用时,select系统调用会 先调用 poll_initwait(&table); 然后调用你的 fop-转载 2013-08-23 10:49:49 · 663 阅读 · 0 评论 -
转载_LINUX内核中的xx_initcall初始化标号
LINUX内核中有很多的初始化指示标志postcore_initcall(), arch_initcall(), subsys_initcall(), device_initcall(), etc. 这些起什么作用呢?查阅源代码(android goldfish-2.6.29)并搜索网上相关文章,对此做一总结。初始化标号先看这些宏的定义(定义在文件include/linux/ini转载 2013-08-09 13:43:55 · 553 阅读 · 0 评论 -
转载_Linux内核的等待队列
Linux内核的同步机制:等待队列Linux内核的等待队列是以双循环链表为基础数据结构,与进程调度机制紧密结合,能够用于实现核心的异步事件通知机制。在Linux2.4.21中,等待队列在源代码树include/linux/wait.h中,这是一个通过list_head连接的典型双循环链表,如下图所示。在这个链表中,有两种数据结构:等待队列头(wait_queue_head_t)和等待队转载 2013-06-07 10:49:20 · 574 阅读 · 0 评论 -
转载_Copy_from_user函数详细分析
copy_from_user函数的目的是从用户空间拷贝数据到内核空间,失败返回没有被拷贝的字节数,成功返回0.这么简单的一个函数却含盖了许多关于内核方面的知识,比如内核关于异常出错的处理.从用户空间拷贝数据到内核中时必须非常小心,如果用户空间的数据地址是个非法的地址,或是超出用户空间的范围,或是那些地址还没有被映射到,都可能对内核产生很大的影响,如oops,或者被造成系统安全的影响转载 2012-12-17 11:11:29 · 346 阅读 · 0 评论 -
转载_内存屏障
首先看看__set_current_state()和set_current_state()函数的区别#define __set_current_state(state_value) \do { current->state = (state_value); } while (0)#define set_current_state(state_value) \set_mb(c转载 2013-02-04 13:44:28 · 478 阅读 · 0 评论 -
转载_gcc内嵌汇编简介
在内嵌汇编中,可以将C语言表达式指定为汇编指令的操作数,而且不用去管如何将C语言表达式的值读入哪个寄存器,以及如何将计算结果写回C 变量,你只要告诉程序中C语言表达式与汇编指令操作数之间的对应关系即可, GCC会自动插入代码完成必要的操作。1、简单的内嵌汇编例:__asm__ __volatile__("hlt"); "__asm__"表示后面的代码为内嵌汇编,"asm"是"__a转载 2013-02-04 13:49:39 · 294 阅读 · 0 评论 -
转载_linux mmap 详解
谨以此文纪念过往的岁月一.前言mmap的具体实现以前在学习内核时学习过,但是对于其中的很多函数是一知半解的,有些只能根据其函数名来猜测其具体的功能,在本文中,一起来重新深入理解其具体的实现。二.mmap的用户层应用void *mmap(void *start,size_t length,int prot,int flags,int fd,off_t offsize);转载 2013-03-06 19:49:14 · 1002 阅读 · 0 评论 -
转载_进程上下文和中断上下文
进程上下文和中断上下文是操作系统中很重要的两个概念,这两个概念在操作系统课程中不断被提及,是最经常接触、看上去很懂但又说不清楚到底怎么回事的两个概念。造成这种局面的原因,可能是原来接触到的操作系统课程的教学总停留在一种浅层次的理论层面上,没有深入去研究。处理器总处于以下三种状态之一:1、内核态,运行于进程上下文,内核代表进程运行于内核空间;2、内核态,运行于中断上下文,内核代表转载 2013-04-03 17:19:29 · 464 阅读 · 0 评论 -
转载_Linux内核中的通用数据结构
Linux内核中实现了一些通用的数据结构,目前我所知的有:双向链表:include/linux/list.h红黑树:include/linux/rbtree.h lib/rbtree.c基数树:include/linux/radix-tree.h lib/radix-tree.c环形链表:include/linux/circ_buf.hLinux内核中的通用数据结构转载 2013-03-21 10:46:50 · 783 阅读 · 0 评论 -
转载_Linux 嵌入式启动以及优化
2推荐以前写了一篇Linux PC启动过程的日记,最近项目中,想优化一下启动过程,减少启动时间.因此研究了我们项目的启动全过程.第一步: BootLoader -- U boot 1 在cpu/arm926ejs/start.s中 a) b reset ; //jump to reset b) set cpsr ;svc mode ,disable I,F转载 2013-04-03 09:56:01 · 634 阅读 · 0 评论 -
转载_Linux内核线程的解释
取自 CentOS4代码:PID TTY STAT TIME COMMAND 1 ? S 0:01 init [3] 2 ? S 0:01 [migration/0] 3 ? SN 0:00 [ksoftirqd/0] 4 ? S 0:00 [migration/1] 5 ? SN 0:00 [ksoftirqd/1] 6 ? S 1277 ? S 0:00 [kjournald] 1转载 2013-04-03 17:37:19 · 717 阅读 · 0 评论 -
转载_linux中断之下半部
[导读]中断方式以异步方式执行并且有可能会打断期待其他重要代码,甚至包括其它中断处理程序的执行,因此为了避免被打断的代码停止的时间过长,中断处理程序应该执行得越快越好。1.中断是内核不可缺少的一部分,但是中断处理程序本身存在一些局限性,a.中断方式以异步方式执行并且有可能会打断期待其他重要代码,甚至包括其它中断处理程序的执行,因此为了避免被打断的代码停止的时间过长,中断处理程序转载 2013-04-03 17:52:54 · 758 阅读 · 0 评论 -
转载_Linux内核/模块开发常见问题集(FAQ)
Linux内核/模块开发常见问题集(FAQ) 转载自水木清华 欢迎大家补充1. 请推荐一些好的Linux内核参考书?2. 源代码问题2.1 如何得到某一版本的Linux内核源代码?2.2 请问xx命令、xx库的源码是哪个文件?2.3 linux-2.x.x.tar转载 2013-04-08 13:22:38 · 893 阅读 · 0 评论 -
转载_工作队列实现机制
walle project android 2.2 and linux 2.6.32一、工作项、工作队列和工作者线程把推后执行的任务叫做工作(work),描述它的数据结构为work_struct ,这些工作以队列结构组织成工作队列(workqueue),其数据结构为workqueue_struct ,而工作线程就是负责执行工作队列中的工作。系统默认转载 2013-04-03 13:30:11 · 827 阅读 · 0 评论 -
转载_Linux内核OOPS调试
以前在写驱动的时候 ,遇到比较多的kernel panic oops 问题,然后 问一些 同事 ,比较多的回答都是加 printk,其实用 GDB 的中的一个功能是能很方便地调试这些问题的。整理了一下,把自己给一家培训学校写的课件 贴上来。•第一章 调试 • •1.1. 工作环境配置 • •1 )安装好编译用的 kernel-source :RedHat转载 2013-04-02 19:53:40 · 1672 阅读 · 0 评论 -
转载_进程上下文VS中断上下文
进程上下文VS中断上下文 内核空间和用户空间是现代操作系统的两种工作模式,内核模块运行在内核空间,而用户态应用程序运行在用户空间。它们代表不同的级别,而对系统资源具有不同的访问权限。内核模块运行在最高级别(内核态),这个级下所有的操作都受系统信任,而应用程序运行在较低级别(用户态)。在这个级别,处理器控制着对硬件的直接访问以及对内存的非授权访问。内核态和用户态有自己的内存映射,即自转载 2013-04-08 13:45:11 · 493 阅读 · 0 评论 -
转载_barrier 和 preempt_disable() 学习
[cpp] view plaincopy#define preempt_disable() \ do{ \ inc_preempt_count(); \ barrier(); \ }while(0) 一、这个barrier 在干什么... 内存屏障出现因为编译器或现在的处理器常会自转载 2013-05-23 11:32:16 · 802 阅读 · 0 评论 -
转载_LKM backdoor研究linux系列--insmod源码分析篇
问题的提出是前一阵和lgx聊天发现,一个被strip的module也可以被成功的 insmod,当时知道一些insmod 的原理觉得不太可能,因为一个正常的module文件 其实就是标准的ELF格式object文件,如果将他的 symtab strip掉的话,那些 printk这类的symbol将不能被正常的解析,理论上是不可能加载成功的,于是 做 了一个简单的module在tur转载 2014-08-08 21:03:49 · 1961 阅读 · 0 评论