linux kernel
文章平均质量分 89
ctthuangcheng
这个作者很懒,什么都没留下…
展开
-
linux内核tmpfs/shmem浅析
说起共享内存,一般来说会让人想起下面一些方法:1、多线程。线程之间的内存都是共享的。更确切的说,属于同一进程的线程使用的是同一个地址空间,而不是在不同地址空间之间进行内存共享;2、父子进程间的内存共享。父进程以MAP_SHARED|MAP_ANONYMOUS选项mmap一块匿名内存,fork之后,其子孙进程之间就能共享这块内存。这种共享内存由于受到进程父子关系的限制,一般较少使用;3、原创 2013-05-12 01:12:57 · 8978 阅读 · 0 评论 -
CFS 调度器学习笔记
http://blog.csdn.net/peimichael/article/details/5218335转载 2013-05-14 14:46:45 · 1433 阅读 · 0 评论 -
linux内存管理概述
linux内存管理建立在基本的分页机制基础上,在linux内核中RAM的某些部分将会永久的分配给内核,并用来存放内核代码以及静态内核数据结构。RAM的其余部分称为动态内存,这不仅是进程所需的宝贵资源,也是内核本身所需的宝贵资源。实际上,整个系统的性能取决于如何有效地管理动态内存。因此,现在所有多任务操作系统都在经历优化对动态内存的使用,也就是说,尽可能做到当要时分配,不需要时释放。内存管理是o转载 2013-05-14 16:15:34 · 1593 阅读 · 0 评论 -
backtrace-----打印进程异常退出时的堆栈信息
#include #include "debug_trace.h"#define TRACE_SIZE 1024static void trace_print(int signal_type){ int trace_id = -1; void *buffer[100]; char **info = NULL; trace_id = backtra转载 2013-05-14 16:46:30 · 2810 阅读 · 0 评论 -
在C/C++程序里打印调用栈信息
我们知道,GDB的backtrace命令可以查看堆栈信息。但很多时候,GDB根本用不上。比如说,在线上环境中可能没有GDB,即使有,也不太可能让我们直接在上面调试。如果能让程序自己输出调用栈,那是最好不过了。本文介绍和调用椎栈相关的几个函数。 NAME backtrace, backtrace_symbols, backtrace_symbols_fd -转载 2013-05-14 16:56:18 · 8211 阅读 · 0 评论 -
proc文件系统
一:proc文件系统: (1)proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间。由于系统的信息,如进程,是动态改变的,所以用户或应用程序读取proc文件时,proc文件系统是动态从系统内核读出所需信息并提交的。(2)简要介绍其下文件:/proc/cpuinfo cpu信息/proc/partitions 系统识别的分区表/proc/meminfo 内存信息/proc/up原创 2013-05-31 09:49:05 · 1545 阅读 · 0 评论 -
Ubuntu10.04下Linux内核编译的完整步骤
1、在http://www.kernel.org/上下载最新的内核源代码linux-2.6.33.1.tar.bz2,放在/huangcheng/Linux内核 目录下,huangcheng是Linux OS的第一个用户名。 2、进入Linux内核源码所在的目录(cd Linux内核),解压该内核代码到/usr/src下: sudo tar -xjvf linux-2.6.33.1.tar.bz2原创 2013-05-12 03:13:17 · 1740 阅读 · 0 评论 -
hello 内核模块
#ifndef __KERNEL__# define __KERNEL__#endif#ifndef MODULE# define MODULE#endif#include #include #include MODULE_LICENSE("GPL");static int year=2013;MODULE_PARM(year,"i");int hello_i原创 2013-06-18 17:52:51 · 1694 阅读 · 0 评论 -
内核制作
1. 清除原有配置与中间文件x86: make mrproperarm: make mrproper ARCH=arm2. 配置内核x86: make menuconfigarm: make menuconfig ARCH=arm3. 创建依赖x86: make deparm: make dep ARCH=arm CROSS_COMPILE=arm-linux-4.编译内核x86:原创 2013-06-19 17:29:06 · 1302 阅读 · 0 评论 -
ubuntu cpu频率控制
安装cpufrequtils: sudo apt-get install cpufrequtils查看cpu: sudo cpufreq-info 设置cpu模式: cpufreq-set -g {powersave, userspace, ondemand, conservative, performance} 对应于{最省电(最低频率),用户转载 2014-02-18 15:23:32 · 7681 阅读 · 0 评论 -
CFS进程调度
一、概述linux 2.6.23中采用了一个全新的调度策略CFS(Completely Fair Scheduler)来处理非实时进程。二、主要数据结构1.为了和原先的实时策略更好的融合,linux在实现CFS之余,还将内核的调度策略模块化,添加了新的结构体sched_class用于管理不同的调度器。2.CFS没有用传统的调度器中时间片的概念,而是使用了新的结构体sched转载 2013-05-14 14:43:22 · 2431 阅读 · 0 评论 -
linux内核cfs浅析
linux调度器的一般原理请参阅《linux进程调度浅析》。之前的调度器 cfs之前的linux调度器一般使用用户设定的静态优先级,加上对于进程交互性的判断来生成动态优先级,再根据动态优先级决定进程被调度的顺序,以及调度后可以运行的时间片。 反过来,随着进程的运行,内核可能发现其交互性发生改变,从而调整其动态优先级(奖励睡眠多的交互式进程、惩罚睡眠少的批处理进程)。原创 2013-05-12 01:19:15 · 4058 阅读 · 0 评论 -
linux内核mem_cgroup浅析
memory cgroupmem_cgroup是cgroup体系中提供的用于memory隔离的功能。admin可以创建若干个mem_cgroup,形成一个树型结构。可以将进程加入到这些mem_cgroup中。(类似这样的管理功能都是由cgroup框架自带的。)为了实现memory隔离,每个mem_cgroup主要有两个维度的限制:1、res - 物理内存2、mems原创 2013-05-12 01:20:48 · 4121 阅读 · 0 评论 -
linux异步信号handle浅析
在初学linux编程的时候,一直觉得异步信号handle是个很神奇的东西,用户程序可以使用singal之类的系统调用为某某信号注册一个信号处理函数(handle函数)。 程序的二进制代码在内存中都有着确定的执行流程,为什么收到异步信号以后,程序会被“中断”,然后跳转到这个handle函数里面去运行呢?内核怎么有能力让程序做这样的跳转呢,总不可能临时修改程序的可执行代码吧?原创 2013-05-11 15:43:33 · 2640 阅读 · 0 评论 -
记一个linux内核内存提权问题
前些天,linux内核曝出了一个内存提权漏洞。通过骇客的精心构造,suid程序将print的输出信息写到了自己的/proc/$pid/mem文件里面,从而修改了自己的可执行代码,为普通用户开启了一个带root权限的shell。这个过程还是挺有意思的,不得不佩服骇客们的聪明才智,故在此分享一下,以表崇敬之情。 首先,破解过程使用到了suid程序。suid并不是一个程序,而是可执行文件原创 2013-05-12 01:23:21 · 2285 阅读 · 0 评论 -
linux内存屏障浅析
内存屏障是一个很神奇的东西,之前翻译了linux内核文档memory-barriers.txt,对内存屏障有了一定有理解。现在用自己的方式来整理一下。在我看来,内存屏障主要解决了两个问题:单处理器下的乱序问题和多处理器下的内存同步问题。为什么会乱序现在的CPU一般采用流水线来执行指令。一个指令的执行被分成:取指、译码、访存、执行、写回、等若干个阶段。然后,多条指令可以同时存在于流水原创 2013-05-12 01:24:20 · 2396 阅读 · 0 评论 -
LINUX内核内存屏障
================= LINUX内核内存屏障 =================By: David Howells Paul E. McKenney 译: kouu 出处: Linux内核文档 -- Documentati翻译 2013-05-12 01:28:37 · 1944 阅读 · 0 评论 -
linux文件系统实现浅析
之前有两篇文章整理过linux虚拟文件系统的结构,和linux文件读写的流程。其中一些由具体文件系统类型来实现的地方并没有深入叙述,只是说这是由具体的文件系统来实现的。比如,读写文件的时候,文件的读写位置怎么对应到实际的磁盘块呢?这是由具体的文件系统来实现的;再比如,寻找一个文件路径的时候,怎么知道XXX目录下是否有YYY文件存在呢?这也是由具体的文件系统来实现的。前些天同事问起linux下i原创 2013-05-11 19:45:54 · 2700 阅读 · 0 评论 -
linux网络报文接收发送浅析
对于linux内核来说,网络报文由网络设备来进行接收。设备驱动程序从网络设备中读取报文,通过内核提供的网络接口函数,将报文传递到内核中的网络协议栈。报文经过协议栈的处理,或转发、或丢弃、或被传送给某个进程。网络报文的发送与之相反,进程通过系统调用将数据送入网络协议栈,或者由网络协议栈自己发起报文的发送,然后协议栈通过调用网络接口函数来调度驱动程序,使其将报文传送给网络设备,从而发送出去。本原创 2013-05-11 19:55:45 · 3916 阅读 · 0 评论 -
由mmap引发的SIGBUS
一直以来都觉得使用mmap读文件是非常高效、非常优雅的做法(参见《从"read"看系统调用的耗时》)。mmap之后,就可以通过内存访问的方式访问到文件里的内容,省去了read这样的系统调用。却不曾想过,mmap以后,如果读文件出错会发生什么……今晚看到一篇介绍apache bug的文章,里面说到,apache使用mmap来实现对静态文件的访问。在读文件之前,apache使用stat系统原创 2013-05-12 00:32:01 · 4742 阅读 · 2 评论 -
linux内存管理浅析
[地址映射](图:左中) linux内核使用页式内存管理,应用程序给出的内存地址是虚拟地址,它需要经过若干级页表一级一级的变换,才变成真正的物理地址。 想一下,地址映射还是一件很恐怖的事情。当访问一个由虚拟地址表示的内存空间时,需要先经过若干次的内存访问,得到每一级页表中用于转换的页表项(页表是存放在内存里面的),才能完成映射。也就是说,要实现一次内存访问,实际上内存被访问原创 2013-05-11 19:26:08 · 4802 阅读 · 4 评论 -
Linux动态频率调节系统CPUFreq之一:概述
随着技术的发展,我们对CPU的处理能力提出了越来越高的需求,芯片厂家也对制造工艺不断地提升。现在的主流PC处理器的主频已经在3GHz左右,就算是智能手机的处理器也已经可以工作在1.5GHz以上,可是我们并不是时时刻刻都需要让CPU工作在最高的主频上,尤其是移动设备和笔记本电脑,大部分时间里,CPU其实工作在轻负载状态下,我们知道:主频越高,功耗也越高。为了节省CPU的功耗和减少发热,我们有必要根据转载 2014-02-19 11:28:09 · 2878 阅读 · 0 评论 -
Linux动态频率调节系统CPUFreq之二:核心(core)架构与API
上一节中,我们大致地讲解了一下CPUFreq在用户空间的sysfs接口和它的几个重要的数据结构,同时也提到,CPUFreq子系统把一些公共的代码逻辑组织在一起,构成了CPUFreq的核心部分,这些公共逻辑向CPUFreq和其它内核模块提供了必要的API,像cpufreq_governor、cpufreq_driver等模块通过这些API来完成一个完整的CPUFreq体系。这一节我们就来讨论一下核心转载 2014-02-19 13:46:41 · 2196 阅读 · 0 评论 -
Linux测量kernel子模块加载时间的方法
1. 在文件kernel/init/main.c里面,在接口do_one_initcall( )中,将initcall_debug设置为true,然后编译boot.img2. 使用adb shell cat /proc/kmsg | grep initcall 来查看模块加载时间转载 2014-12-28 01:20:32 · 1579 阅读 · 0 评论 -
Linux 下的一个全新的性能测量和调式诊断工具 Systemtap, 第 2 部分: DTrace
DTrace的原理本系列文章详细地介绍了一个 Linux 下的全新的调式、诊断和性能测量工具 Systemtap 和它所依赖的基础 kprobe 以及促使开发该工具的先驱 DTrace 并给出实际使用例子使读者更进一步了解和认识这些工具。 本文是该系列文章之二,它详细地讲解了 DTrace 的原理。本系列文章之一讲解了 kprobe 的原理、编程接口、局限性和使用注意事项并给出实际使用示例帮助读者转载 2014-12-27 21:12:42 · 1476 阅读 · 0 评论 -
Linux 下的一个全新的性能测量和调式诊断工具 Systemtap, 第 3 部分: Systemtap
Systemtap的原理,Systemtap与DTrace比较,以及安装要求和安装步骤本系列文章详细地介绍了一个Linux下的全新的调式、诊断和性能测量工具Systemtap和它所依赖的基础kprobe以及促使开发该工具的先驱DTrace并给出实际使用例子使读者更进一步了解和认识这些工具。 本文是该系列文章之三,它讲解了Systemtap的原理,Systemtap与DTrace比较,以及安装要求和转载 2014-12-27 21:32:49 · 1587 阅读 · 0 评论 -
Linux 性能监测:CPU
CPU 的占用主要取决于什么样的资源正在 CPU 上面运行,比如拷贝一个文件通常占用较少 CPU,因为大部分工作是由 DMA(Direct Memory Access)完成,只是在完成拷贝以后给一个中断让 CPU 知道拷贝已经完成;科学计算通常占用较多的 CPU,大部分计算工作都需要在 CPU 上完成,内存、硬盘等子系统只做暂时的数据存储工作。要想监测和理解 CPU 的性能需要知道一些操作系统的基转载 2014-12-28 01:05:49 · 1387 阅读 · 0 评论 -
Linux 性能监测:IO
磁盘通常是计算机最慢的子系统,也是最容易出现性能瓶颈的地方,因为磁盘离 CPU 距离最远而且 CPU 访问磁盘要涉及到机械操作,比如转轴、寻轨等。访问硬盘和访问内存之间的速度差别是以数量级来计算的,就像1天和1分钟的差别一样。要监测 IO 性能,有必要了解一下基本原理和 Linux 是如何处理硬盘和内存之间的 IO 的。内存页上一篇 Linux 性能监测:Memory 提到了内存和硬盘之间的 IO转载 2014-12-28 01:14:32 · 1285 阅读 · 0 评论 -
Linux 性能监测:Network
网络的监测是所有 Linux 子系统里面最复杂的,有太多的因素在里面,比如:延迟、阻塞、冲突、丢包等,更糟的是与 Linux 主机相连的路由器、交换机、无线信号都会影响到整体网络并且很难判断是因为 Linux 网络子系统的问题还是别的设备的问题,增加了监测和判断的复杂度。现在我们使用的所有网卡都称为自适应网卡,意思是说能根据网络上的不同网络设备导致的不同网络速度和工作模式进行自动调整。我们可以通过转载 2014-12-28 01:17:00 · 1467 阅读 · 0 评论 -
Linux 性能监控、测试、优化工具
下面的三张图片分别总结了 Linux 各个子系统以及监控、测试、优化这些子系统所用到的工具。监控测试优化from:http://www.vpsee.com/2014/09/linux-performance-tools/转载 2014-12-28 02:14:28 · 1623 阅读 · 0 评论 -
Linux 下的一个全新的性能测量和调式诊断工具 Systemtap,第 1 部分: kprobe
kprobe 的原理、编程接口、局限性和使用注意事项本系列文章详细地介绍了一个Linux下的全新的调式、诊断和性能测量工具Systemtap和它所依赖的基础kprobe以及促使开发该工具的先驱DTrace并给出实际使用例子使读者更进一步了解和认识这些工具。 本文是该系列文章之一,它讲解了kprobe的原理、编程接口、局限性和使用注意事项并给出实际使用示例帮助读者理解和认识kprobe。本系列文章之转载 2014-12-27 20:53:37 · 1114 阅读 · 0 评论 -
Device Mapper 代码分析
Device Mapper(DM)是Linux 2.6全面引入的块设备新构架,通过DM可以灵活地管理系统中所有的真实或虚拟的块设备。DM以块设备的形式注册到Linux内核中,凡是挂载(或者说“映射”)于DM结构下的块设备,不管他们是如何组织,如何通讯,在Linux看来都是一个完整的DM块设备。因此DM让不同组织形式的块设备或者块设备集群在Linux内核面前有一个完整统一的DM表示。一、DM与MD在转载 2014-12-27 22:21:47 · 3646 阅读 · 0 评论 -
Linux 性能监测:Memory
这里的讲到的 “内存” 包括物理内存和虚拟内存,虚拟内存(Virtual Memory)把计算机的内存空间扩展到硬盘,物理内存(RAM)和硬盘的一部分空间(SWAP)组合在一起作为虚拟内存为计算机提供了一个连贯的虚拟内存空间,好处是我们拥有的内存 ”变多了“,可以运行更多、更大的程序,坏处是把部分硬盘当内存用整体性能受到影响,硬盘读写速度要比内存慢几个数量级,并且 RAM 和 SWAP 之间的交换转载 2014-12-28 01:10:09 · 1311 阅读 · 0 评论 -
Linux 性能监测:介绍
看了某某教程、读了某某手册,按照要求改改某某设置、系统设定、内核参数就认为做到系统优化的想法很傻很天真:)系统优化是一项复杂、繁琐、长期的工作,优化前需要监测、采集、测试、评估,优化后也需要测试、采集、评估、监测,而且是一个长期和持续的过程,不是说现在优化了,测试了,以后就可以一劳永逸了,也不是说书本上的优化就适合眼下正在运行的系统,不同的系统、不同的硬件、不同的应用优化的重点也不同、优化的方法也转载 2014-12-28 01:02:50 · 1230 阅读 · 0 评论 -
Linux动态频率调节系统CPUFreq之三:governor
在上一篇文章中,介绍了cpufreq的core层,core提供了cpufreq系统的初始化,公共数据结构的建立以及对cpufreq中其它子部件提供注册功能。core的最核心功能是对policy的管理,一个policy通过cpufreq_policy结构中的governor字段,和某个governor相关联,本章的内容正是要对governor进行讨论。通过前面两篇文章的介绍,我们知道,governo转载 2014-02-19 13:59:47 · 1823 阅读 · 0 评论 -
利用mmap /dev/mem 读写Linux内存
使用 hexedit /dev/mem 可以显示所有物理内存中的信息。 运用mmap将/dev/mem map出来,然后直接对其读写可以实现用户空间的内核操作。以下是我写的一个sample#include#include#include#include#include#includeint main(){ unsigned char * map_base; FILE转载 2014-04-03 19:33:19 · 2051 阅读 · 0 评论 -
Linux块设备加密之dm-crypt分析
相关的分析工作一年前就做完了,一直懒得写下来。现在觉得还是写下来,以来怕自己忘记了,二来可以给大家分享一下自己的研究经验。 这篇文章算是《Device Mapper代码分析》的后续篇,因为dm-crypt是基于dm框架的,因此与上一篇一样,也以2.6.33内核代码为基础来讲述代码的分析过程。但是本文侧重点不同在于着重分析一下三个方面:1、Linux密码管理2、dm-crypt到与Linux密码的关转载 2014-12-27 22:44:15 · 3472 阅读 · 1 评论 -
使用kprobes查看内核内部信息
前言:使用printk打印变量等方法,是调试内核的有效方法之一,但是这种方法必须重新构建并用新内核启动,调试效率比较低。以内核模块的方式使用kprobes、jprobes,就可以在任意地址插入侦测器,执行包括printk在内的各种调试工作,而无须重新构建内核,也无须重启。一、首先内核必须支持kprobes、jprobes:#make menuconfigGeneral setup --->[*]转载 2014-12-28 00:47:34 · 1884 阅读 · 0 评论 -
linux下内存大小、起始地址的解析与修改
在实际的工作中,由于产品型号的不同,经常需要调整linux所管理的内存的大小,而内核在启动阶段,会两次去解析从uboot传递过来的关于内存的信息,具体如下:一、解析从uboot传递过来的tag(在parse_tags中处理)在uboot的do_bootm_linux()函数中,会创建一系列需要传递给内核的tag,所有的tag以链表形式链接到指定的物理内存中。setup_start_tag用来建立起转载 2014-12-28 00:40:45 · 4174 阅读 · 0 评论 -
Linux 下不经过BIOS重启(i386)
前段时间有个项目,要求在Linux下不经过BIOS重启,i386平台。一、可行性分析 众所周知,BIOS中包含了CPU及其他各种设备的初始化代码,Linux系统运行之后是否能够将各种用到的设备返回到刚被BIOS初始化后的状态是是否可行的关键。 从项目的条件来看,外设并不是问题。因为要首先开起来的那个Linux只会用到磁盘系统。而通用的磁盘系统是不存在与启动相关的关键状态的。 另外就是核转载 2014-12-27 22:56:28 · 1566 阅读 · 0 评论