LinuxKernel
win9zz
Life is brief, and then you die, you know?
展开
-
Device-tree schemas
近年来,设备树已经变得无处不在,作为描述不可发现系统(例如许多基于ARM的设备)的硬件布局的一种方式。 设备树绑定定义了如何在设备树中描述特定硬件。 然后驱动程序实现这些绑定。 设备树文档显示了如何使用绑定来描述系统:哪些属性可用以及它们可能具有哪些值。 理论上,绑定,驱动程序和文档应该彼此一致。 在实践中,它们通常不一致,即使它们在实际设备树中正确使用这些绑定也不是一项微不足道的任务。 因此,开...翻译 2019-09-04 01:10:39 · 665 阅读 · 0 评论 -
Wait Queue等待队列
驱动中使用等待队列来实现阻塞进程的唤醒,它以队列为基础数据结构,与进程调度机制紧密结合。定义等待队列头部wait_queue_head_t my_queue;初始化“等待队列头部”init_waiatqueue_head(&my_queue);(PS:下面的宏可以作为定义并初始化等待队列头部的快捷方式DECLARE_WAIT_QUEUE_HEAD(n原创 2017-03-23 21:13:30 · 1648 阅读 · 0 评论 -
Linux内核中_IO,_IOR,_IOW,_IOWR宏的用法与解析
在驱动程序里, ioctl()函数上传送的变量 cmd是应用程序用于区别设备驱动程序请求处理内容的值。cmd除了可区别数字外,还包含有助于处理的几种相应信息。 cmd的大小为 32位,共分 4 个域: bit31~bit30 2位为 “区别读写”区,作用是区分是读取命令还是写入命令。 bit29~bit15 14位为 "数据大小"区,表示 ioctl()中的 arg变量传送转载 2017-08-24 20:10:46 · 1418 阅读 · 0 评论 -
linux内存映射mmap原理分析
一直都对内存映射文件这个概念很模糊,不知道它和虚拟内存有什么区别,而且映射这个词也很让人迷茫,今天终于搞清楚了。。。下面,我先解释一下我对映射这个词的理解,再区分一下几个容易混淆的概念,之后,什么是内存映射就很明朗了。 原理首先,“映射”这个词,就和数学课上说的“一一映射”是一个意思,就是建立一种一一对应关系,在这里主要是只 硬盘上文件 的位置与进程 逻辑地址空间 中一块大转载 2017-05-03 19:16:24 · 1491 阅读 · 0 评论 -
signal_pending函数解析
经常我们在睡眠的代码中 会看到这样的例子: if (signal_pending(current)) { ret = -ERESTARTSYS; return ret; } 关于 -ERESTARTSYS 到底是什么意思? -ERESTARTSYS表示信号函数处理完毕后重新执行信号函数前的某个系统转载 2017-03-23 22:07:34 · 6670 阅读 · 0 评论 -
内核Kconfig 与 Makefile 文件分析
一.内核构造系统简介 内核是个复杂庞大的系统,对它进行配置、裁剪、编译原本非常地复杂和困难,但现在却只需要简单的两个命令:(1)make menuconfig ;(2)make uImage 就搞定了,原因是在其背后有一个设计精巧的内核构造系统帮助我们精确的完成了各项任务。内核构造系统最关键的组成元素就是各个目录下的Kconfig 文件和 Makefile文件,本节将对转载 2017-03-12 00:50:07 · 1156 阅读 · 0 评论 -
Kobject相关
kobjec是linux在2.6中新引进的统一的设备管理模型,他的主要目的就是对linux的2.6系统所有的设备进行统一的管理,在以前的内核中并没有独立的数据结构让内核对整体的系统做配置和管理。尽管缺乏此类的信息,但是很多时候系统还是能正常工作,然后随着设备越来越多,系统越来越复杂,以及需要支持更多诸如电源管理等新的特征需要,新的内核版本明确提出了需要统一管理设备的要求:需要有一个对系统结构整体统转载 2017-03-19 21:59:35 · 1068 阅读 · 0 评论 -
try_module_get和module_put
try_module_get注解: 1>位置:/linux/kernel/module.c 2>声明:static inline int try_module_get(structmodule *module) 3>功能:判断module模块是否处于活动状态,然后通过local_inc()宏将该模块的引用计数加1转载 2017-03-19 02:15:11 · 1696 阅读 · 0 评论 -
谈EXPORT_SYMBOL使用
EXPORT_SYMBOL只出现在2.6及以上内核中,在2.4内核默认的非static 函数和变量都会自动导入到kernel 空间的, 都不用EXPORT_SYMBOL() 做标记的。2.6就必须用EXPORT_SYMBOL() 来导出来(因为2.6默认不到处所有的符号)。 1、EXPORT_SYMBOL的作用是什么?EXPORT_SYMBOL标签内定义的函数或者符号对全部内核代码转载 2017-03-18 14:01:07 · 1427 阅读 · 0 评论 -
Linux内核抢占
1 内核抢占概述 2.6新的可抢占式内核是指内核抢占,即当进程位于内核空间时,有一个更高优先级的任务出现时,如果当前内核允许抢占,则可以将当前任务挂起,执行优先级更高的进程。在2.5.4版本之前,Linux内核是不可抢占的,高优先级的进程不能中止正在内核中运行的低优先级的进程而抢占CPU运行。进程一旦处于核心态(例如用户进程执行系统调用),则除非进程自愿放弃CPU,否则该进程将一直运行转载 2017-09-21 12:48:39 · 1906 阅读 · 0 评论 -
Linux内核抢占机制(preempt)
早期的Linux内核(2.5.4版本之前)是不可抢占的。它的调度方法是:一个进程可以通过schedule()函数自愿地启动一次调度。非自愿的强制性调度只能发生在 每次从系统调用返回的前夕以及每次从中断或异常处理返回到用户空间的前夕。但是,如果在系统空间发生中断或异常是不会引起调度的。这种方式使内核实现得以 简化。但常存在下面两个问题: 如果这样的中断发生在内核中,本次中断返回是不会引起调度的转载 2017-09-21 13:08:08 · 5214 阅读 · 0 评论 -
Linux内核中的jiffies及其作用介绍及jiffies等相关函数详解
在LINUX的时钟中断中涉及至二个全局变量一个是xtime,它是timeval数据结构变量,另一个则是jiffies,首先看timeval结构struct timeval{ time_t tv_sec; /***second***/ susecond_t tv_usec;/***microsecond***/} 到底microsecond是毫秒还是微秒?? 1秒=1000转载 2017-11-28 22:21:34 · 4937 阅读 · 1 评论 -
A strong random number generator(linux强随机数生成器)
该个程序从设备驱动程序等收集环境噪声,并返回适合加密用途的良好随机数。除了明显的加密用途之外,这些数字也适用于随机TCP序列号,以及其他需要的数字不仅是随机的,而且很难被攻击者预测的地方。运作理论计算机是非常可预测的设备。因此,在计算机上生成真正的随机数非常困难 - 与伪随机数相反,伪随机数很容易通过算法生成。不幸的是,攻击者很容易猜测伪随机数生成器的序列,对于某些应用程序来说这是不可接受的。...翻译 2019-05-19 00:26:37 · 1429 阅读 · 0 评论 -
牛人录及学习资料
Christoph Hellwig原创 2018-11-30 00:42:10 · 330 阅读 · 0 评论 -
ubuntu18.04搭建qemu内核调试环境(待续)
apt-get install qemu libncurses5-dev gcc-arm-linux-gnueabi build-essentialhttps://download.csdn.net/download/qq_33160790/10562084原创 2018-07-25 00:39:41 · 3520 阅读 · 0 评论 -
Linux 错误代码含义/Linux Error Code
C Name Value Description EPERM 1 Operation not permitted ENOENT 2 No such file or directory ESRCH 3 No such process EINTR 4 Interrupted system call EIO ...转载 2018-02-23 16:49:34 · 9241 阅读 · 0 评论 -
mdev详解
一、概述mdev是busybox提供的一个工具,用在嵌入式系统中,相当于简化版的udev,作用是在系统启动和热插拔或动态加载驱动程序时, 自动创建设备节点。文件系统中的/dev目录下的设备节点都是由mdev创建的。在加载驱动过程中,根据驱动程序,在/dev下自动创建设备节点。以下内容摘自busybox-1.23.1的mdev.txt文件:Mdev has two prima转载 2018-02-06 00:20:35 · 13574 阅读 · 7 评论 -
内核解析U-boot传入的machid
machid在没有设备树的时候,machine相关的初始化函数都在类似arch/arm/mach-s3c24xx的目录下。 图中圈住的machine,他们都属于arm/mach-s3c24xx体系,在内核配置s3c24xx时,都会被编进内核。 U-boot传入machid到内核用到的是param_struct/tag,内核根据U-boot传入的machid选择不同的初始化函...原创 2018-02-11 10:05:10 · 3655 阅读 · 0 评论 -
__attribute__((section(".x")))及引申
关键字attribute可用于为函数或数据声明属性值,这样可以让编译程序优化处理。比如内核里面经常能看见的section:#define __exception __attribute__((section(".exception.text")))具有该属性的函数,汇编代码将会放置到.exception.text段中,而不是.text段中。 实践:把test放到指定原创 2018-02-05 04:38:27 · 9389 阅读 · 4 评论 -
ARM中断向量表的简单分析
一般编写arm的裸机程序的时候,创建中断向量表就把它放在0x00000000~0x0000001c中,一般都放在这个位置上。但是中断向量表也可以放在0xffff0000~0xffff001c中,知道这是怎么设置的么?开始看到的时候真的有点奇怪,因为在学习arm的时候,根本没去看arm中的协处理器CP15中的c1控制寄存器中的v位来控制,我们一般都使用默认的值0,则必须将中断向量表放在0x00000转载 2018-01-10 20:38:43 · 7514 阅读 · 0 评论 -
asmlinkage的用法
在linux内核代码中,经常看到asmlinkage限定词,例如:asmlinkage long sys_getpid(void)等,介绍如下:asmlinkage 的定义(/usr/include/asm/linkage.h里面):`这里写代码片`#define asmlinkage CPP_ASMLINKAGE __attribute__((regparm(0)))attribut转载 2018-01-10 19:19:03 · 1913 阅读 · 0 评论 -
__builtin_choose_expr
type __builtin_choose_expr (const_exp, exp1, exp2)这个函数的第一个参数必须是常量表达式,因为之前我已经说过,它属于编译时行为,而非运行时行为,跟sizeof和typeof一样。这个函数是一个谓词函数,如果const_expr的结果非0,那么生成exp1,且返回类型type也与exp1表达式的类型一致;否则生成exp2,并且返回类型type也与e原创 2018-01-25 04:20:08 · 3317 阅读 · 0 评论 -
认真分析mmap:是什么 为什么 怎么用
mmap基础概念 mmap是一种内存映射文件的方法,即将一个文件或者其它对象映射到进程的地址空间,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系。实现这样的映射关系后,进程就可以采用指针的方式读写操作这一段内存,而系统会自动回写脏页面到对应的文件磁盘上,即完成了对文件的操作而不必再调用read,write等系统调用函数。相反,内核空间对这段区域的修改也直接反映转载 2017-01-29 03:10:02 · 1077 阅读 · 0 评论 -
《Linux内核设计与实现》读书笔记(六)- 内核数据结构
内核数据结构贯穿于整个内核代码中,这里介绍4个基本的内核数据结构。利用这4个基本的数据结构,可以在编写内核代码时节约大量时间。主要内容:链表队列映射红黑树 1. 链表链表是linux内核中最简单,同时也是应用最广泛的数据结构。内核中定义的是双向链表。 1.1 头文件简介内核中关于链表定义的代码位于: include/l转载 2017-01-27 12:30:19 · 1087 阅读 · 0 评论 -
Linux系统中常用的错误码
1 EPERMOperation not permitted操作不许可2 ENOENTNo such file or directory无此文件或目录3 ESRCHNo such process无此过程4 EINTR Interrupted system call系统调用被禁止5 EIO I/O errorI/O 错误6 ENXIO转载 2017-01-16 04:24:30 · 1932 阅读 · 0 评论 -
文件系统(未完)
文件系统这个词有几种不同的含义,要根据上下文才能区分:(1)指一种特定的文件格式。例如,我们说Linux的文件系统是Ext2,WindowNT的文件系统是NTFS或FAT32。(2)指按特定格式进行了格式化的一块存储介质。当我们说安装或拆卸一个文件系统时,指的就是这个意思。(3)指操作系统中(通常是内核)用来管理文件系统以及对文件进行操作时的机制及其实现,也就是本文的话题。VFS(原创 2017-01-15 23:27:23 · 1065 阅读 · 0 评论 -
struct device *dev
struct device结构体(2.6.23) 一、定义:Linux/include/linux/device.hstruct device { struct klist klist_children; struct klist_node knode_parent; /* node in sibling list */转载 2017-01-15 21:48:56 · 2431 阅读 · 0 评论 -
framebuffer_alloc()
linux-2.6.22/includenux/fb.h framebuffer_alloc()功能是向内核申请一段大小为sizeof(struct fb_info) + size的空间,其中size的大小代表设备的私有数据空间,并用fb_info的par域指向该私有空间。struct fb_info *framebuffer_alloc(size_t size, struc原创 2017-01-15 03:41:39 · 2075 阅读 · 0 评论 -
try_module_get和module_put
模块在被使用时,是不允许被卸载的。 2.4内核中,模块自身通过 MOD_INC_USE_COUNT, MOD_DEC_USE_COUNT宏来管理自己被使用的计数。 2.6内核提供了更健壮、灵活的模块计数管理接口 try_module_get(&module), module_put(&module)取代2.4中的模块使用计数管理宏;模块的使用计数不必由自身管理,而且在管理模块使用计转载 2017-01-15 00:49:15 · 1108 阅读 · 0 评论 -
struct fb_ops
struct fb_ops { /* open/release and usage marking */ struct module *owner; int (*fb_open)(struct fb_info *info, int user); int (*fb_release)(struct fb_info *info, int user); /* For framebuffers原创 2017-01-15 00:43:36 · 1649 阅读 · 0 评论 -
struct fb_info
struct fb_info { int node; int flags; struct fb_var_screeninfo var; /* Current var */ struct fb_fix_screeninfo fix; /* Current fix */ struct fb_monspecs monspecs; /* Current Monitor specs */ str原创 2017-01-15 00:20:57 · 1479 阅读 · 0 评论 -
create_proc_read_entry函数
原型:struct proc_dir_entry *create_proc_read_entry (const char *name, mode_t mode, struct proc_dir_entry *base, read_proc_t *read_proc, void *data);说明:name : 要创建的文件名;mode : 文件掩码,为转载 2017-01-15 00:00:25 · 2657 阅读 · 0 评论 -
linux 中/proc 详解
Linux-proc proc 文件系统 在Linux中有额外的机制可以为内核和内核模块将信息发送给进程-- /proc 文件系统。最初设计的目的是允许更方便的对进程信息进行访问(因此得名),现在它被每一个有有趣的东西报告的内核使用,例如/proc/modules 有模块的列表/proc/meminfo 有内存使用的统计表。 使用proc 文件系统的方转载 2017-01-14 23:48:50 · 1413 阅读 · 0 评论 -
Make Menuconfig详解 (配置内核选择)
Make Menuconfig简介make menuconfig 图形化的内核配置make mrproper -----删除不必要的文件和目录. #make config(基于文本的最为传统的配置界面,不推荐使用) #make menuconfig(基于文本选单的配置界面,字符终端下推荐使用) #make xconfig(基于图形窗口模式的配置界面,Xwindow下推荐使用)转载 2017-02-05 22:51:38 · 2175 阅读 · 0 评论 -
Linux中__init、__devinit等初始化宏
内核使用了大量不同的宏来标记具有不同作用的函数和数据结构。如宏__init 、__devinit 等。这些宏在include/Linux/init.h 头文件中定义。编译器通过这些宏可以把代码优化放到合适的内存位置,以减少内存占用和提高内核效率。下面是一些常用的宏:· __init ,标记内核启动时使用的初始化代码,内核启动完成后不再需要。以此标记的代码位于.init.text转载 2017-02-07 01:23:04 · 1246 阅读 · 0 评论 -
Linux内核空间内存申请函数kmalloc、kzalloc、vmalloc的区别
我们都知道在用户空间动态申请内存用的函数是 malloc(),这个函数在各种操作系统上的使用是一致的,对应的用户空间内存释放函数是 free()。注意:动态申请的内存使用完后必须要释放,否则会造成内存泄漏,如果内存泄漏发生在内核空间,则会造成系统崩溃。 那么,在内核空间中如何申请内存呢?一般我们会用到 kmalloc()、kzalloc()、vmalloc() 等,下面我们介绍一下这些转载 2017-02-08 21:29:40 · 1440 阅读 · 0 评论 -
Linux内核:关于中断你需要知道的
1、中断处理程序与其他内核函数真正的区别在于,中断处理程序是被内核调用来相应中断的,而它们运行于中断上下文(原子上下文)中,在该上下文中执行的代码不可阻塞。中断就是由硬件打断操作系统。2、异常与中断不同,它在产生时必须考虑与处理器时钟同步。异常被称为同步中断,例如:除0、缺页异常、陷入内核(trap)引起系统调用处理程序异常。3、不同的设备对应的中断不同,而每个中断都通过一个唯一的转载 2017-02-08 22:29:53 · 1187 阅读 · 0 评论 -
《Linux内核设计与实现》读书笔记(五)- 系统调用
主要内容:什么是系统调用Linux上的系统调用实现原理一个简单的系统调用的实现1. 什么是系统调用简单来说,系统调用就是用户程序和硬件设备之间的桥梁。用户程序在需要的时候,通过系统调用来使用硬件设备。系统调用的存在,有以下重要的意义:1)用户程序通过系统调用来使用硬件,而不用关心具体的硬件设备,这样大大简化了用户程序的开发。 比如:用户转载 2017-01-27 12:28:56 · 1028 阅读 · 0 评论 -
《Linux内核设计与实现》读书笔记(四)- 进程的调度
主要内容:什么是调度调度实现原理Linux上调度实现的方法调度相关的系统调用1. 什么是调度现在的操作系统都是多任务的,为了能让更多的任务能同时在系统上更好的运行,需要一个管理程序来管理计算机上同时运行的各个任务(也就是进程)。这个管理程序就是调度程序,它的功能说起来很简单:决定哪些进程运行,哪些进程等待决定每个进程运行多长时间此外,为了获得更好的用转载 2017-01-27 12:24:12 · 1263 阅读 · 0 评论 -
内核对内存的使用方法(未完)
CPU内存管理机制:分页和分段。3种地址以及他们之间的变换概念:1.逻辑地址:程序产生的与段相关的偏移地址部分。在Intel保护模式下就是指程序执行代码段限长内的偏移地址(假定代码段、数据段完全一样)。应用程序员仅需要与逻辑代码打交道。2.线性地址:逻辑地址到物理地址的中间层。如果启用了分页机制,那么线性地址可以再经变换以产生一个物理地址。若没采用分页机制,那么线性地址就是物理地址。I原创 2017-01-20 14:15:45 · 1081 阅读 · 0 评论