
linux
文章平均质量分 81
Eliot_shao
年轻人有先见之明。。。。。
展开
-
Linux 进程控制——等待队列详解
一、什么是睡眠 对于一个进程"睡眠"意味着什么? 当一个进程被置为睡眠, 它被标识为处于一个特殊的状态并且从调度器的运行队列中去除. 直到发生某些事情改变了那个状态, 这个进程将不被在任何 CPU 上调度, 并且, 因此, 将不会运行. 一个睡着的进程已被搁置到系统的一边, 等待以后发生事件. LDD3说得很玄乎,睡眠是“自愿调度”,其实就是将当前进程的状态设置为 TASK_INTERRUPTIBLE 等状态,然后schedule() 让出CPU1,让调度器重新选择一个进程来执行。...转载 2021-09-10 09:36:04 · 454 阅读 · 0 评论 -
(三)Linux进程调度器-进程切换
原文转自链接1. 概述进程切换:内核将CPU上正在运行的进程挂起,选择下一个进程来运行。ARM架构中,CPU上一次只能运行一个任务,内核需要为任务分配运行时间来进行调度,以便同时能处理多个任务请求。如下图所示:当进行任务切换的时候,思考下两个问题: 怎样通过抢占来实现进程的切换? 当进程切换的时候,到底切换的什么,是怎么实现的? 这两个问题,也是本文探讨的主题了。2. 抢占2.1 用户抢占2.1.1 抢占触发点 可以触发抢占的情况很多,比如进程的时.转载 2020-11-30 10:23:49 · 446 阅读 · 0 评论 -
linux系统删除空间后系统分区空间仍不释放问题
总结的原因:1、删除文件文件后没有清空回收站;2、删除的文件不在系统分区,在其他分区上;3、删除的文件被保留在了/tmp分区下,而/tmp分区不是独立的分区,是在根分区/的基础上划分出来的分区;4、删除文件的进程delete一直在后台运行,仍然无法对该文件进行读写常用指令总结:du -h --max-depth=1 查看目录深度为1的目录或文件所占空间大小lsof |grep deleted 获得一个已经被删除但是仍然被应用程序占用的文件列表df ...转载 2020-08-26 08:58:41 · 717 阅读 · 0 评论 -
ramdisk initrd ramfs initramfs区别与联系
原文地址:https://www.cnblogs.com/smartjourneys/articles/9515498.html问题:当Linux内核启动时,必须找到并执行第一个用户程序,通常是init。用户程序存放在文件系统,故Linux必须找到并挂载第一个文件系统。通常,可用的文件系统都列在/etc/fstab,所以mount可以找到它们。但是/etc/fstab本身存在与文件系统中。因此,这类似鸡生蛋蛋生鸡的问题。为解决该问题,内核开发者建立了内核命令列表选项root=,用来制定ro.转载 2020-06-05 09:38:12 · 791 阅读 · 0 评论 -
How to use initramfs.
原文地址:http://www.landley.net/writing/rootfs-howto.html#footnote1By: Rob LandleyLast time, we covered why initramfs was created: because it saves memory, gives the user more control over the boot process, and simplifies the kernel's internal implement.转载 2020-06-04 15:44:32 · 357 阅读 · 1 评论 -
initramfs和initrd的异同
转载地址:https://blog.youkuaiyun.com/z1026544682/article/details/88364725一、简介(1) initrd 在早期的linux系统中,一般只有硬盘或者软盘被用来作为linux根文件系统的存储设备,因此也就很容易把这些设备的驱动程序集成到内核中。但是现在的嵌入式系统中可能将根文件系统保存到各种存储设备上,包括scsi、sata,u-disk等等。因此把这些设备的驱动代码全部编译到内核中显然就不是很方便。 为了解决这一矛盾,于是出现了基于ram..转载 2020-06-04 15:42:12 · 1182 阅读 · 0 评论 -
LINUX CMA 初探
一、什么是CMACMA,Contiguous Memory Allocator,是内存管理子系统中的一个模块,负责物理地址连续的内存分配。一般系统会在启动过程中,从整个memory中配置一段连续内存用于CMA,然后内核其他的模块可以通过CMA的接口API进行连续内存的分配。CMA的核心并不是设计精巧的算法来管理地址连续的内存块,实际上它的底层还是依赖内核伙伴系统这样的内存管理机制,或者说CMA...原创 2020-01-21 14:51:40 · 1451 阅读 · 0 评论 -
驱动模块传参
#define module_param(name, type, perm) \ module_param_named(name, name, type, perm)name:参数的名字type:参数类型perm:权限---对参数的操作权限 0 文件系统不可见--只能当前模块使用该参数 0444 world-readable 所有用户可读 0644 root可写...转载 2020-01-20 15:46:19 · 444 阅读 · 0 评论 -
为什么linux的可见物理内存比实际内存要小
最近在做系统剪裁,发现可见物理内存为103MB(128M),其中有24M内存消失了,表示对这一现象很是奇怪,下面讲述了我找这24MB的心路历程。目标板子配置:板子为ARM架构、板子上有256MB内存,内核版本为4.9.54Linux version 4.9.54 (jenkins@localhost.localdomain) (gcc version 6.3.1 20170109 (Lin...转载 2020-01-10 08:44:37 · 2267 阅读 · 1 评论 -
container_of 报出 warning: initialization from incompatible pointer type 解决办法
调试input 设备某sensor时候遇到一个有关container_of 报出 warning: initialization from incompatible pointer type 的警告。这一切都是struct delayed_work work;惹的祸!解决办法:将struct pcap_ts *pcap_ts = container_of(work,原创 2016-12-01 10:13:02 · 4981 阅读 · 0 评论 -
Linux 模块(ko)签名
一、前言linux内核从3.7 开始加入模块签名检查机制,如果内核选项CONFIG_MODULE_SIG和CONFIG_MODULE_SIG_FORCE打开的话,当加载模块时内核会检查模块的签名,如果签名不存在或者签名内容不一致,会强制退出模块的加载。所以为模块签名就尤为重要。如果是内核选项CONFIG_MODULE_SIG_ALL打开,内核编译模块时会自动为模块签名。否则就要自己对模块签名。转载 2017-03-08 15:14:14 · 14690 阅读 · 1 评论 -
使用pinctrl子系统实现引脚功能动态切换
使用pinctrl子系统实现动态切换引脚功能 设备dts (msm8909-pinctrl.dtsi)&soc { tlmm_pinmux:pinctrl@1000000 { compatible= "qcom,msm-tlmm-8916"; reg= ;原创 2017-07-11 10:41:17 · 5020 阅读 · 0 评论 -
linux三种方式使用库:静态链接库,动态链接库,动态加载库
转载地址:http://blog.youkuaiyun.com/u014132659/article/details/52252298 +++原理+++linux调用库的方式有三种:1、静态链接库2、动态链接库3、动态加载库 动态链接库(共享库)和动态加载库文件没有任何区别,唯一区别是:动态链接库是程序运行一开始就要加载库,动态加载库是程序在运行到函数需要这个函数的实现的时转载 2017-11-29 13:59:32 · 1744 阅读 · 0 评论 -
shell:遍历目录和子目录的所有文件
#!/bin/bashfunction getdir(){ for element in `ls $1` do dir_or_file=$1"/"$element if [ -d $dir_or_file ] then getdir $dir_or_file else原创 2017-11-29 20:15:17 · 15429 阅读 · 1 评论 -
linux动态编译和静态编译
为了使用方便,可以把这两个函数接口定义为动态链接库或静态链接库。用动态链接库编译生成的可执行文件需调用.so文件方可正常运行,灵活但稍显麻烦;用静态链接库编译生成的可执行文件可直接运行,不用再调用如.so般的依赖库文件,简单但不灵活。静态链接库:1、编译生成目标文件gcc -c struct.c2、创建静态库ar cqs libstruct.转载 2017-11-27 19:50:22 · 9397 阅读 · 1 评论 -
为什么要使用YOCTO,以及其便捷之处
作为灵活多变且经济高效的解决方案,嵌入式 Linux展现了巨大的价值,并广泛应用于消费电子设备、网络设备、零售点和行业应用程序。然而,广泛的应用也意味着多样化的业务需求,嵌入式解决方案开发人员必须构建定制Linux 版本来满足其特定需求。本文引用地址:http://www.eepw.com.cn/article/201610/305448.htm这导致了嵌入式Linux 市场的乱象,一直以...转载 2018-08-15 18:01:08 · 1424 阅读 · 0 评论 -
Linux内核事件通知链(notifier chain)
详细原理参考:https://blog.youkuaiyun.com/wuhzossibility/article/details/8079025 Linux内核基础--事件通知链(notifier chain)简介:内核许多子系统之间关联紧密,因此在一个子系统发生或者检测到的事件信息很可能对其他子系统来说也是有价值的。为了满足其他子系统对这些事件信息的需求,即在某个子系统内发生或检测到事件时,其...原创 2018-12-13 16:42:03 · 2158 阅读 · 0 评论 -
Linux内核组件——completion接口(一种内核线程的同步机制)
下面的内容翻译来源:《Essential Linux Device Drivers》 chapter3 Completion Interface。Many parts of the kernel initiate certain activities as separate execution threads and then wait for them to complete. The co...翻译 2018-12-17 16:26:47 · 648 阅读 · 0 评论 -
Concurrency in the Kernel(内核中的并发处理)
原文来自:《Essential Linux Device Drivers》 chapter2 With the arrival of multicore laptops, Symmetric Multi Processing (SMP) is no longer confined to the realm of hi-tech users. SMP and kernel preemption ...原创 2018-12-18 18:25:16 · 858 阅读 · 0 评论 -
例说Linux内核链表(一)
在include/linux/list.h文件中用C实现了一个好用的循环链表。它是有效而且易于操作的,否则它也不会被内核使用(译者注:在kernel中大量的使用了循环双链表结构,比如在在进程描述符实体中我们就可以看到很多struct list_head的身影)。不管何时,依靠这种结构,在内核中都可以将任何使用它数据结构串起来。翻译 2014-10-13 23:59:03 · 1295 阅读 · 0 评论 -
dump_stack的简单使用
刚刚接触内核,在调试过程中用printk打印信息当然是直接有效的办法,但当我们不知到一个函数或者一个模块到底在哪里出了问题时我们可以利用dump_stack有效的找到问题的根源,下面只是简单的给出了使用方法。 我在自己的主机上试了一下dump_stack() Makefile文件obj-m := hello.oKERNELBUILD :=/lib/modules/$(shell转载 2016-06-28 10:36:29 · 2379 阅读 · 1 评论 -
读码随记(1)
阅读通信设备监控程序的一些杂记,不舍得扔,记录下来!_exit()与exit的区别:头文件:exit:#include_exit:#include_exit()函数:直接使进程停止运行,清除其使用的内存空间,并销毁其在内核中的各种数据结构;exit()函数则在这些基础上作了一些包装,在执行退出之前加了若干道工序。exit()函数与_exit()函数最大的区别就在原创 2015-03-11 14:41:50 · 1001 阅读 · 0 评论 -
从linux内核启动说起(三)
1、 内核启动过程分析(以ARM为例)(1)arch/arm/kernel/head.S① 确定内核是否支持该架构和单板。② 连接内核时使用的虚拟地址,所以要设置页表,使能MMU。③ 调用C函数start_kernel之前的常规工作,包括复制数据段,清除BSS段,设置栈指针,保存CPU ID到processor_id变量,保原创 2013-05-13 15:49:05 · 1797 阅读 · 0 评论 -
Linux内核启动过程和Bootloader(总述)
1.Linux内核启动过程概述 一个嵌入式 Linux 系统从软件角度看可以分为四个部分:引导加载程序(Bootloader),Linux 内核,文件系统,应用程序。其中 Bootloader是系统启动或复位以后执行的第一段代码,它主要用来初始化处理器及外设,然后调用 Linux 内核。Linux 内核在完成系统的初始化之后需要挂载某个文件系统做为根文件系统(Root Filesyste转载 2012-10-14 20:37:40 · 2980 阅读 · 0 评论 -
make工具介绍
2.3 make工具及makefile文件 无论是在Linux还是在UNIX环境中,make都是一个非常重要的编译工具。无论是自己进行项目开发还是安装应用软件,都需要使用make工具。利用make工具,可以将大型的开发项目分解成为多个更易于管理的模块,对于一个包括几百个源文件的应用程序而言,使用make工具和makefile文件就可以清晰地理顺各个源文件之间的关系。而且如此多的源文件,如果转载 2013-01-19 19:32:08 · 3509 阅读 · 0 评论 -
linux system program的几个验证
验证了main的输入参数是按照空格来分的,如执行test程序,输出命令行参数。./test 1,1 2参数argv[0]是./test参数argv[1]是1,1参数argv[2]是2 如果在参数列表中出现诸如“;”“空格”等字符。可以再前面加上转义字符“\”进行转义处理。如./test 1\;1 12第二个参数是1;1验证了main原创 2014-09-26 09:14:56 · 1390 阅读 · 0 评论 -
从linux内核启动说起~模块篇(四)
这一节主要内容讲解linux内核的模块机制。主要参考经典书籍《linux device drivers》。① 大多数小规模及中规模的应用程序从头到尾执行单个任务,而模块却只是预先注册自己一边服务于将来的某个请求,然后他的初始化函数就立即结束了。模块仅仅被链接到内核,因此它能调用的函数仅仅是由内核导出的那些函数,而不存在任何可链接的函数库。所以源文件不能包含常用的头文件。内核模块只原创 2013-05-26 22:04:56 · 2036 阅读 · 0 评论 -
linux 环境变量设置方法总结
1. 显示环境变量HOME $ echo $HOME /home/redbooks 2. 设置一个新的环境变量hello $ export HELLO="Hello!" $ echo $HELLO Hello! 3. 使用env命令显示所有的环境变量 $ env HOSTNAME=redbooks.safe.org P转载 2013-05-24 21:49:55 · 1092 阅读 · 0 评论 -
Source insight使用说明
百度百科:http://baike.baidu.com/view/1539152.htm Source Insight是一个面向项目开发的程序编辑器和代码浏览器,它拥有内置的对C/C++, C#和Java等程序的分析。Source Insight能分析你的源代码并在你工作的同时动态维护它自己的符号数据库,并自动为你显示有用的上下文信息。 Source Insight不仅仅是一个强大的程序编原创 2012-11-30 18:24:13 · 1240 阅读 · 0 评论 -
linux中的__init __initdata __initconst __exitdata __exit_call 的学习小结
在学习linux内核代码的时候,经常会遇见以上的符号,不知道是什么意思,貌似在C语言中不曾有规则定义过,下面是它的用法。在linux中“/include/linux/init.h”中定义以上宏。定义如下:#define __init __section(.init.text) __cold notrace#define __initdata __section(.ini原创 2012-10-19 17:14:37 · 4295 阅读 · 0 评论 -
从linux内核启动说起(二)
MTD分区嵌入式linux系统中的典型的分区结构图,常用的MTD设备有nandflash。在uboot和kernel中都要建立分区表,在uboot中是为了下载程序到对应的地址空间,比如下载kernel,下载根文件系统,只需要指定分区名称就可以下载;在kernel启动时会打印分区信息,挂接根文件系统。二者必须统一。Bootloader:引导加载程序,是系统上电执行的第一个程序,其原创 2013-05-13 15:46:33 · 1460 阅读 · 0 评论 -
linux subsys_initcall
宏定义__define_initcall(level,fn)对于内核的初始化很重要,他指示编译器在编译的时候,将一系列初始化函数的起始地址值按照一定的顺序放在一个section中。在内核初始化段,do_initcalls() 将按顺序从该section中以函数指针的形式取出这些函数的起始地址,来依次完成相应的初始化。于内核某些部分的初始化需要依赖于其他某些部分的初始化的完成,因此这个顺序排列常常很转载 2012-12-17 14:20:04 · 924 阅读 · 0 评论 -
区分机制和策略——UNIX设计背后最好的思想
这篇文章只要是读了《linux device drivers》这本书中的对设备驱动程序作用所作出的阐述,觉得很有道理,就结合自己的理解记录下来。在原文中写到:“区分机制和策略是Unix设计背后隐含的最好的设计思想。大多数编程问题实际上都可以分成两个部分:“需要提供什么功能”(机制)和“如何使用这些功能“(策略)。如果这两个问题由程序的不同部分来处理,或者甚至由不同的程序来处理,则这个软件包更易原创 2012-10-14 21:29:54 · 1571 阅读 · 0 评论 -
例说Linux内核链表(三)
常用的linux内核双向链表API介绍参考网站:http://www.makelinux.net/ldd3/chp-11-sect-5 linux link list结构图如下:内核双向链表的在linux内核中的位置:/include/linux/list.h使用双向链表的过程,主要过程包括创建包含struct link_head结构的结构体(item),建立链原创 2015-08-03 14:28:22 · 4522 阅读 · 2 评论 -
从linux内核启动说起(一)
Linux内核版本:VERSION = 3 PATCHLEVEL = 0 SUBLEVEL = 53Linux内核编译完成后会形成zImage内核文件,下载到开发板的处理器上面运行。由Bootloader将内核镜像拷贝到ram中运行,通过call_linux(0, machine_type, kernel_params_base)。 其中,machine_tpye 是Bootloa原创 2012-11-30 18:21:01 · 1237 阅读 · 0 评论 -
Linux内核访问外设I/O资源的方式-静态映射(map_desc)方式
我们知道默认外设I/O资源是不在Linux内核空间中的(如sram或硬件接口寄存器等),若需要访问该外设I/O资源,必须先将其地址映射到内核空间中来,然后才能在内核空间中访问它。Linux内核访问外设I/O内存资源的方式有两种:动态映射(ioremap)和静态映射(map_desc)。一、动态映射(ioremap)方式动态映射方式是大家使用了比较多的,也比较简单。即直接通过内核提供的i转载 2012-11-28 13:13:58 · 1593 阅读 · 0 评论 -
Linux架构
作者:Vamei 出处:http://www.cnblogs.com/vamei转载 2014-08-18 11:09:41 · 960 阅读 · 0 评论 -
例说Linux内核链表(二)
链表使用我认为熟悉内核链表功能最好的方法就是看一些简单的实例,实例是一个非常好的素材去更好的理解链表。下面是一个例子,包含创建,添加,删除和遍历链表。#include #include #include "list.h"struct kool_list{ int to; struct list_head list; int from; };//自定义欲链接的数据翻译 2014-10-14 23:50:19 · 1363 阅读 · 0 评论 -
linux process management
CREAT PROCESSfork()|clone(参数,决定父子函数的共享内容)|do_fork()|copy_process()|dup_task_struct()创建子进程的内核堆栈,复制父进程的进程描述符(task_struct)进程描述符的很多成员被清除或者设为初值设置子进程的状态task_struct-->state原创 2014-10-16 14:55:37 · 1496 阅读 · 0 评论 -
Linux写时拷贝技术(copy-on-write)
COW技术初窥: 在Linux程序中,fork()会产生一个和父进程完全相同的子进程,但子进程在此后多会exec系统调用,出于效率考虑,linux中引入了“写时复制“技术,也就是只有进程空间的各段的内容要发生变化时,才会将父进程的内容复制一份给子进程。 那么子进程的物理空间没有代码,怎么去取指令执行exec系统调用呢? 在fork之后exec之转载 2014-10-21 13:40:43 · 1027 阅读 · 0 评论