随笔分类 -  Linux

摘要:使用printk打印变量等方法,是调试内核的有效方法之一,但是这种方法必须重新构建并用新内核启动,调试效率比较低。以内核模块的方式使用kprobes、jprobes,就可以在任意地址插入侦测器,执行包括printk在内的各种调试工作,而无须重新构建内核,也无须重启。一、首先内核必须支持kprobes、jprobes:#make menuconfigGeneral setup --->[*] Kprobes使内核支持kprobes。二、kprobes的使用方法:1、分配一个kprobe结构体供kprobes运行时使用。2、在kprobe结构体的addr成员中设置要插入侦测器的函数地址,可以 阅读全文
posted @ 2013-12-29 16:14 jeremyatchina 阅读(692) 评论(0) 推荐(0)
摘要:缺頁異常被觸發通常有兩種情況——1.程序設計的不當導致訪問了非法的地址2.訪問的地址是合法的,但是該地址還未分配物理頁框下面解釋一下第二種情況,這是虛擬內存管理的一個特性。盡管每個進程獨立擁有3GB的可訪問地址空間,但是這些資源都是內核開出的空頭支票,也就是說進程手握着和自己相關的一個個虛擬內存區域(vma),但是這些虛擬內存區域並不會在創建的時候就和物理頁框掛鉤,由於程序的局部性原理,程序在一定時間內所訪問的內存往往是有限的,因此內核只會在進程確確實實需要訪問物理內存時才會將相應的虛擬內存區域與物理內存進行關聯(为相應的地址分配頁表項,並將頁表項映射到物理內存),也就是說這種缺頁異常是正常的 阅读全文
posted @ 2013-12-23 13:34 jeremyatchina 阅读(1352) 评论(0) 推荐(0)
摘要:Linux 的 time 指令Linux 有個很有意思的 time 指令,可以用來查看另一個指令的執行時間,例如執行 time helloworld 會顯示 helloworld 這支程式的執行時間。time 指令的返回值包含「實際時間 (real time)」、「用戶態 CPU 時間 (user CPU time)」及「核心態 CPU 時間 (system CPU time)」。其中,real time 表示後面所接的指令或程式從開始執行到結束終止所需要的時間。簡單講,當一個程式開始執行瞬間看一下手錶記下時間,當程式結束終止瞬間再看一次手錶,兩次的時間差就是 real time。user C 阅读全文
posted @ 2013-12-09 15:06 jeremyatchina 阅读(871) 评论(0) 推荐(0)
摘要:Hi there,I've upgraded a number of test systems to the latest Saucy beta. I've seen quite a few cases of processes being killed by lowmemorykiller with the following entries being logged:[ 291.565121] lowmemorykiller: send sigkill to 4476 (python), adj 0, size 8864[23515.006794] lowmemorykil 阅读全文
posted @ 2013-12-09 12:01 jeremyatchina 阅读(729) 评论(0) 推荐(0)
摘要:addr2line探秘在Linux下写C/C++程序的程序员,时常与Core Dump相见。在内存越界访问,收到不能处理的信号,除零等错误出现时,我们精心或不精心写就的程序就直接一命呜呼了,Core Dump是Linux仁慈地留下的程序的尸体,帮助程序员们解决了一个又一个问题。有时配置不给力,Linux直接毁尸灭迹,没有了Core文件;又有时,刚好磁盘空间不足,Core文件写不下了。没有Core文件的时候,如何知道程序在什么地方出错了呢?addr2line就在这时派上用场。这是一个示例程序,func函数返回参数a除以参数b的结果。这里使用0作为除数,结果就是程序因为除以0导致错误,直接中断了。 阅读全文
posted @ 2013-12-09 11:58 jeremyatchina 阅读(598) 评论(0) 推荐(0)
摘要:PAGE_SIZE & PAGE_SHIFT & _AC()在大多系统下,PAGE_SIZE被定义为 4k 大小,即 4096 字节。在 x86 系统里,PAGE_SIZE 和 PAGE_SHIFT 都定义在 include/asm-x86/page.h 头文件中:/* PAGE_SHIFT determines the page size */#define PAGE_SHIFT 12#define PAGE_SIZE (_AC(1,UL) << PAGE_SHIFT)_AC 宏被定义在 /inux/const.h 中:引用#ifdef __ASSEMBLY__# 阅读全文
posted @ 2013-11-29 00:24 jeremyatchina 阅读(2594) 评论(1) 推荐(2)
摘要:Blue : User Space 128TBRed : Kernel Space 512MBThe rest of the address space goes to various parts of the system, along with a few unusable holes.-----------Virtual memory map with 4 level page tables:0000000000000000 - 00007fffffffffff (=47 bits) user space, different per mmhole caused by [48:63] . 阅读全文
posted @ 2013-11-28 21:24 jeremyatchina 阅读(2174) 评论(0) 推荐(0)
摘要:This tutorial will outline the process to compile your own kernel for Ubuntu. It will demonstrate both the traditional process using ‘make’ and ‘make install’ as well as the Debian method, using ‘make-dpkg’. This is the detailed version of this tutorial, seeCompile Linux Kernel on Ubuntu 12.04 LTSfo 阅读全文
posted @ 2013-11-25 16:33 jeremyatchina 阅读(462) 评论(0) 推荐(0)
摘要:LINUX中断描述符初始化@CopyLeft by ICANTH,I Can do ANy THing that I CAN THink!~Author:WenHui,WuHan University,2012-6-4硬件产生中断之后,需要通过门描述符来寻找中断的处理程序入口。门描述符和段描述符一样,8个字节。门描述符大体分为:段偏移、段选择子以及DPL。段选择子用于在GDT中寻找到门段基址,DPL用于控制当前进程中断或异常访问权限。当发生中断时,将门描述符所指向的段基地放入%cs,将段偏移放入%eip,转入相应服务。门描述符结构如下:任务门描述符:用于在发生中断时调度相应进程中断门描述符:描 阅读全文
posted @ 2013-10-20 11:44 jeremyatchina 阅读(583) 评论(0) 推荐(0)
摘要:$cat /proc/cpuinfo查看flags 欄位中是否有 lm (long mode) 阅读全文
posted @ 2013-10-19 22:51 jeremyatchina 阅读(171) 评论(0) 推荐(0)
摘要:Linux.中断处理.入口x86平台entry_32.SLinux.中断处理.入口x86平台entry_32.S在保护模式下处理器是通过中断号和IDTR找到中断处理程序的入口地址的。IDTR存的是一个32位的IDT起始地址和一个16位的IDT长度,理论上IDTR和GDTR一样都能支持8192个中断门(65536字节),但x86只能支持256个中断,所以实际上IDTR的最大有效限长只是2048字节。在这256个中断中,前0×20个中断号被处理器保留用作陷阱(Trap)、故障(Fault)和终止(Abort)。而第0×80号中断号则被Linux用来提供作为用户层程序陷入内核的系 阅读全文
posted @ 2013-10-18 15:29 jeremyatchina 阅读(1590) 评论(0) 推荐(0)
摘要:中断处理函数数组interrupt[]初始化2011-05-13 15:51:40分类:LINUX在系统初始化期间,trap_init()函数将对中断描述符表IDT进行第二次初始化(第一次只是建一张IDT表,让其指向ignore_intr函数),而在这次初始化期间,系统的0~19号中断(用于分NMI和异常的中断向量)均被设置好。与此同时,用于系统调用的0x80号向量也已被设置。然而,对于外部中断的初始化 却没有在这个函数中进行。而是在函数init_IRQ中。仔细想一想内核这样做,的确是使代码清晰又有条理。1)trap_init -----> 内部中断异常和NMI(中断向量号:0~19)2 阅读全文
posted @ 2013-10-18 14:36 jeremyatchina 阅读(628) 评论(0) 推荐(0)
摘要:[转]修复ubutnu12.04+win7的grub2引导原文位置:http://wenku.baidu.com/view/b6b7c9926bec0975f465e2f8.htmlps:我使用的是ubuntu12.04+win7操作系统,但是在重装win7后,ubuntu已经被隐藏了。因此需修复grub2。依据原文进行修改。使用liveCD,进入tryubuntu,然后等待系统初始完成。打开虚拟终端,输入如下内容:#sudo-i#fdisk-l可在此处找到到一个linux的分区,如果你不清楚自己的ubuntu安装在哪个分区位置,这个就可以看到。#mount/dev/sda7/mnt我的ubu 阅读全文
posted @ 2013-10-17 16:44 jeremyatchina 阅读(191) 评论(0) 推荐(0)
摘要:前提:已裝好Fedora 6 core 2.6.18 ,在Fedora 6 中compile linux kernel。1.下載 Fedora 6 core 2.6.18 http://www.kernel.org/ ftp://ftp.kernel.org/pub/linux/kernel/v2.6/linux-2.6.18.tar.bz22.解壓縮linux-2.6.18.tar.bz2 ,進入解壓縮的目錄make cleancp /usr/src/kernels/2.6.18-1.2798.fc6-i586/.config .make oldconfigmake -j4 ... 阅读全文
posted @ 2013-10-17 12:08 jeremyatchina 阅读(275) 评论(0) 推荐(0)
摘要:初探linux中断系统(2)中断系统初始化的过程用来初始化中断系统的函数位于arch/x86/kernel/irqinit.c,定义如下void __init init_IRQ(void){ int i; /* * On cpu 0, Assign IRQ0_VECTOR..IRQ15_VECTOR's to IRQ 0..15. * If these IRQ's are handled by legacy interrupt-controllers like PIC, * then this configuration will likely be sta... 阅读全文
posted @ 2013-10-17 10:20 jeremyatchina 阅读(395) 评论(0) 推荐(0)
摘要:1. 重要接口LDD上说,“内核维护了一个中断信号线的注册表,该注册表类似于I/O端口的注册表。模块在使用中断前要先请求一个中断通道(或者中断请求IRQ),然后在使用后释放该通道。”撇开系统如何遍历各个设备进行初始化,上面两句话说的实际上就是指两个接口函数:externint __must_check request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags, constchar*name, void*dev); externvoid free_irq(unsigned int, void*);顾名思义,以 阅读全文
posted @ 2013-10-17 10:19 jeremyatchina 阅读(415) 评论(0) 推荐(0)
摘要:IDT表的初始化linux内核的中断描述符表IDT是一个全局的数据,在i386平台上被定义为:struct desc_struct idt_table[256] __attribute__((__section__(".data.idt"))) = { {0, 0}, };(摘自arch/kernel/i386/traps.c)其中每一个表项均是一个desc_struct结构,该结构被定以为:struct desc_struct {unsigned long a,b;};(摘自/inlcude/asm-i386/processor.h)。可以看出IDT表共256个表项,每一 阅读全文
posted @ 2013-10-14 17:11 jeremyatchina 阅读(867) 评论(0) 推荐(0)
摘要:要使用中断肯定得初始化,这些初始化在系统启动时已经为你做好了,但是我们还是来看看怎样初始化的,这样就能更好的理解中断机制了。先看下面函数:355void__init init_ISA_irqs(void)356{357inti;358//省略了一些代码362 init_8259A(0);363364for(i=0;ichip=chip;}函数__set_irq_handler()定义如下(kernel/irq/chip.c):void__set_irq_handler(unsignedintirq,irq_flow_handler_t handle,intis_chained,constcha 阅读全文
posted @ 2013-10-14 17:01 jeremyatchina 阅读(703) 评论(0) 推荐(0)
摘要:紀錄 Terminal 下指令的過程http://asciinema.org/ 阅读全文
posted @ 2013-10-05 12:22 jeremyatchina 阅读(205) 评论(0) 推荐(0)
摘要:在Protected Mode下,一个重要的必不可少的数据结构就是GDT(Global Descriptor Table)。为什么要有GDT?我们首先考虑一下在Real Mode下的编程模型:在Real Mode下,我们对一个内存地址的访问是通过Segment:Offset的方式来进行的,其中Segment是一个段的Base Address,一个Segment的最大长度是64 KB,这是16-bit系统所能表示的最大长度。而Offset则是相对于此Segment Base Address的偏移量。Base Address+Offset就是一个内存绝对地址。由此,我们可以看出,一个段具备两个因素 阅读全文
posted @ 2013-09-30 09:26 jeremyatchina 阅读(404) 评论(1) 推荐(1)