![](https://img-blog.csdnimg.cn/20201014180756757.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
内核编程
dianhuiren
这个作者很懒,什么都没留下…
展开
-
2.6的系统调用
下面的代码大家可以在entry-common.S中找到。 在2.6.21中,认真研究大家会发现,你回避不了这样一个概念,EABI是什么东西? 内核里面谈EABI,OABI,其实相对于系统调用的方式,当然我们所说的系统限于arm系统。 EABI (Extended ABI),说的是这样的一种新的系统调用方式 mov r7, #num swi 0x0 原来的系统转载 2012-02-25 11:13:20 · 648 阅读 · 0 评论 -
ARM linux hard soft irq
今天在ChinaUnix论坛内核源码版上与linuxfellow网友讨论到hardirq和softirq的问题,虽 然在《深入Linux设备驱动程序内核机制》(以下简称“ILDD”)第5章“中断处理”对此已有详细的解读,但是我觉得还是有必要再花点时间深入探讨一 下这两者的区别。因为此前关于ARM上的中断处理我已经在另一篇帖子解密ARM based Linux内核中断处理框架 中讨论过,所以下面转载 2012-02-25 21:54:22 · 2364 阅读 · 0 评论 -
内核调试
1.调试技术内核编程带来了它自己的,独特的调试挑战。内核代码不能简单地在调试器中执行,也不能被简单地跟踪,因为它是一组不与特定进程相关的功能。内核代码的错误非常难重现并且可能导致整个系统崩溃,因此破坏很多用来发现它们的证据。本章将介绍在如此恼人的情况下你可以用来监视内核代码和跟踪错误的技术。1.1.内核中的调试支持在第二章中,我们建议你编译和安装你自己的内核,而不是运行你所使用的发转载 2012-02-14 09:31:32 · 7489 阅读 · 1 评论 -
Linux内核调试技术指南
前两天,完成了ucos在2440上的移植,以及boot的修改。今天突然想到,我在linux下,该如何来编写,调试比较复杂的驱动。我想这个问题应该从如何调试内核入手,先转载两个文字,待西西看来。系统搭建过程中,对于系统平台搭建工程师在完成Bootloader 的调试之后就进入Kernel 裁减移植的阶段,其中最重要的一步是Kernel 启动的调试,在调试Kernel过程中通常遇到最常见的问题是启转载 2012-02-13 20:45:36 · 2883 阅读 · 0 评论 -
Scsi命令队列转换为ata命令过程
Libata driver里用struct ata_queued_cmd结构来描述一个命令,libata driver的ata命令来自libata自身初始化和错误处理以及scsi middle layer。Libata driver 将ata_scsi_queuecmd作为hostt->queuecommand的回调函数,scsi命令在libata driver里面分两部分执行转载 2011-12-30 10:07:03 · 6049 阅读 · 1 评论 -
内核移植相关
嵌入式Linux内核移植相关代码分析 [转载请注明出处,www.linuxforum.net,作者:张洪耿,patrick_zhg@hotmail.com] 本文通过整理之前研发的一个项目(ARM7TDMI +uCLinux),分析内核启动过程及需要修改的文件,以供内核移植者参考。整理过程中也同时参考了众多网友的帖子,在此谢过。由于整理过程匆忙,难免错误及讲解的不够清楚之处,请各转载 2012-02-03 19:32:24 · 1110 阅读 · 0 评论 -
内核同步机制
为了避免并发,防止竞争。内核提供了一组同步方法来提供对共享数据的保护。 我们的重点不是介绍这些方法的详细用法,而是强调为什么使用这些方法和它们之间的差别。Linux 使用的同步机制可以说从2.0到2.6以来不断发展完善。从最初的原子操作,到后来的信号量,从大内核锁到今天的自旋锁。这些同步机制的发展伴随 Linux从单处理器到对称多处理器的过度;伴随着从非抢占内核到抢占内核的过度。锁机制越来越有转载 2012-01-31 09:46:46 · 963 阅读 · 0 评论 -
mtd Nand驱动
大约用了两个礼拜不到的时间为公司的IPcamera系统写了基于MTD的NAND驱动(linux-2.6.22.10内核),目前已可以在该驱动的支持下跑cramfs和jffs2文件系统,另外,该驱动也可以同时支持small page(每页512 Byte)和big page(每页2048 Byte)两种NAND芯片。在此整理一下与NAND驱动相关的概念,结构体,驱动框架和流程,同时分析一下基于M转载 2012-01-16 20:59:13 · 2009 阅读 · 0 评论 -
内核空间与用户空间的内存映射
严格来说,对于内核空间不能称为内存映射,应为内存重映射才对,例如将pci设备的内存空间映射到处理器的地址空间,其处理步骤如下:request_mem_region(start,n,name)#define request_mem_region(start,n,name) __request_region(&iomem_resource, (start), (n), (name))转载 2012-03-01 17:31:19 · 2043 阅读 · 0 评论 -
slab slub和内存管理
内核对象缓冲区管理Linux 内核在运行过程中,常常会需要经常使用一些内核的数据结构(对象)。例如,当进程的某个线程第一次打开一个文件的时候,内核需要为该文件分配一个称为 file 的数据结构;当该文件被最终关闭的时候,内核必须释放此文件所关联的 file 数据结构。这些小块存储空间并不只在某个内核函数的内部使用,否则就可以使用当前线程的内核栈空间。同时,这些小块存储空间又是动态变化的,不转载 2012-03-11 19:03:36 · 4215 阅读 · 0 评论 -
linux 页面的回收
关于页面的使用在之前的一些文章中,我们了解到linux内核会在很多情况下分配页面。1、内核代码可能调用alloc_pages之类的函数,从管理物理页面的伙伴系统(管理区zone上的free_area空闲链表)上直接分配页面(见《linux内核内存管理浅析》)。比如:驱动程序可能用这种方式来分配缓存;创建进程时,内核也是通过这种方式分配连续的两个页面,作为进程的thread_info结构和内转载 2012-05-02 14:09:04 · 2726 阅读 · 0 评论 -
Linux中断处理流程
看了一些网络上关于linux中断实现的文章,感觉有一些写的非常好,在这里首先感谢他们的无私付出,然后也想再补充自己对一些问题的理解。先从函数注册引出问题吧。一、中断注册方法在linux内核中用于申请中断的函数是request_irq(),函数原型在Kernel/irq/manage.c中定义:int request_irq(unsigned int irq, irq_handler_t转载 2012-04-17 11:49:34 · 12670 阅读 · 0 评论 -
模块与变量导出
今天折腾红外模块发现个奇怪的现象,当以模块的方式编译红外源码时,不能通过说hkvs_root_dir undefined,但是以build-in方式编译没有任何问题,起初想不通,正好买了本新书ILDD,第一章就是讲内核模块加载的原理,看了看,明白了,原来内核的build-in可以看成整个一个大模块,如果红外模块用build-in方式编译的话当然没有问题,他可以访问本模块内的所有全局变量,但是当红外转载 2012-04-13 19:33:09 · 1471 阅读 · 0 评论 -
kmalloc 与vmalloc
kmalloc()和vmalloc()介绍kmalloc()用于申请较小的、连续的物理内存1. 以字节为单位进行分配,在中2. void *kmalloc(size_t size, int flags)分配的内存物理地址上连续,虚拟地址上自然连续3. gfp_mask标志:什么时候使用哪种标志?如下:———————————————————————————————-情形转载 2012-04-13 17:21:09 · 3841 阅读 · 0 评论 -
kobject的理解
在LINUX中最让人不解的大概就是/sys下面的内容了下面首先让我们来创建一个简单的platform设备,并从这个设备的视角进行深入,在此篇文章的深入过程中,我们只看kobeject的模型我所使用的内核版本号为2.6.26,操作系统的内核版本号为2.6.27-7,暂未发现2.6.27-7与2.6.26的重大不同首先写一个简单的模块#include #include转载 2012-03-11 19:15:27 · 4495 阅读 · 0 评论 -
总线设备驱动模型
Linux设备模型 总线总线是处理器和一个或多个设备之间的通道,在设备模型中, 所有的设备都通过总线相连, 甚至是内部的虚拟"platform"总线。总线可以相互插入。设备模型展示了总线和它们所控制的设备之间的实际连接。在 Linux 设备模型中, 总线由 bus_type 结构表示, 定义在 :struct bus_type { const char转载 2012-01-16 11:15:57 · 702 阅读 · 0 评论 -
关于驱动程序的可移植性
差不多所有的linux内核设备驱动都可以运行在不止一种处理器上。这仅仅因为设备驱动作者遵循一些重要规则。这些规则包括使用合适的变量类型,而不是依赖于特定内存页大小,提防外部数据的大小端模式,设立合适的数据对齐并通过合适接口访问设备内存位置。本文解释了这些规则,展示了依据这些的重要性并给出了使用的例子。内核内部数据类型要牢记的其中一个重要的基本规则就是在写可移植代码时要注意你的变量有多大转载 2011-12-15 15:41:13 · 1628 阅读 · 0 评论 -
bootmem allocator介绍
在系统初始化的时候需要执行一些内存管理,内存分配的任务,这个时候buddy system,slab等并没有被初始化好,此时就引入了一种内存管理器bootmem allocator在系统初始化的时候进行内存管理与分配,当buddy system等初始化好后,在mem_init()中对bootmem allocator进行释放,内存管理与分配由buddy system,slab等进行接管。boot转载 2011-10-24 12:47:16 · 1273 阅读 · 0 评论 -
内存管理实质
1. 内核初始化: * 内核建立好内核页目录页表数据库,假设物理内存大小为len,则建立了[3G--3G+len]::[0--len]这样的虚地址vaddr和物理地址paddr的线性对应关系; * 内核建立一个page数组,page数组和物理页面系列完全是线性对应,page用来管理该物理页面状态,每个物理页面的虚地址保存在page->virtual中; * 内核建转载 2011-10-22 11:46:28 · 484 阅读 · 0 评论 -
内存屏障:barrier()与mb()
对barrier() 我的理解是这只是一个compiler barrier, 这个barrier加入到代码中,会使cache invalidation而mb是hardware barrier,在代码运行中,CPU会prevent from reordering cache visit.转载 2011-10-22 12:00:23 · 1042 阅读 · 0 评论 -
进程切换之__switch_to宏定义
linux内核进程切换最重要的一个部分就是宏定义switch_to,下面从几个方面来详细讲解一下:(1)内嵌汇编(2)memory 破坏描述符(编译器优化)(3)进程切换的标志是什么?(4)堆栈切换的标志是什么?(5)为什么switch_to 提供了三个参数?(6)汇编参数的传递?带着这几个问题,先来大体浏览一下代码#define switch_to(pre转载 2011-10-22 11:42:13 · 1662 阅读 · 0 评论 -
工作队列使用方法
一、用法struct cpu_workqueue_struct { spinlock_t lock; long remove_sequence; /* Least-recently added (next to run) */ long insert_sequence; /* Next to add */转载 2011-10-22 11:37:01 · 2291 阅读 · 0 评论 -
内核启动过程
Linux内核启动流程 arch/arm/kernel/head-armv.S 该文件是内核最先执行的一个文件,包括内核入口ENTRY(stext)到start_kernel间的初始化代码,主要作用是检查CPU ID, Architecture Type,初始化BSS等操作,并跳到start_kernel函数。在执行前,处理器应满足以下状态:r0 - should be 0 r转载 2011-10-21 01:17:39 · 1448 阅读 · 0 评论 -
do_softirq
//// do_IRQ 函数执行完硬件 ISR 后退出时调用此函数。//void irq_exit(void){ account_system_vtime(current); trace_hardirq_exit();原创 2011-10-17 22:28:42 · 1779 阅读 · 0 评论 -
系统时钟与进程调度
深入分析Linux内核源码-第五章进程调度【摘要】本章介绍了Linux系统的时间机制,包括系统时钟和硬件时钟之间的关系、各种时间标准的转换、时钟中断tick的维护;接着介绍了进程调度的几种常见算法、何时进行内核调度及选择相应该调度的进程,并分析了调度程序的实现;最后介绍了进程转载 2011-10-18 22:55:44 · 5115 阅读 · 0 评论 -
内核栈
进程的内核栈一般是2个pages,也就是8kB,所以对于大的数组或结构体,最好kmalloc动态分配,用完后别忘了释放转载 2011-10-18 11:00:36 · 658 阅读 · 0 评论 -
关于do_softirq
/////////////////////// 1.离开这个函数的时候为什么要关闭硬件中断? 代码中的提示是什么意思? //////////////////////// 这是因为do_softirq()函数退出后,通常马上就要进入中断返回过程,也即内核马上就要执行转载 2011-10-17 22:26:39 · 1167 阅读 · 0 评论 -
typecheck
在kernel 2.6.30 的typecheck.h源码中有如下定义#define typecheck(type,x) /({ type __dummy; / typeof(x) __dummy2; / (void)(&__dummy == &__dummy2); / 1; /})这个有什么作转载 2011-10-27 09:15:36 · 996 阅读 · 0 评论 -
设备的探测机制
每种驱动与设备的绑定机制并不相同,如platform_driver_register类型的driver,在驱动加载之前(paltform.c)里已经建立了设备结构,规划好了设备的资源,注册驱动后,驱动按照设备的名字来绑定设备,然后在设备驱动probe里分配资源等;又例如pci或usb设备的绑定是经过总线驱动扫描设备,建立设备结构体,然后设备驱动按照它本身提供的idtables与注册到总线的设备号等转载 2011-12-26 13:42:15 · 838 阅读 · 0 评论 -
PCI 总线枚举
一:前言Pci,是Peripheral Component Interconnect的缩写,翻译成中文即为外部设备互联.与传统的总线相比.它的传输速率较高.能为用户提供动态查询pci deivce.和局部总线信息的方法,此外,它还能自动为总线提供仲裁.在近几年的发展过程中,被广泛应用于多种平台.pci协议比较复杂,关于它的详细说明,请查阅有关pci规范的资料,本文不会重复这些部份.对于驱动工转载 2011-12-22 21:01:13 · 4714 阅读 · 0 评论 -
PCI 总线初始化
在《Linux内核修炼之道》里,文章作者对如何使用Kconfig和Makefile定位内核源码有精彩的阐述。并且该作者还在《Linux那些事儿 之 我是PCI》系列文章中对X86架构下的PCI总线和设备驱动做了很详细的分析。由于工作需要,我在此基础上分析了ARM体系结构的PCI总线驱动,并把心得和笔记整理一下,或许对日后解析其他子系统有所帮助。以下涉及到的Linux内核源码均为2.6.23版本。转载 2011-12-22 15:26:43 · 7627 阅读 · 0 评论 -
Linux Magic System Request Key Hacks
1. 什么是magic SysRq key?这是一种神奇的组合键, 它可以让内核忽略任何正在进行的任务来响应你, 除非内核已经完全锁死. 2. 如何启用magic SysRq key?你需要在编译内核时把"Magic SysRq key(CONFIG_MAGIC_SYSRQ)"选项设置为"yes"(译注: 现在大部分发行版都把SysRq支持编译进了内核,验证命令:转载 2011-12-07 13:48:25 · 1345 阅读 · 0 评论 -
文件系统与块设备
1.高速缓冲区位于VFS与具体文件系统之间。2.磁盘中文件节点中含有strcut address_space字段,该结构与磁盘文件节点对应3.一个struct address_space含有一个或多个缓存页,缓存页的组织方式是通过基树组织起来的便于搜索4.每个缓存页中包含多个缓存块,缓存页的内容在磁盘上不一定连续,但缓冲块中的内容在磁盘上连续5.每个缓冲块对应一个缓冲区首部的结构体转载 2011-11-30 22:04:47 · 2929 阅读 · 0 评论 -
linux文件读写浅析
在《linux内核虚拟文件系统浅析》这篇文章中,我们看到文件是如何被打开、文件的读写是如何被触发的。对一个已打开的文件fd进行read/write系统调用时,内核中该文件所对应的file结构的f_op->read/f_op->write被调用。本文将顺着这条路走下去,大致看看普通磁盘文件的读写是怎样实现的。linux内核响应一个块设备文件读写的层次结构如图(摘自ULK3):转载 2011-12-01 12:42:30 · 1015 阅读 · 0 评论 -
sysfs
一:前言在设备模型中,sysfs文件系统用来表示设备的结构.将设备的层次结构形象的反应到用户空间中.用户空间可以修改sysfs中的文件属性来修改设备的属性值,今天我们就来详细分析一下,sysfs的实现.二:sysfs的初始化和挂载Sysfs文件系统的初始化是在sysfs_init()中完成的,代码如下:int __init sysfs_init(void){ int转载 2011-11-02 14:51:19 · 8716 阅读 · 0 评论 -
start_kernel函数之前的汇编分析
在分析这段代码之前,我们必须先找到汇编代码的入口位置,也就是Bootloader启动linux时所跳转到的地址。内核一般被压缩后保存到FLASH上的,在Bootloader启动Linux之前必须先解压缩内核,关于内核解压缩部分请参照arch/arm/boot/compressed这里面的代码,这里就不细将了。 在进入Linux汇编代码之前,Bootloader的执行影响CPU的状态,其转载 2011-11-21 18:34:49 · 682 阅读 · 0 评论 -
uboot与linux之间参数的传递
U-boot会给Linux Kernel传递很多参数,如:串口,RAM,videofb等。而Linux kernel也会读取和处理这些参数。两者之间通过struct tag来传递参数。U-boot把要传递给kernel的东西保存在struct tag数据结构中,启动kernel时,把这个结构体的物理地址传给kernel;Linux kernel通过这个地址,用parse_tags分析出传递过来的参转载 2011-11-21 17:33:10 · 540 阅读 · 0 评论 -
网络协议的初始化dev_add_pack
在数据包接收过程的那篇笔记中可以知道,在数据包的处理函数netif_receive_skb中,会先看ptype_all中是否有注册的协议,如果有,则调用相应的处理函数,然后再到ptype_base中,找到合适的协议,将skb发送到相关协议的处理函数.比如ip协议(ip_rcv)或者arp(arp_rcv)等等.此篇笔记讲的是有关ptype_all和ptype_base的相关知识点.ptype_转载 2011-10-31 10:05:05 · 6388 阅读 · 0 评论 -
内核自解压分析
gzip-1.2.4程序分析 一点说明: 在gzip.c中: DECLARE(uch, inbuf, INBUFSIZ +INBUF_EXTRA); DECLARE(uch, outbuf, OUTBUFSIZ+OUTBUF_EXTRA); DECLARE(u转载 2011-10-17 19:00:25 · 822 阅读 · 0 评论