Linux
JoggingPig
多读好书、多总结、多扩展、多实践
展开
-
汇编常用指令
不同体系架构的指令集不同,但是常用的汇编语言的助记符号大都相同(英文缩写):原创 2020-12-14 14:47:26 · 130 阅读 · 0 评论 -
设备树基本知识
设备树是什么?设备树是用于描述硬件的数据结构;在系统启动时将这些描述硬件的数据传递给操作系统解析;The devicetree is used by OpenFirmware, OpenPOWER Abstraction Layer (OPAL), Power Architecture Platform Requirements (PAPR) and in the standalone Flattened Device Tree (FDT) form.(这就是为什么Linux内核中提供用来解...原创 2020-12-14 13:59:42 · 565 阅读 · 0 评论 -
如何通过文件描述符找到文件?
什么是进程?Linux中用task_struct结构体表示进程(https://elixir.bootlin.com/linux/v5.7.8/source/include/linux/sched.h#L632)struct task_struct {#ifdef CONFIG_THREAD_INFO_IN_TASK /* * For reasons of header soup (see current_thread_info()), this * must be the firs原创 2020-07-29 23:22:42 · 892 阅读 · 0 评论 -
I2C总线驱动
I2C驱动由3部分组成:I2C核心、I2C总线驱动、I2C设备驱动。一个i2c总线上挂了几个器件,i2c总线需要驱动, 器件也需要驱动。一个i2c器件被定义为i2c_ client对象;https://elixir.bootlin.com/linux/latest/source/include/linux/i2c.h#L314一个i2c器件需要绑定的驱动被定义为i2c_drvier对象;https://elixir.bootlin.com/linux/latest/...原创 2020-12-07 21:17:02 · 587 阅读 · 0 评论 -
设备驱动模型
软件分层设计是软件工程最基本的一个思想;LInux设备和驱动分离Linux设备驱动分层设备驱动的主机、外设驱动分离---分隔思想设备驱动模型由总线、设备、驱动3个实体构成https://elixir.bootlin.com/linux/v4.14.191/source/include/linux/device.h该文件中,对总线、设备、驱动3个实体用相应的结构体进行了描述;系统每注册一个设备时,会...原创 2020-08-18 12:32:30 · 442 阅读 · 0 评论 -
Linux内核目录结构
https://elixir.bootlin.com/linux/latest/source.├── arch //存放特定平台的芯片对Linux内核进程调度、内存管理、中断等支持;基于架构的具体实现,都应该在该目录下寻找├── block //块设备驱动程序I/O调度├── certs ├── CREDITS├── crypto //常用加密算法(非对称加密算法RSA、对称加密算法AES)、散列算法(又称hash算法、消息摘要算法,MD5、SHA)、HMAC(HASH...原创 2020-12-07 00:06:49 · 261 阅读 · 0 评论 -
内核同步有哪些机制?这些机制如何使用?
内核同步有哪些机制?1.原子操作(不可分割)原子操作是其他同步方法的基石;原子整数最常见的用途就是实现计数器;2.自旋锁(spin lock)自旋锁的特性:自旋锁最多只能被一个执行线程持有;若有执行线程去尝试获取已经被持有的自旋锁,会自旋(占着cpu空转);利用自旋锁的特性:为多处理器机器提供了防止并发访问所需的保护机制;使用自旋锁的初衷:在短时间内进行轻量级加锁;处理对锁争用的方式:让请求锁的执行线程睡眠,直到请求的...原创 2020-12-04 22:08:00 · 208 阅读 · 0 评论 -
根文件系统
根文件系统 一种文件系统具有普通文件系统的存储数据文件的功能;特殊:内核启动时挂载的第一个文件系统;内核的镜像文件保存在根文件系统中,系统引导启动程序会在根文件系统挂载之后从中把一些初始化脚本(如rcS,inittab)和服务加载到内存中去运行。文件系统和内核是完全独立的两个部分。它文件系统的”根“,那么如果没有这个根,其它的文件系统也就没有办法进行加载的。根文件系统包含系统启动时所必须的目录和关键性的文件,以及使其他文件系统得以挂载(mount)所必要的文件。ini...原创 2020-11-28 18:44:49 · 83 阅读 · 0 评论 -
Linux中的系统调用
当用户态的进程调用一个系统调用时,cpu切换到内核态并开始执行一个内核函数。内核实现了许多不同的系统调用,进程必须传递一个名为系统调用号(system call number)的参数来识别所需的系统调用,eax寄存器就用作此目的。所有的系统调用均返回一个整数值。系统处理程序与其他异常处理程序的结构类似:在内核态保存大多数寄存器的内容 调用名为系统调用服务例程的相应的C函数来处理系统调用 退出系统调用处理程序:用保存在内核栈中的值加载寄存器,cpu从内核态切换回到用户态。...原创 2020-11-28 18:30:18 · 142 阅读 · 0 评论 -
Linux中的poll
系统调用poll() //传入带监听的所有文件描述,以及相应数量和超时事件将用户空间的文件描述等数据转存到内核空间的poll_list中遍历每一个文件描述,并调用文件描述的poll()方程返回每一个文件描述的IO准备情况,0-为准备好,1-准备好根据是否有文件准备好或者超时判断当前poll调用是否结束;如果不结束,则开始睡眠;否则poll系统调用返回...原创 2020-11-28 14:08:58 · 136 阅读 · 0 评论 -
Linux中的epoll机制
Linux中的epoll机制的作用用于一次监听多个描述符的可读可写状态,而不需要为每个描述符创建一个线程。相关的APIint epoll_create(int max_fds)传递的参数为可监听的最大描述符数量,返回一个epoll对象描述符。int epoll_ctl(int epfd, int op, int fd, struct epoll_event* event)注册待监听的描述符int epoll_wait(int epfd, struct epoll_even..原创 2020-11-28 14:03:18 · 133 阅读 · 0 评论 -
Linux中的inotify机制
Linux中INotify机制的作用用于检测文件系统的变化。可以用于单个文件,也可以用于检测整个目录。如果是整个目录的话,目录本身及目录中的内容都会是检测的对象。原创 2020-11-28 13:57:02 · 213 阅读 · 0 评论 -
SOCKET编程
socket编程分为server端和client端。在server端的基本流程为:创建socket(socket())->绑定端口(bind())->监听端口(listen())->阻塞等待(accept())-> 对socket读/写(read(),write())-> 关闭socket(close())在client端的基本流程为:创建socket(socket())-> 连接服务器(connect())->对socket读/写->(rea.原创 2020-11-28 13:54:12 · 75 阅读 · 0 评论 -
Linux中的特殊进程:idle进程、init进程、kthreadd进程
Linux中的三个特殊进程:idle进程: 该进程是Linux中的第一个进程(线程),PID为0; idle进程是init进程和kthreadd进程(内核线程)的父进程;init进程: init进程是Linux中第一个用户空间的进程,PID为1; init进程是其他用户空间进程的直接或间接父进程;kthreadd(内核线程): kthre...原创 2020-11-27 19:24:18 · 1753 阅读 · 0 评论 -
定时器和时间管理
时间管理在内核中占非常重要的地位;相对时间;绝对时间;周期性产生事件---都是由系统定时器驱动的;什么是系统定时器?系统定时器是一种可编程的硬件芯片,它能以固定的频率产生中断---定时器中断;定时器中断对应的中断处理程序负责更新系统时间,也负责执行需要周期性执行的任务;什么是动态定时器?动态定时器---一种用来推迟执行程序的工具;内核能够动态创建或撤销动态定时器;内核必须在硬件的帮助下才能计算和管理时间;硬件为...原创 2020-09-18 00:54:43 · 386 阅读 · 0 评论 -
ELF文件
elf文件可以分为三种类型可重定位的目标文件(Relocatable File,或者Object File)、可执行(Executable)、共享库(Shared Object,或者Shared Library)。elf文件物理上可以分为elf header、Program Header Table、Sections和Section Header Table几个部分。eh是elf header的缩写;ph是Program Header的缩写;sh是Section Header的缩..原创 2020-09-06 20:53:15 · 135 阅读 · 0 评论 -
栈和栈帧
函数的调用和返回使栈的增长和收缩呈线性。专用寄存器---栈指针(stack pointer) , 用千跟踪当前栈顶。每次调用函数时,会在栈上新分配一帧,每当函数返回时,再从栈上将此帧移去。内核栈是每个进程保留在内核内存中的内存区域;内核栈在执行系统调用的过程中供(内核)内部函数调用使用;每个(用户)栈帧包括如下信息:函数实参和局部变量: 由于局部变量都是在调用函数时自动创建的,因此在C 语言中称其为自动变量; 函数返回时将自动销毁...原创 2020-08-31 12:27:14 · 320 阅读 · 0 评论 -
进程
进程(process) 是一个可执行程序(program) 的实例。从内核角度:进程是由内核定义的抽象的实体,并为该实体分配用以执行程序的各项系统资源(因为进程的创建工作其实都是由内核完成的)。程序(将可执行程序文件加载到内存中去)是包含一系列信息的文件:二进制格式标识: 每个程序文件都包含用于描述可执行文件格式的元信息(metainformation) 。 内核(kernel) 利用此信息来解释文件中的其他信息。机器语言指令:对程序算法进...原创 2020-08-29 21:58:17 · 630 阅读 · 0 评论 -
系统调用
系统调用是受控的内核入口;系统调用将处理器从用户态切换到核心态,以便CPU 访问受到保护的内核内存。系统调用的组成是固定的,每个系统调用都由一个唯一的数字来标识。(程序通过名称来标识系统调用,对这一编号方案往往一无所知。)每个系统调用可辅之以一套参数,对用户空间(亦即进程的虚拟地址空间)与内核空间之间(相互)传递的信息加以规范。1. 应用程序通过调用C 语言函数库中的外壳(wrapper) 函数,来发起系统调用。2. 对系统调用中断处理例程(稍后介绍)来...原创 2020-08-29 19:13:57 · 201 阅读 · 0 评论 -
客户端/服务器架构
客户端/服务器架构又称C/S(client/server)架构;客户端/服务器应用由两个组件进程组成;什么是客户端应用程序?客户端应用通常与用户打交道;向服务器应用程序发送请求消息,请求服务器应用程序执行某些服务;什么是服务器应用程序?服务器应用提供对某些共享资源的访问;(服务器能提供的服务有多种)分析客户端的请求,执行相应的动作,并返回响应消息给客户端;客户端应用如何和服务器应用进行交互?IPC机制;客户端应用与服务器应用的分布?客户端和...原创 2020-08-29 16:08:19 · 1851 阅读 · 0 评论 -
环境列表
什么是环境列表?进程用户空间内存中维护的一组环境变量;环境列表的元素组成是?列表中每个元素都是由名称(name)及其值(value)组成;多数shell中,用export name='value' 来创建环境变量;每个进程都有一份环境列表;子进程会继承父进程的环境副本;子进程可以在exec()函数调用中修改从父进程继承来的环境副本;C 语言程序可使用外部变量(char **environ) 来访问环境;char **environ 可以理解为一个指...原创 2020-08-29 15:17:16 · 190 阅读 · 0 评论 -
命令行参数
什么是命令行参数?程序以运行时在命令行中输入的内容;C语言程序中可以访问命令行参数;C中如何访问命令行参数?在程序的main函数中做声明:int main(int argc, char *argv[])argc(arguments count)参数个数;argv(arguments vector)参数向量---字符指针数组、字符串数组;C中,首个字符串argv[0], 标识程序名本身;参考书籍:Linux/Unix系统编程手册...原创 2020-08-29 14:49:07 · 153 阅读 · 0 评论 -
什么是当前工作目录?
当前目录:某个进程当前运行在根目录下的“某个位置”(根目录下的某个目录);每个进程都有一个当前工作目录(简称进程工作目录或当前目录);当前工作目录是进程解释相对路径名的参照点;进程的当前工作目录继承自其父进程;shell(一个用户进程)的当前目录可以用cd(change directory)来改变;参考书籍:Linux/Unix系统编程手册...原创 2020-08-29 14:36:58 · 4604 阅读 · 0 评论 -
TianoCore、UEFI、EDK II
TianoCore是支持统一可扩展固件接口(UEFI)的开源实现的社区。EDK II是现代的,功能丰富的跨平台固件开发环境,适用于UEFI和UEFI平台初始化(PI)规范。EDK2---“UEFI Development Kit”(UDK)UEFI Platform Initialization---UEFI平台初始化;Unified Extensible Firmware Interface (UEFI)TianoCore社区:https://www.tianocor...原创 2020-08-20 11:53:46 · 6210 阅读 · 0 评论 -
守护进程
什么是守护进程?守护进程(daemon)是生存期长的一种进程;守护进程常常在系统引导装入时启动,仅在系统关闭时才终止;守护进程没有控制终端,所以说他们是在后台运行的;系统进程依赖于操作系统实现,父进程ID为0的各进程通常是内核进程;他们作为系统引导装入过程的一部分而启动;(init是一个由内核在引导装入时启动的用户层次的命令)内核进程说特殊的,通常存在于系统的整个生命周期中;它们以超级用户特权运行;无控制终端,无命令行;ps的输出实例中,内核...原创 2020-08-29 14:58:38 · 247 阅读 · 0 评论 -
fstab文件
fstab文件(filesystem table)的作用---让挂载分区永久生效的(挂载点被永久保存,设备重启分区不会失效)cat ./system/etc/vold.fstab | head -n 20第一列;设备名称,要被挂载的分区;第二列:挂载点,挂载到哪个文件路径;第三列:文件系统格式;第四列:文件系统参数---让挂载后的分区有一些特殊功能;第五列:备份参数;参考书籍:运维手册...原创 2020-08-19 13:33:55 · 169 阅读 · 0 评论 -
Linux下的文件类型
Linux下的文件类型:普通文件(regular file,文件符号:-)---包含某种形式数据(文本数据或二进制数据)的文件;若是二进制可执行文件,必须遵守内核支持的标准化格式(标准化格式可让内核确定程序文本和数据的加载位置); 目录文件(directory file,文件符号:d)---包含其他文件的名字及指向与这些文件有关信息的指针;只有内核可以直接写目录文件; 块设备文件(block device,文件符号:b)---该类型文件提供对块设备带缓冲的访问,每次访问以固定长度(缓冲大小决定)为单原创 2020-08-19 12:04:39 · 117 阅读 · 0 评论