![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Linux 内核
文章平均质量分 79
wh8_2011
这个作者很懒,什么都没留下…
展开
-
第二章 驱动程序调测方法与技巧
驱动程序开发的一个重大难点就是不易调试。本文目的就是介绍驱动开发中常用的几种直接和间接的调试手段,它们是:利用printk 查看OOP消息 利用strace 利用内核内置的hacking选项 利用ioctl方法 利用/proc 文件系统 使用kgdb一、利用printk这是驱动开发中最朴实无华,同时也是最常用和有效的手段。scull驱动的main.c第338行如下,就是使用p...转载 2020-02-23 21:02:23 · 782 阅读 · 0 评论 -
ldd3 sbull编译遇到的问题 解决(部分)方法
开始第一次make:结果如下:root@ubuntu:/home/shevarey/ssdd/sbull# makemake -C /lib/modules/2.6.32.16/build M=/home/shevarey/ssdd/sbullmodulesmake[1]: Entering directory `/usr/src/linux-2.6.32.16"转载 2015-12-20 15:43:44 · 1246 阅读 · 0 评论 -
Linux设备驱动程序(LDD)中snull的编译问题
对LDD中snull程序,编译的时候会有许多问题,鉴于网上还没有合适的解决办法,做此总结,整理知识。本文在debian6.0上运行通过,内核版本为2.6.32。学习LDD中网络驱动程序部分,理解snull程序的原理很有必要。snull不依赖于硬件,数据包的收发都属于内存操作,但对整个网络驱动程序原 理已经做了很好的阐述。程序并不复杂,相比e100.c;8139too.c;pci-skeleto转载 2015-12-21 22:06:18 · 1837 阅读 · 0 评论 -
kernel的initcall函数
initcall函数的声明:/* include/linux/init.h *//* initcalls are now grouped by functionality into separate * subsections. Ordering inside the subsections is determined * by link order. * For ba原创 2016-01-30 08:19:11 · 560 阅读 · 0 评论 -
内核初始化-从start_kernel到init
如图所示,内核的初始化过程由start_kernel函数开始,至第一个用户进程init结束,调用了一系列的初始化函数对所有的内核组件进行初始化。其中,start_kernel、rest_init、kernel_init、init_post等4个函数构成了整个初始化过程的主线。 图 内核初始化 本节接下来的内容会结合内核代码,对内核初始化过程转载 2016-01-30 21:33:03 · 1732 阅读 · 0 评论 -
proc相关操作
一、数据结构struct proc_dir_entry { unsigned int low_ino; unsigned short namelen; const char *name; mode_t mode; nlink_t nlink; uid_t uid; gid_t gid; loff_t size;转载 2016-01-15 09:31:31 · 526 阅读 · 0 评论 -
UID, EUID, SUID, FSUID
前 言real user ID (uid): 实际用户ID,指的是进程执行者是谁effective user ID (euid): 有效用户ID,指进程执行时对文件的访问权限saved set-user-ID (saved uid): 保存设置用户ID。是进程刚开始执行时,euid的副本。在执行exec调用之后能重新恢复原来的effectiv user ID.上面这三个ID是相转载 2016-03-08 10:40:02 · 8883 阅读 · 0 评论 -
基数树(radix tree)
基数(radix)树Linux基数树(radix tree)是将指针与long整数键值相关联的机制,它存储有效率,并且可快速查询,用于指针与整数值的映射(如:IDR机制)、内存管理等。IDR(ID Radix)机制是将对象的身份鉴别号整数值ID与对象指针建立关联表,完成从ID与指针之间的相互转换。IDR机制使用radix树状结构作为由id进行索引获取指针的稀疏数组,通过使用位图转载 2016-05-10 22:49:31 · 946 阅读 · 0 评论 -
linux系统移植和根文件系统制作
linux 内核移植和根文件系统的制作1.1 Linux内核基础知识 在动手进行Linux内核移植之前,非常有必要对Linux内核进行一定的了解,下面从Linux内核的版本和分类说起。 1.1.1 Linux版本 Linux内核的版本号可以从源代码的顶层目录下的Makefile中看到,比如2.6.29.1内核的Makefile中: VERSION = 2 PATC转载 2016-07-12 08:12:40 · 3853 阅读 · 0 评论 -
Linux--内核Uevent事件机制 与 Input子系统
一、Uevent机制1.前提摘要(1)Sysfs文件系统 内核设备模型主要的模块和用户之间能看到的相关部分就是sysfs文件系统了。内核在启动的时候会注册sysfs文件系统,并且在启动系统的初期。通过mount命令挂载sysfs文件系统到/sys挂载点。 Mount -t sysfs sysfs /sys转载 2016-06-15 07:36:50 · 2918 阅读 · 0 评论 -
linux内核中等待队列(wait_event,wake_up...)
根据内核3.1.6版本源码、书籍和网上资料,对几个函数进行分析 介绍这几个函数,不得不先介绍等待队列wait_queue_head_t 等待队列用于使得进程等待某一特定事件的发生,无需频繁的轮询,进程在等待周期中睡眠,当时间发生后由内核自动唤醒。等待队列 (一)数据结构 等待队列结构如下,因为每个等待队列都可以转载 2016-07-21 07:53:25 · 950 阅读 · 0 评论 -
同步(2)
2.2、睡眠与唤醒在操作系统中,睡眠和唤醒原语实际上是操作系统的基本原语,也是实现同步的一种方式,而且它还是实现信号量的基础。当进程请求的资源(如内存、文件等)不能得到满足时,就会主动放弃CPU,进入等待状态(可中断等待或者不可中断等待)。当资源满足时,就会由别的进程唤醒,从而投入运行。2.2.1、等待队列等待队列表示一组睡眠的进程,这些进程正在等待特定的事件发生(或者说条件为真),比转载 2016-09-14 07:15:39 · 242 阅读 · 0 评论 -
同步(1)
1、概述同步问题是操作系统中的经典问题,它伴随着并发处理而自诞生。现代体系结构中常见的并发处理情况可以分为如下三种情况:(1)多个线程在单处理器上执行——多线程编程(2)多个线程在多处理器上执行——并行计算(3)多个线程在分布的多个处理上执行——分布式计算相应的编程也分成三种情况:共享变量编程、分布式(基于消息)编程和并行编程。1.1、并发程序设计的本质并发程序通常转载 2016-09-14 07:16:28 · 295 阅读 · 0 评论 -
Linux RT(1)-硬实时Linux(RT-Preempt Patch)在PC上的编译、使用和测试
特别声明:本系列文章LiAnLab.org著作权所有,转载请注明出处。by @宋宝华Barry Vanilla kernel的问题Linux kernel在spinlock、irq上下文方面无法抢占,因此高优先级任务被唤醒到得以执行的时间并不能完全确定。同时,Linux kernel本身也不处理优先级反转。RT-Preempt Patch是在Linux社区kernel的基础上转载 2016-11-14 09:29:09 · 4126 阅读 · 0 评论 -
error: implicit declaration of function ‘elv_next_request’
error: implicit declaration of function ‘elv_next_request’在Linux 2.3.36上编译2.6.18以前驱动程序发现“error: implicit declaration of function ‘elv_next_request’”因为,从linux-2.6.31开始elv_next_request就消失了因此,在改版本的原创 2015-12-20 15:26:23 · 2133 阅读 · 0 评论 -
Linux驱动总结3- unlocked_ioctl和堵塞(waitqueue)读写函数的实现
学习了驱动程序的设计,感觉在学习驱动的同时学习linux内核,也是很不错的过程哦,做了几个实验,该做一些总结,只有不停的作总结才能印象深刻。我的平台是虚拟机,fedora14,内核版本为2.6.38.1.其中较之前的版本存在较大的差别,具体的实现已经在上一次总结中给出了。今天主要总结的是ioctl和堵塞读写函数的实现。一、ioctl函数的实现首先说明在2.6.3转载 2015-12-20 11:25:03 · 779 阅读 · 0 评论 -
error: unknown field ‘ioctl’ specified in initializer
在2.6.36内核上加载编译驱动时,出现:“ error:unknown field 'ioctl' specified in initializer”因为,在2.6.36内核上file_operations发生了重大的改变:原先的 int (*ioctl)(struct inode*, struct file*, unsigned int, unsigned long)原创 2015-12-20 11:12:00 · 761 阅读 · 0 评论 -
内核中的中断函数request_irq()
request_irq()、free_irq() 这是驱动程序申请中断和释放中断的调用。在include/linux/sched.h里声明。 request_irq()调用的定义: int request_irq(unsigned int irq, void (*handler)(int irq, void *dev_id, struct pt_regs *regs ),转载 2015-06-05 22:06:14 · 1026 阅读 · 0 评论 -
调用虚拟内存编译时的error处理
以下两行代码在内核编译时报错。pgd_t *pgd;pgd = pgd_offset(current->mm, vaddr);error如下:error: implicit declaration of function ‘pgd_offset’error: dereferencing pointer to incomplete type错误解决方法:p原创 2015-07-07 10:08:10 · 868 阅读 · 0 评论 -
Linux内存管理原理
1. 虚拟地址、物理地址、逻辑地址、线性地址 虚拟地址又叫线性地址。linux没有采用分段机制,所以逻辑地址和虚拟地址(线性地址)(在用户态,内核态逻辑地址专指下文说的线性偏移前的地址)是一个概念。物理地址自不必提。内核的虚拟地址和物理地址,大部分只差一个线性偏移量。用户空间的虚拟地址和物理地址则采用了多级页表进行映射,但仍称之为线性地址。2. DMA/HIGH_MEM/NROMA转载 2015-07-31 07:53:50 · 694 阅读 · 0 评论 -
Linux如何在系统启动时自动加载模块
Linux如何在系统启动时自动加载模块下面是以前学习Linux时写的,后来仔细研究rc.sysinit后发现,只需要修改下列地方就可以了,不必这么麻烦的:rc.sysinit中有这样的一段代码:# Load other user-defined modulesfor file in /etc/sysconfig/modules/*.modules ; do[ -x转载 2015-08-31 17:17:05 · 466 阅读 · 0 评论 -
Linux workqueue工作原理
1. 什么是workqueue Linux中的Workqueue机制就是为了简化内核线程的创建。通过调用workqueue的接口就能创建内核线程。并且可以根据当前系统CPU的个数创建线程的数量,使得线程处理的事务能够并行化。workqueue是内核中实现简单而有效的机制,他显然简化了内核daemon的创建,方便了用户的编程. 工作队列(workqueue)是另外一转载 2015-11-09 10:08:10 · 570 阅读 · 0 评论 -
定制自己的内核
这里使用的方法是用kernel-package之一工具来简化内核的配置和安装,最大的优点就是在执行晚后会生成一个内核的deb包,及易于其安装。下面就具体的来讲一下步骤:(所以的操作均在超级用户下执行) 1、首先是要安装kernel-package这一工具(可能会需要一些依赖包,安装提示先将依赖包装上,在执行一下的命令即可) sudo apt-get install kernel转载 2015-10-24 11:10:56 · 654 阅读 · 0 评论 -
kworker内核工作队列详解
工作队列是另一种将工作推后执行的形式,它可以把工作交给一个内核线程去执行,这个下半部是在进程上下文中执行的,因此,它可以重新调度还有睡眠。 区分使用软中断/tasklet还是工作队列比较简单,如果推后的工作不需要睡眠,那么就选择软中断或tasklet,但如果需要一个可以重新调度,可以睡眠,可以获取内存,可以获取信号量,可以执行阻塞式I/O操作时,那么,请选择工作队列吧! 在老的转载 2015-11-10 21:52:52 · 15271 阅读 · 0 评论 -
内核配置与裁剪浅析
Linux内核裁减 (1)安装新内核: i)将新内核copy到/usr/src下, #tar xzvf linux-2.6.38.4.tar.gz -----解压缩. ii) 将名为linux的符号链接删掉,这是旧版本内核的符号链接. #ln -s linux-2.6.38.4 linux ------建立linux-2.6.38.4的符号链接linux. (2)设置内核. # cd /usr转载 2015-10-24 11:10:12 · 3261 阅读 · 0 评论 -
Linux中EXPORT_SYMBOL的用法
Linux中EXPORT_SYMBOL的用法EXPORT_SYMBOL标签内定义的函数对全部内核代码公开,不用修改内核代码就可以在您的内核模块中直接调用。您还可以手工修改内核源代码来导出另外的函数,用于重新编译并加载新内核后的测试。Linux symbol export method:[1] If we want export the symbol in a mod转载 2015-11-25 09:21:34 · 2029 阅读 · 0 评论 -
Linux启动过程详解
启动第一步--加载BIOS当你打开计算机电源,计算机会首先加载BIOS信息,BIOS信息是如此的重要,以至于计算机必须在最开始就找到它。这是因为BIOS中包含了CPU的相关信息、设备启动顺序信息、硬盘信息、内存信息、时钟信息、PnP特性等等。在此之后,计算机心里就有谱了,知道应该去读取哪个硬件设备了。启动第二步--读取MBR众所周知,硬盘上第0磁道第一个扇区被称为MBR,也转载 2015-11-25 09:18:59 · 365 阅读 · 0 评论 -
详解神秘Linux内核
本章要先浏览一下内核发出的启动信息,然后再逐个讲解一些有意思的点。2.1 启动过程图2-1显示了基于x86计算机Linux系统的启动顺序。第一步是BIOS从启动设备中导入主引导记录(MBR),接下来MBR中的代码查看分区表并从活动分区读取GRUB、LILO或SYSLINUX等引导装入程序,之后引导装入程序会加载压缩后的内核映像并将控制权传递给它。内核取得控制权后,会将自身解压缩并投转载 2015-11-25 09:17:42 · 652 阅读 · 0 评论 -
error: ‘SA_INTERRUPT’ undeclared (first use in this function)
linux 2.4.36error: ‘SA_INTERRUPT’ undeclared (first use in this function)从2.6.24以后删除了SA_INTERRUPT,使用IRQF_DISABLED代替,因此将SA_INTERRUPT修改为IRQF_DISABLED就可以解决该编译错误。因为SA_开头的宏定义很不好和信号进行区分,容易和信号混到一块。原创 2016-01-01 08:47:25 · 4072 阅读 · 0 评论 -
Linux内核基础--事件通知链(notifier chain)
1.1. 概述 Linux内核中各个子系统相互依赖,当其中某个子系统状态发生改变时,就必须使用一定的机制告知使用其服务的其他子系统,以便其他子系统采取相应的措施。为满足这样的需求,内核实现了事件通知链机制(notificationchain)。 通知链只能用在各个子系统之间,而不能在内核和用户空间进行事件的通知。组成内核的核心系统代码均位于kernel目录下转载 2016-01-19 11:10:57 · 3809 阅读 · 0 评论 -
Linux中文件查找方法大全
可是使用Linux的用户就没有那么幸运了,在Linux上查找某个文件确实是一件比较麻烦的事情。毕竟在Linux中需要我们使用专用的“查找”命令来寻找在硬盘上的文件。Linux下的文件表达格式非常复杂,不象Windows,DOS下都是统一的AAAAAAA.BBB格式那么方便查找,在Windows中,只要知道要查找的文件的文件名或者后缀就非常容易查找到。Linux中查找文件的命令通常为“find”命令转载 2015-05-12 11:35:19 · 610 阅读 · 0 评论