摘要:arm-linux启动过程1. kernel运行的史前时期和内存布局在arm平台下,zImage.bin压缩镜像是由bootloader加载到物理内存,然后跳到zImage.bin里一段程序,它专门于将被压缩的kernel解压缩到KERNEL_RAM_PADDR开始的一段内存中,接着跳进真正的kernel去执行。该kernel的执行起点是stext函数,定义于arch/arm/kernel/head.S。在分析stext函数前,先介绍此时内存的布局如下图所示在开发板tqs3c2440中,SDRAM连接到内存控制器的Bank6中,它的开始内存地址是0x30000000,大小为64M,即0x200
阅读全文
随笔分类 - Linux
摘要:广为人知的iptables命令行Netfilter作为Linux内置的主机防火墙,它可以使用iptables命令处理IPv4协议,也可以使用ip6tables命令处理IPv6协议。在iptables之前,Linux 2.2中使用ipchains来配置防火墙,Linux 2.0中则使用ipfwadm,它基于BSD的ipfw命令实现。以下命令在RHEL 6.x上执行通过,但也适用于其他Linux发行版。1.显示防火墙的状态以root权限运行下面的命令:#iptables-L-n-v参数说明:-L:列出规则。-v:显示详细信息。此选项会显示接口名称、规则选项和TOS掩码,以及封包和字节计数。-n:以
阅读全文
摘要:一、概念: 大多数内核子系统都是相互独立的,因此某个子系统可能对其它子系统产生的事件感兴趣。为了满足这个需求,也即是让某个子系统在发生某个事件时通知其它的子系统,Linux内核提供了通知链的机制。通知链表只能够在内核的子系统之间使用,而不能够在内核与用户空间之间进行事件的通知。 通知链表是一个函数链表,链表上的每一个节点都注册了一个函数。当某个事情发生时,链表上所有节点对应的函数就会被执行。所以对于通知链表来说有一个通知方与一个接收方。在通知这个事件时所运行的函数由被通知方决定,实际上也即是被通知方注册了某个函数,在发生某个事件时这些函数就得到执行。其实和系统调用signal的思想差不多。二、
阅读全文
摘要:最近在看《深入理解Linux网络内幕》一书,学习了一下书中讲到的内核通知链方面的知识,写了一个读书笔记和一点代码来加深理解,希望能够对大家有一点帮助。内核通知链在网络方面得到了广泛的使用。1.通知链表简介 大多数内核子系统都是相互独立的,因此某个子系统可能对其它子系统产生的事件感兴趣。为了满足这个需求,也即是让某个子系统在发生某个事件时通知其它的子系统,Linux内核提供了通知链的机制。通知链表只能够在内核的子系统之间使用,而不能够在内核与用户空间之间进行事件的通知。 通知链表是一个函数链表,链表上的每一个节点都注册了一个函数。当某个事情发生时,链表上所有节点对应的函数就会被执行。所以对于..
阅读全文
摘要:做嵌入式 linux 驱动的时候,难免会遇到clock,今天上网查阅关于clock的资料,发现网上大多数资料都是关于linux内核的时钟机制,而不是关于Linux设备驱动的时钟。于是将自己今天学习的经验写出来,跟大家交流交流,有不对的地方希望高手们指出。我会以三星的smdkc220开发板为例。分析代码, 它将clock也看作一种设备,使用前也要register注册一下,但这个register又有别于一般的设备,不会在sysfs下device,driver或bus等目录下生成node。先看注册函数exynos4_register_clocks(void),在arch\arm\mach-exyno
阅读全文
摘要:ARM linux的启动部分源代码简略分析以友善之臂的mini2440开发板为平台,以较新的内核linux-2.6.32.7版本为例,仅作说明之用。当内核映像被加载到RAM之后,Bootloader的控制权被释放。内核映像并不是可直接运行的目标代码,而是一个压缩过的zImage(小内核)。但是,也并非是zImage映像中的一切均被压缩了,映像中包含未被压缩的部分,这部分中包含解压缩程序,解压缩程序会解压缩映像中被压缩的部分。zImage使用gzip压缩的,它不仅仅是一个压缩文件,而且在这个文件的开头部分内嵌有gzip解压缩代码。当zImage被调用时它从arch/arm/boot/compre
阅读全文
摘要:处理模型Linux kernel 的启动包括很多组件的初始化和相关配置,这些配置参数一般是通过command line 进行配置的。在进行后续分析之前,先来理解一下command line 的处理模型: 要处理的对象是一个字符串,其中包含了各种配置信息,通常各个配置之间通过空格进行分离,每个配置的表达形式是如:param=value1,value2或者很简单就是一个rw 。那么kernel 就需要提供对这些参数进行处理的处理函数列表。根据参数的作用以及执行期的先后不同,这些处理函数被定义到不同的段中。针对每一个参数,Kernel 都会到相应的段中查找相应的处理函数,最终进行各个组件的配置。1
阅读全文
摘要:#based on v2.6.26 kernel Linux内核Makefile编译生成内核目标文件的过程直接执行make的编译过程 1.先找到入口点(入口点问题)#编译内核line502,直接执行make默认编译此项all: vmlinux #编译模块line1037,选择编译模块的话会到这里,另外还有其他许多all:target存在,为什么默认执行all: vmlinux ?all: modules2.继续找vmlinux目标 # vmlinux image - including updated kernel symbols# vmlinux目标在line806vmlinux: $(vm
阅读全文
摘要:1. 内核启动地址1.1. 名词解释ZTEXTADDR解压代码运行的开始地址。没有物理地址和虚拟地址之分,因为此时MMU处于关闭状态。这个地址不一定时RAM的地址,可以是支持读写寻址的flash等存储中介。Start address of decompressor. here's no point in talking about virtual or physical addresses here, since the MMU will be off at the time when you call the decompressor code. You normally call
阅读全文
摘要:from http://code.google.com/p/google-styleguide/版本:3.133原作者:Benjy WeinbergerCraig SilversteinGregory EitzmannMark MentovaiTashana Landray翻译:YuleFoxyospaly项目主页:Google Style GuideGoogle 开源项目风格指南 - 中文版PS: 可以对比 Linus的 《Linux内核代码风格》http://blog.csdn.net/shendl/article/details/6230836的C风格指南阅读,看...
阅读全文
摘要:by沈东良/良少http://blog.csdn.net/shendl2011.07.19系统初始化时kernel_init在内核态创建和运行应用程序以完成系统初始化 内核刚刚启动时,只有内核态的代码,后来在init过程中,在内核态运行了一些初始化系统的程序,才产生了工作在用户空间的进程。/* This is a non __init function. Force it to be noinline otherwise gcc736 * makes it inline ...
阅读全文
摘要:By沈东良(良少)http://blog.csdn.net/shendl Linux内核的实现,大量使用了数据结构,包括了数组、链表和散列表。其中用的最多的是双向循环链表。Linux内核使用的是自己定义的链表和散列表,简单而高效,使用方法也非常的别具一格。 研究Linux内核的链表和散列表对于看懂Linux内核源代码有重要的意义。本文基于kernel2.6.39版本进行分析。Linux的链表和散列表定义在include...
阅读全文
摘要:p { margin-bottom: 0.21cm; }h1 { margin-bottom: 0.21cm; }h1.western { font-family: "DejaVu Sans Condensed",sans-serif; font-size: 16pt; }h1.cjk { font-family: "DejaVu Sans Condensed"; font-size: 16pt; font-style: normal; font-weight: bold; }h1.ctl { font-family: "Lohit Hindi
阅读全文
摘要:<!-- @page { margin: 2cm } P { margin-bottom: 0.21cm } H1 { margin-bottom: 0.21cm } H1.western { font-family: "DejaVu Sans", sans-serif; font-size: 16pt } H1.cjk { font-family: "DejaVu Sans"; font-size: 16pt } H1.ctl { font-family: "Lohit Hindi"; font-size: 16pt } H2
阅读全文
摘要:<!--@page { margin: 2cm }PRE.cjk { font-family: "DejaVu Sans", monospace }P { margin-bottom: 0.21cm }A:link { so-language: zxx }--> 内核的链表list_head设计相当巧妙。今天我说一下对list_head链表的遍历时如何删除元素。 链表遍历时,如果删除当前元素,一般都是会出错的。在所有语言的各种库中的链表都是如此。list_head也一样。<!--@page { margin: 2cm }P { margin-bottom:
阅读全文
摘要:什么是Oops?从语言学的角度说,Oops应该是一个拟声词。当出了点小事故,或者做了比较尴尬的事之后,你可以说"Oops",翻译成中国话就叫做“哎呦”。“哎呦,对不起,对不起,我真不是故意打碎您的杯子的”。看,Oops就是这个意思。在Linux内核开发中的Oops是什么呢?其实,它和上面的解释也没什么本质的差别,只不过说话的主角变成了Linux。当某些比较致命的问题出现时,我们的Linux内核也会抱歉的对我们说:“哎呦(Oops),对不起,我把事情搞砸了”。Linux内核在发生kernel panic时会打印出Oops信息,把目前的寄存器状态、堆栈内容、以及完整的Call
阅读全文
摘要:悄悄地进入Linux内核调试(一) 本文基址:http://blog.csdn.net/cugxueyu/archive/2007/12/21/1957740.aspx※ 调试工作艰苦,是内核级开发区别于用户级开发的一个显著特点。※ 驾驭内核调试的能力,很大程度上取决于经验和对整个操作系统的把握。一、调试前的准备 内核级bug具有行为不可靠,定义不清晰或者说很难再现的诸多特定,为内核级的bug跟踪和调试带来了很大的困难。 ※ 对于一些定义不清楚地bug,问题的关键就是找到bug的源头,很多时候,当你精确地重现一个bug的时候,你就离成功不远了。二、内核中的bug 从隐藏在源代码中的错误到展现在
阅读全文
摘要:结合自己的实践和网上的文章,介绍手工调试内核bug的通用方法。1.步骤1).Collect oops output, System.map, /proc/ksyms, vmlinux, /proc/modules 2).Use ksymoops to interpret oops Instructions is /usr/src/linux/Documentation/oops-tracing.txt Ksymoops(8) man page (http://www.die.net/doc/linux/man/man8/ksymoops.8.html) 2.简单分析1)Ksymoops dis
阅读全文
摘要:我的Linux自动mount NTFS分区时,在我解压文件夹时总用一些文件报错。 我用ls -lia命令查看了一下权限,发现自动mount的NTFS分区的所有人是root,属于plugdev这个组。 虽然我仍然可以自由copy、remove、edit文件, 但是解压总是报错。 我试图使用chmod和chown对整个NTFS分区的文件和文件夹修改属主为我,修改权限为777。虽然程序提示执行成功,但是执行ls -lia命令发现这两个命令根本没起作用。 使用sudo vim /etc/fstab,发现配置是这样的。UUID=58D03D91D03D767A /mounts/workdi...
阅读全文
摘要:------------------------------------------ 本文系本站原创,欢迎转载!转载请注明出处:http://ericxiao.cublog.cn/------------------------------------------一:前言前段时间在编译kernel的时候发现rootfs挂载不上。相同的root选项设置旧版的image却可以。为了彻底解决这个问题。研究了一下rootfs的挂载过程。特总结如下,希望能给这部份知识点比较迷茫的朋友一点帮助。二:rootfs的种类总的来说,rootfs分为两种:虚拟rootfs和真实rootfs.现在kernel的发展
阅读全文