- 博客(55)
- 资源 (23)
- 收藏
- 关注
原创 awk 与 python处理文件效率对比
awk代码简单已经秒杀python了,运行效率如下 python 日志文件大小 内容 统计后输出 awk 不愧为神器awk 代码:#!/usr/bin/awk -fBEGIN{ while (getline "/opt/logs/mobile/hotelorder/stastic.log"
2015-05-16 20:42:38
2064
原创 內核lru链表
struct zone ---> struct zone_lru { struct list_head list; } lru[NR_LRU_LISTS];enum lru_list {LRU_INACTIVE_ANON = LRU_BASE,LRU_ACTIVE_ANON = LRU_BASE + LRU_ACTIVE,LRU
2013-07-23 09:02:13
219
linux情景分析之中断有感
之前一直被x86体系的各种门锁困扰,比如中断门,陷阱门等等。不知道这些和irq_desc的关系。 linux初始化过程中,会完成终端机制的初始化,中断向量表IDT的初始化尤为重要。主要是调用trap_init和init_IRQ两个函数。其中trap_init主要是对一些系统保留的中断向量的初始化,主要是中断向量表前20个陷阱门,都是保留给异常处理的。void __init trap
2013-03-06 22:30:51
295
原创 网口驱动有感
网口驱动架构如上图,很清晰。一直怀疑为什么,在dev目录下找不到网口节点。现在明白了,设备节点一般是给用户层访问的。而根据上图,可得知,网口驱动主要是被网络协议栈调用,而用户层不会直接操作网口驱动,而是一层层的协议栈。不同的网络控制器的驱动都是大致相同的,像dm9000的,static struct platform_driver dm9000_driver = {.driver
2013-01-16 16:12:56
257
原创 笔记
Linux platform driver 机制和传统的device driver机制(即:通过 driver_register 函数进行注册)相比,一个十分明显的优势在于platform机制将设备本身的资源注册进内核,由内核统一管理,在驱动程序中用使用这些资源时,通过platform device提供的标准接口进行申请并使用。 platform 是一个虚拟的地址总线,相比 PCI
2013-01-07 10:10:29
126
原创 内核线程是怎么运行
pid_t kernel_thread(int (*fn)(void *), void *arg, unsigned long flags) 通过这个函数可以创建内核线程,运行一个指定函数fn。但是这个fn是怎么运行的了?pid_t kernel_thread(int (*fn)(void *), void *arg, unsigned long flags){ struct
2013-01-06 11:38:33
1197
原创 kenel thread
再來就是本文主要談的kthreaddTask,這是在LinuxKernel 2.6所引入的機制,在這之前要產生KernelThread需直接使用函式kernel_thread,而所產生的KernelThread父行程會是當下產生KernelThread的行程(或該父行程結束後,改為initTask(PID=1)).在kthreadd的機制下,UserMode與KernelMode Task
2012-12-27 08:36:34
185
原创 编译内核
配置内核时,切忌只改。config或者是configs目录下的默认config,在它们中加了什么配置,一定要在相应的Kconfig文件中加入。这个是必须的,生成配置文件要读Kconfig,这个流程必须有。
2012-12-11 17:48:57
111
原创 linux驱动架构体会
刚开始学习ldd3时,驱动架构以为是围绕这device,device_driver,bus,等等建立起来的。确实是这样,通过这样在内核建立了一个驱动框架去管理它们。然而却错误的理解为实际的驱动硬件的工作也是在那几个结构上,大错特错。举个例子,像块设备驱动,操作硬件工作是在gendisk结构里面实现的,通过register_disk,则可以根据disk里面的设备号在内核建立起device,sysfs
2012-11-20 16:50:53
2391
原创 内核随笔
经常碰到一个函数或者是变量,定义的到处都是,尽管他们都被编译,要看清楚,很多都是static,往往只有一个非static。只是一种技巧。/sys/文件系统里面,/sys/devices里面包含内核里面的设备,但driver却没找到,后来在/sys/bus相应总线里面发现,这个设计诡异。/sys/class里面只是方便用户,里面有所有设备的链接信息。
2012-10-29 11:20:14
109
原创 arm嵌套中断
arm异发生时,硬件会自动保存pc到异常模式下的lr,以及保存cpsr到spsr,把cpsr设置为相应异常模式,把pc设置为相应异常处理程序的入口。这个问题就来了,如果发生嵌套中断,那么会覆盖之前中断的lr,无法返回。为了避免这个问题,在执行ISR之前,会进行模式切换,切换到SVC货系统模式。在相应的模式下构造一个帧,就像一般的函数调用栈帧,保存现场,保存lr,sp等等。接着调用ISR,如果发
2012-10-28 10:25:22
1037
转载 workqueue
1. 什么是workqueueLinux中的Workqueue机制就是为了简化内核线程的创建。通过调用workqueue的接口就能创建内核线程。并且可以根据当前系统CPU的个数创建线程的数量,使得线程处理的事务能够并行化。workqueue是内核中实现简单而有效的机制,他显然简化了内核daemon的创建,方便了用户的编程.工作队列(workqueue)是另外一种将工作推后执行的形式.工
2012-10-21 20:40:04
905
原创 文件系统 随笔
在打开一个文件时,最后往往到磁盘里面寻找inode读入,这个时候会调用相应文件系统的inode的i_ops里面的lookup方法,在ext3中则是ext3_lookup方法,ext3_lookup会调用struct inode *ext3_iget(struct super_block *sb, unsigned long ino),用超级块来获得指定的inode节点返回,并初始化vfs的inod
2012-10-15 19:48:24
195
转载 block层
sys_mount和sys_open-->blkdev_open中都要涉及block_device字段,今天分析sys_mount和块设备层 static int __init genhd_device_init(void) { int err; bdev_map = kobj_map_init(base_probe, &block_subsys
2012-10-11 11:09:46
182
原创 MMU设置问题
我是运行裸板程序中,设置mmu。首先运行start.s,刚开始搬运代码到0x50000000。然后将整个代码的虚拟地址映射到0x50000000上,再跳转到绝对地址上运行。结果在跳转后,出现reset复位。设置MMU后,考虑的东西很多啊还有个问题//cp15_set_vectaddr((unsigned long)(0x50000000)); 很奇怪这里设置
2012-10-07 21:34:25
774
转载 arm位置无关性设计
引言 基于位置无关代码PIC(PositionIndependent Code)的程序设计在嵌入式应用系统开发中具有重要的作用 尤其在裸机状态下开发Bootloader程序及进行内核初始化设计;利用位置无关的程序设计方法还可以在具体应用中用于构建高效率动态链接库,因而深入理解和熟练掌握位置无关的程序设计方法,有助于开发人员设计出结构简单、清晰的应用程序本文首先介绍位
2012-10-06 17:02:08
301
原创 linux内核链接脚本
linux内核链接脚本是vmlinux.lds.S而不是vmlinux.lds,后者是根据前者的输出,因为前者有很多的宏定义,后者则是完整版。make oldconfig的作用,首先可以备份.config,生成.config.old。其次如果刚从别的内核里面拷贝一个.config到该内核,针对原来版本内核的配置文件设置来配置新版本的内核。新版内核中和原来版本内核同时存在的配置项不变,但是新添加
2012-09-28 14:20:42
133
原创 linux内核链接脚本
linux内核链接脚本是vmlinux.lds.S而不是vmlinux.lds,后者是根据前者的输出,因为前者有很多的宏定义,后者则是完整版。make oldconfig的作用,首先可以备份.config,生成.config.old。其次如果刚从别的内核里面拷贝一个.config到该内核,针对原来版本内核的配置文件设置来配置新版本的内核。新版内核中和原来版本内核同时存在的配置项不变,但是新添加
2012-09-28 09:56:41
167
转载 gnu arm汇编
第一部分 Linux下ARM汇编语法尽管在Linux下使用C或C++编写程序很方便,但汇编源程序用于系统最基本的初始化,如初始化堆栈指针、设置页表、操作 ARM的协处理器等。初始化完成后就可以跳转到C代码执行。需要注意的是,GNU的汇编器遵循AT&T的汇编语法,可以从GNU的站点(www.gnu.org)上下载有关规范。一. Linux汇编行结构任何汇编行都是如下结构:[:] [}
2012-09-05 21:35:41
125
转载 高端内存疑惑
高端内存是指物理地址大于 896M 的内存。高端内存含义为:线性地址空间 PAGE_OFFSET + 896M 至4G的最后128M线性地址对于这样的内存,无法在“内核直接映射空间”进行映射。为什么?因为“内核直接映射空间”最多只能从 3G 到 4G,只能直接映射 1G 物理内存,对于大于 1G 的物理内存,无能为力。实际上,“内核直接映射空间”也达不到 1
2012-09-01 15:10:26
1706
原创 linux内核页表
内核里面所有的页表项内容都是物理地址Linux使用段页表作为一级页表,粗页表作为二级页表的基址页表。段页表的标志位定义如下:页表创建函数调用图中给出了alloc_init_section在页表创建中所处的实现位置,本质上它是与alloc_init_pte并行的函数,alloc_init_section被用来创建段页表(
2012-08-30 16:32:18
231
转载 Linux用户空间与内核空间
Linux 操作系统和驱动程序运行在内核空间,应用程序运行在用户空间,两者不能简单地使用指针传递数据,因为Linux使用的虚拟内存机制,用户空间的数据可能被换出,当内核空间使用用户空间指针时,对应的数据可能不在内存中。Linux内核地址映射模型x86 CPU采用了段页式地址映射模型。进程代码中的地址为逻辑地址,经过段页式地址映射后,才真正访问物理内存。
2012-08-30 15:39:57
52138
原创 快速启动
1 概述之所以称为UBOOT方式快速启动,是因为相对于内核方式快速启动,在快速启动的过程中只需经历UBOOT的启动便可进行系统状态的恢复,从而跳过内核的初始化过程。UBOOT方式快速启动的实现是在内核方式快速启动技术的基础上,修改系统映像格式和写入方式,并在UBOOT中添加bootss命令,调整UBOOT的启动流程。2 UBOOT方式快速启动原理2.1 系统启动流程的更改UBO
2012-08-23 10:39:11
652
原创 kobject分析
关于网上的kobject的分析,有意大堆,一下仅作为自己的感悟记录。一个kobject在/sys里面表现是一个目录,而它的属性则表示为该目录里面的文件,可以访问。struct kobject {const char *name;struct list_headentry;struct kobject*parent;struct kset *kset;st
2012-08-15 16:23:18
1421
原创 mtd层次分析
关于mtd的层次分析,网上一大堆,先看看网上怎么说的.MTD(memory technology device内存技术设备)是用于访问memory设备(ROM、flash)的Linux的子系统。MTD的主要目的是为了使新的memory设备的驱 动更加简单,为此它在硬件和上层之间提供了一个抽象的接口。MTD的所有源代码在/drivers/mtd子目录下。我将CFI接口的MTD设备分为四层 (
2012-08-13 14:55:19
1544
原创 linux内核启动设备探测过程
前段时间研究nandflash驱动,很好奇,到底是怎么探测nandflash,以及驱动等等。好吧,现在开始不说了。首先在板级文件里面必须添加设备信息,static struct resource s5pv210_nand_resource[] = {[0] = {.start = 0xB0E00000,.end = 0xB0E00000 + 0x00100000 - 1,
2012-08-12 11:54:26
1920
原创 块设备驱动程序笔记
register_blkdev(sbull_major, "sbull");//该函数只是根据设备号在内核块设备表major_names里面注册一下,没有其他。定义一个块设备 struct sbull_dev { 71 int size; /* Device size in sectors */ 72 u8
2012-08-10 09:31:19
107
原创 printk分析
本人一直好奇怎么通过printk输出信息到串口,于是分析源码。asmlinkage int printk(const char *fmt, ...){va_list args;int r;#ifdef CONFIG_KGDB_KDBif (unlikely(kdb_trap_printk)) {va_start(args, fmt);r = vkdb_pri
2012-08-03 10:04:00
1669
原创 设备模型问题
register_chrdev 没有创建设备节点吗?字符驱动模型似乎跟 device device_driver bus 等等完全没关系????
2012-07-08 20:42:49
89
原创 ok6410移植中碰到问题集锦
内核启动到 Starting kernel ...Uncompressing Linux... done, booting the kernel. 卡死。网上的原因有很多。一个个分析全都没用,最后换了块板子直接pass。想了很多,估计原因是由于我之前的开发箱比较非主流,它是采用onenand flash,在mach-smdk6410.c里面添加onenand分区以及初始化,
2012-07-01 20:03:23
2575
转载 makefile 中的 wildcard 与 patsubst 函数
makefile 里的函数跟它的变量很相似——使用的时候,你用一个 $ 符号跟开括号,函数名,空格后跟一列由逗号分隔的参数,最后用关括号结束。例如,在 GNU Make 里有一个叫 'wildcard' 的函 数,它有一个参数,功能是展开成一列所有符合由其参数描述的文件名,文件间以空格间隔。你可以像下面所示使用这个命令: SOURCES = $(wildcard
2012-06-29 16:58:24
430
原创 RVDS ro基地址设置感悟
有个问题困扰了我一天,就是因为没设置ro基地址,我要读取一个全局变量,在数据段中。刚开始想没设置ro,就会有个默认的基地址,而且代码是地址无关的,所以应该没关系,可是始终读出来的值不是想要的值,很显然数据段地址出错,导致读内存指令得到的值不对。设置ro后,数据段地址也会有设置。但不设置ro,应该也会有默认地址,这个差别可能出现在生成bin文件后绝对是读内存的地址出现偏差,应该多看看RVDS的文档。
2012-06-08 10:31:08
275
原创 读arm体系有感
The ARMarchitecture is a RISC load/store architecture. In other words you must load values frommemory into registers before acting on them. There are no arithmetic or logical instructionsthat ma
2012-06-02 17:16:07
485
原创 arm 清除cache情况
reason:: Changing the memory configuration of a system may require cleaning or flushing acache. The need to clean or flush a cache results directly from actions like changing theaccess permiss
2012-05-31 21:25:48
1443
转载 arm-linux启动过程
本文针对arm linux, 从kernel的第一条指令开始分析,一直分析到进入 start_kernel()函数. 我们当前以linux-2.6.19内核版本作为范例来分析,本文中所有的代码,前面都会加上行号以便于和源码进行对照, 例: 在文件init/main.c中: 00478: asmlinkage void init start_kernel(void) 前面的"00478:" 表示47
2012-05-30 10:33:00
573
转载 ZTEXTADDR和ZRELADDR
例子:***30008000 zImage 是zImage内存中的地址 ==ZRELADDR 解压后的内核运行地址30800000 ramdisk 在内存中地址 ZTEXTADDR following symbol definitions rely on you knowing the translation that__virt_to_phys() does for
2012-05-29 15:37:01
2399
转载 arm-linux解压内核过程
linux-2.6.20.6/arch/arm/boot/compressed/head.S 开头有一段宏定义,我们只看其中一段,分析一下gnu arm汇编的宏定义#elif defined(CONFIG_ARCH_S3C2410).macro loadsp, rb mov \rb,#0x50000000 add \rb, \rb,#0x4000 * CONFIG_S3C2410_
2012-05-29 10:40:19
998
转载 arm-linux编译链接过程
目前只知道编译内核时先make menuconfig进行一些个性化的设置。然后执行make即可在内核源码根目录下得到ELF文件vmlinux,并且在相应体系结构arch/arm/boot目录下得到zImage可执行的压缩内核映像,进而烧写到开发板中。 只是这个过程到底是怎么样的,linux内核如何实现这一系列复杂的链接编译。网上看了点资料,总结一下。 内核编译首先要生成的是vm
2012-05-28 11:17:13
1118
转载 linux各种栈
在linux操作系统中,每次创建一个用户线程,就会创建一个用户态堆栈和一个内核态堆栈;每次创建一个内核线程,就只会创建一个内核态堆栈。用户线程的运行存在三种状态:用户态、基本内核态和中断态。内核线程的运行只存在两中状态:基本内核态和中断态。用户态通过系统调用才能进入基本内核态;当中断发生时,用户态或者基本内核态直接进入中断态。在用户态,使用用户态堆栈,主要负
2012-05-15 18:13:44
503
2440中断测试,启用定时器中断和UART中断
2012-04-19
最新版busybox-1.19.4
2012-03-20
jdk-1_5_0_20-linux-i586.bin
2012-03-20
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人