Linux
文章平均质量分 91
这里大部分是自己学习Linux内核机制开发中遇到的问题或者总结性文章,笔者在今后的工作中也将陆续添加在驱动开发中继续进行一些技术性总结,希望对大家的学习有所帮助。
狂奔的乌龟
1、博客介绍:专注分享ARM Trustzone/TEE/Linux/嵌入式等领域知识,大部分是个人学习笔记,关注我,一起学习!希望在这里能和大家一起进步,星光不负赶路人,加油!
2、个人介绍:ARM/TEE/Linux等领域忠实爱好者,个人长期专注于硬件安全、系统安全、嵌入式领域安全开发工作。
3、个人语录:积累是一个漫长的过程,未来很长,一起努力,只要路是对的,就不怕路远。
4、招聘广告:目前在国内大厂上班,长期招聘高级别&有经验的硬件安全、系统安全、嵌入式底层软件架构师&SE&MDE,寻求志同道合有志之士,有意向可私信我。
展开
-
Linux内核学习笔记——堆内存“懒/惰性”分配。
写入该页面/其中一个页面(作为第一次访问,或者在它被 `CoW` 映射到零页面之后)将软页面错误,并且 `Linux` 的页面错误处理程序将分配一个新的物理页面并将其清零。`libc` 包装器没有在那里做任何特殊的重试;所有的逻辑(检查目标页面存在和对待它就像一个软或硬页面错误)发生在内核的实现里面`read`,作为其一部分`copy_to_user`。(基本上是从内核内存到用户空间的 `memcpy`,`-EFAULT`如果您向内核传递一个您甚至在逻辑上都不拥有的指针,则可以通过权限检查使其返回。即,如果原创 2023-03-12 22:21:24 · 1152 阅读 · 0 评论 -
Linux内核学习笔记——页表的那些事。
接上两文,本文补充一下内核页表和用户页表创建、更新时机说明。KPTI中每个进程有两套页表——内核态页表与用户态页表(两个地址空间)。内核态页表只能在内核态下访问,可以创建到内核和用户的映射(不过用户空间受SMAP和SMEP保护)。内核页表:即书上说的主内核页表,在内核中其实就是一段内存,存放在主内核页全局目录中,硬件并不直接使用。进程页表:每个进程自己的页表,放在进程自身的页目录中。。从这个角度看,其实是完全没有用到“内核页表”的,那么“内核页表”有什么用呢?跟“进程页表”有什么关系呢?原创 2023-03-05 16:29:12 · 1986 阅读 · 0 评论 -
Linux内核学习笔记——内核页表隔离KPTI机制(源码分析)
KPTI(Kernel PageTable Isolation)全称内核页表隔离,它通过完全分离用户空间与内核空间页表来解决页表泄露。不过由于涉及到上下文切换,所以在用户态页表中必须包含部分内核地址,用来建立到中断入口和出口的映射。内核态页表只能在内核态下访问,可以创建到内核和用户的映射(不过用户空间受SMAP和SMEP保护)。开启KPTI后,再想提权就比较有局限性,比如我们常用的ret2usr方式在KPTI下将成为过去时。中断上半部的要求是尽可能的快,从而切换CR3这个操作也要求尽可能的快。原创 2023-01-08 20:42:41 · 1272 阅读 · 0 评论 -
Linux内核学习笔记——Crypto基础框架
本篇文章主要分析关于kernel crypto算法框架,以及结合它在文件系统加密这一场景中的应用,分析内部的实现细节,以便读者对Linux crypto框架有相关的认识,并能基于它做开发。本篇文章的所有代码都是围绕Linux-5.10源码进行阅读。为方便理解,我们约定一些术语:数据转换(transformation/TFM):不管是对数据做加/解密,还是做hash,都定义成是对数据所做的转换操作。...原创 2022-07-11 00:15:00 · 3387 阅读 · 0 评论 -
Linux内核学习笔记——SELinux介绍(SELinux Policy是什么?)
本文主要描述了SELinux的原理,以及在android中的使用。第一部分首先介绍了SELinux的基础框架;第二部分介绍了SELinux的基础理论;第三部分简单介绍了SELinux Policy。本文主要基于android系统的SELinux讲解,水平有限,如果有错误,敬请指正。一、SELinux Overview1. SELinux 来源SELinux 即Security-Enhanced Linux,由美国国家安全局(NSA)发起,Secure Computing Corporation转载 2022-07-01 08:09:24 · 2196 阅读 · 1 评论 -
Linux内核学习笔记 - RCU机制总结
目录一、什么是RCU机制1、历史背景 —— 原始的RCU思想2、基础架构 —— RCU算法设计3、实现思路—— 读写回收实现思路4、实现思路 —— 实例说明宽限期订阅——发布机制数据读取的完整性二、RCU核心API1、rcu_read_lock()2、rcu_read_unlock()3、synchronize_rcu()4、call_rcu()5、rcu_assign_pointer()6、rcu_dereference()7、内核常见使用实例一、什么是RCU机制RCU机制是Linux2.6之后提供的原创 2022-04-30 13:44:53 · 4081 阅读 · 2 评论 -
Linux内核学习笔记——Linux中的用户组和权限管理(UID是什么?)
目录一、背景进程权限最小权限原则linux系统安全模型用户用户组用户和组的关系安全上下文进程的用户ID函数setreuid和setregid函数seteuid和setegid思考:UID能为TEE安全世界带来什么用处呢?一、背景Linux的用户在登录(login)之后,就带有一个用户身份(user ID, UID)和一个组身份(group ID, GID)。一般来说,Linux的用户信息保存在/etc/passwd中,组信息保存在/etc/group中,文件的每一行代表一个用户/组。早期的Linux将原创 2022-04-22 22:06:25 · 7617 阅读 · 0 评论 -
Linux系列之soft lockup机制 浅析
Linux soft lockup机制 浅析 1、背景2、什么是lockup?2.1 lockup检测机制2.2 softlockup的工作原理3、soft lockup机制分析3.1 watchdog_threads结构体介绍3.2 创建喂狗线程watchdog/x3.3 hrtimer看门狗4、对watchdog的设置4.1 通过命令行设置4.2 通过sysfs节点调节watchdog4.3 定位soft lockup异常1、背景此章节转自宋宝华老师博文提到soft lockup,大家都不会陌生:原创 2021-10-22 23:34:23 · 6129 阅读 · 0 评论 -
Linux 内存管理之 mmap 解析(一)
1、mmap 函数用法:#include void *mmap(void *start, size_t length, int prot, int flags,int fd, off_t offset);int munmap(void *start, size_t length);/*返回说明:成功执行时,mmap()返回被映射区的指针,munmap()返回0。失败时,mmap()返回M原创 2015-07-15 20:45:08 · 1189 阅读 · 0 评论 -
DMA (Direct Memory Access,直接内存存取)
对DMA内存的使用有3种方式:1,一致DMA映射通过dma_alloc_coherent(struct device *dev, size_t size, dma_addr_t *dma_handle, gfp_t flag)来直接得到一块用于dma的内存,同时得到这一段内存的虚拟地址和总线地址,分别用于CPU和device的访问。 通过这种方式得到的dma内存,开发者不用担心cache的问题,但原创 2015-07-18 18:40:26 · 3401 阅读 · 0 评论 -
物理地址与虚拟地址、统一编址与独立编址以及 I/O 端口与 I/O 内存
【摘要】物理地址与虚拟地址、统一编址与独立编址以及 I/O 端口与 I/O 内存。原创 2015-06-18 22:38:57 · 2751 阅读 · 0 评论 -
Linux 内存管理之 mmap 解析(二)
1、mmap()系统调用形式void* mmap ( void * addr , size_t len , int prot , int flags , int fd , off_t offset ) mmap的作用是映射文件描述符fd指定文件的 [off,off + len]区域至调用进程的[addr, addr + len]的内存区域, 如下图所示:参数fd:为即将映射到进程空间的文件描述字原创 2015-07-15 21:05:15 · 1601 阅读 · 0 评论 -
ioremap 函数映射操作已知的物理地址(寄存器、端口、IO)
ioremap 函数来映射到内核地址空间,然后修改虚拟地址空间达到控制寄存器的状态。我用如下方法操作一个地址为0x56000020的端口原创 2015-07-23 22:10:59 · 4701 阅读 · 0 评论 -
C语言关键词volatile用法。
1、引言volatile 影响编译器编译的结果,指出,volatile 变量是随时可能发生变化的,与volatile变量有关的运算,不要进行编译优化,以免出错,(VC++ 在产生release版可执行码时会进行编译优化,加volatile关键字的变量有关的运算,将不进行编译优化。)。 例如: volatile int i=10; int j = i; ... int k = i; 2、vo原创 2015-09-14 17:10:35 · 7220 阅读 · 0 评论 -
Linux 文件系统底层实现
1、引言Linux文件管理从用户的层面介绍了Linux管理文件的方式。Linux有一个树状结构来组织文件。树的顶端为根目录(/),节点为目录,而末端的叶子为包含数据的文件。当我们给出一个文件的完整路径时,我们从根目录出发,经过沿途各个目录,最终到达文件。我们可以对文件进行许多操作,比如打开和读写。在Linux文件管理相关命令中,我们看到许多对文件进行操作的命令。它们大都基于对文件的打开和读写操作。比原创 2015-09-21 12:22:41 · 4490 阅读 · 0 评论 -
Linux MakeFile (编写、函数以及指定位置存放)
1、MakeFile 编写正如前面所说的,如果一个工程有3个头文件,和8个C文件,我们为了完成前面所述的那三个规则,我们的Makefile应该是下面的这个样子的。edit : main.o kbd.o command.o display.o \ insert.o search.o files.o utils.o cc -o edit main.o kbd.o command.o dis原创 2015-12-16 17:03:59 · 4742 阅读 · 0 评论 -
Ubuntu 设置静态 IP(转)
1. 找到文件并作如下修改:sudo vim /etc/network/interfaces修改如下部分:auto eth0iface eth0 inet staticaddress 192.168.1.127gateway 192.168.1.1 #这个地址你要确认下 网关是不是这个地址netmask 255.255.255.0network 192.168.1.转载 2015-12-17 10:45:15 · 579 阅读 · 0 评论 -
ununtu 13.10 更新源文件
ubuntu 更新源 ubuntu 13.10 更新源ubuntu 10.4 更新源原创 2015-05-22 16:29:24 · 1178 阅读 · 0 评论 -
Linux 下函数栈帧分析
1、关于栈对于程序,编译器会对其分配一段内存,在逻辑上可以分为代码段,数据段,堆,栈代码段:保存程序文本,指令指针EIP就是指向代码段,可读可执行不可写数据段:保存初始化的全局变量和静态变量,可读可写不可执行BSS:未初始化的全局变量和静态变量堆(Heap):动态分配内存,向地址增大的方向增长,可读可写可执行栈(Stack):存放局部变量,函数参数,当前状态,函数调用信息等,向地址减小的方原创 2016-05-11 16:51:37 · 8515 阅读 · 12 评论 -
Linux 下安装 wine
Linux下安装wine方法1:wine 下载地址:http://download.csdn.net/detail/xy010902100449/8728635进入安装目录tar -jxvf wine-1.7.33.tar.bz2cd wine-1.7.33./configure这个时候会提示一堆的错误,按照提示安装 apt-get install flex bisons假设这连个依赖库不能下载,那可能就是你的Linux的源不对,可以参照我上一篇博客更新自己Linux的源。./con原创 2015-05-22 16:41:17 · 3556 阅读 · 0 评论 -
Linux 如何生成静态库和动态库
1、引言1、linux下的库 静态库和共享库(动态库),二者的不同点在于代码被载入的时刻不同。 静态库的代码在编译过程中已经被载入可执行程序,因此体积较大。 共享库的代码是在可执行程序运行时才载入内存的,在编译过程中仅简单的引用,因此代码体积较小。2、库存在的意义 库是别人写好的现有的,成熟的,可以复用的代码,你可以使用但要记得遵守许可协议。 现实中每个程序都要依赖很多基础的底层库,不可能原创 2015-08-20 23:02:41 · 3592 阅读 · 0 评论 -
tar 压缩与解压命令(汇总)
tar命令详解-c: 建立压缩档案-x:解压-t:查看内容-r:向压缩归档文件末尾追加文件-u:更新原压缩包中的文件这五个是独立的命令,压缩解压都要用到其中一个,可以和别的命令连用但只能用其中一个。下面的参数是根据需要在压缩或解压档案时可选的。-z:有gzip属性的-j:有bz2属性的-Z:有compress属性的转载 2015-09-03 16:45:06 · 2118 阅读 · 0 评论 -
内核态空间地址直接映射到用户态空间访问
【摘要】Linux中的内核空间到用户空间的地址映射让用户层应用可以直接访问内核地址,这就是mmap方法。应用程序通过内存映射可以直接访问设备的I/O存储区或DMA缓冲。内存映射使用户空间的一段地址关联到设备内存上,程序在映射的地址范围内进行读取或者写入,实际上就是对设备的访问。原创 2015-07-23 21:31:27 · 8950 阅读 · 1 评论 -
手把手教你把 Vim 改装成一个 IDE 编程环境(图文)
手把手教你把Vim改装成一个IDE编程环境(图文)By:吴垠Date:2007-09-07Version:0.5Email:lazy.fox.wu#gmail.comHomepage:http://blog.csdn.net/wooinCopyright:该文章版权由吴垠和他可爱的老婆小包子所有转载 2015-06-12 21:09:25 · 1032 阅读 · 0 评论 -
vim 常用操作自我小结
vim 基本操作太多了,多得根本记不过来,还是对一些比较常用的操作做一个小笔记,尤其是替换字符串操作。(1)进入 vim 编辑器vim filename:打开或新建文件,并将光标置于第一行首vim +n filename :打开文件,并将光标置于第n行首vim filename....filename :打开多个文件,依次编辑(2) 移动光标vi可以直接用键盘上的光标键来上下左右移动,但正规的vi是用小写英文字母h、j、k、l,分别控制光标左、下、上、右移一格。按Ctrl+B:屏幕往后移动原创 2015-06-13 09:15:15 · 598 阅读 · 0 评论 -
ADB 远程访问 tiny210
1、安装USB ADB驱动程序 安装SDK Manager、注册环境变量 2、ADB连接开发板出错当把开发板连接到电脑端口运行adb程序调试时,出现了下面这样的情况:分析:出错的原因是adb的端口被其他程序的进程占领了,所以要做的就是找到并kill该进程。在cmd中执行adb nodaemon server,查看adb的端口号是多少,一般情况下是5037(why?应该软件使用的端口号是固定的),如下图再执行netstat -ano | findstr "5037" ,会看到如下类似原创 2015-05-24 14:48:57 · 1015 阅读 · 0 评论 -
Linux 系统下的 proc 目录
1,、proc — 一个虚拟文件系统 /proc 文件系统是一种内核和内核模块用来向进程 (process) 发送信息的机制 (所以叫做 /proc)。这个伪文件系统让你可以和内核内部数据结构进行交互,获取 有关进程的有用信息,在运行中 (on the fly) 改变设置 (通过改变内核参数)。 与其他文件系统不同,/proc 存在于内存之中而不是硬盘上。2、/proc 由内核控制,没有承载 /proc 的设备。因为 /proc 主要存放由内核控制 的状态信息,所以大部分这些信息的逻辑位置位于内核控制的原创 2015-05-25 21:39:06 · 938 阅读 · 0 评论 -
日版 Galaxy Note sc05d 涮机
问题描述:手机已坏,进不了系统下面提供线涮刷机教程:1.首先拔掉你的sd卡和sim卡,双清你的手机,可能有些版本的机油没有双清模式,那就进到设置里边恢复出厂设置,然后关掉你的手机再开机,等到到了开机画面果断拔掉电池再装上,然后摁着音量-键和home键和开机键,等待出现开机画面就全松开,之后手机出现若干日文画面不吊它,直接再摁下音量+键(不成功的多试几次),成功画面为有一个安卓小人。2.打开odin,勾选PAD选择SC05D4.0.4专属rom.tar,然后连接手机.点击开始涮机,等待7-8分钟,原创 2015-06-07 10:08:53 · 1550 阅读 · 0 评论 -
GNU C 之 attribute的机制
GNU C 的一大特色就是__attribute__ 机制。__attribute__ 可以设置函数属性(Function Attribute )、变量属性(Variable Attribute )和类型属性(Type Attribute )。__attribute__ 书写特征是:__attribute__ 前后都有两个下划线,并切后面会紧跟一对原括弧,括弧里面是相应的__attribute__ 参数。__attribute__ 语法格式为:__attribute__ ((attribute-li原创 2015-05-07 14:48:24 · 1005 阅读 · 0 评论 -
Android 5.1 API 22 所有sdk文件下载地址
Android 5.1 API 22 所有sdk文件下载地址https://dl-ssl.google.com/android/repository/docs-22_r01.ziphttp://dl.google.com/android/repository/android-22_r01.ziphttps://dl-ssl.google.com/android/repository/samples-22_r05.ziphttps://dl-ssl.google.com/android/reposi原创 2015-05-24 11:07:16 · 9599 阅读 · 0 评论 -
关于Red Hat 企业版下输入ifconfig显示not found问题解决办法
关于Red Hat 企业版下输入ifconfig显示not found问题解决办法我们输入命令:#ifconfig回车显示bash: ifconfig: command not found可能是红帽路径问题,然后输入#/sbin/ifconfig 就会显示IP地址等信息。解决办法:(我也是菜鸟这都是版主和xiaojie教我的,跟大家分享一下)执行#cat ~/.bash_profile 看自己的PATH,然后再执行:#gedit /etc/profile 然后会弹出一个文本框框,在最后一行后原创 2015-05-08 19:46:50 · 1657 阅读 · 0 评论 -
Linux 内核中 likely 与 unlikely 的宏定义解析
在 2.6 内核中,随处可以见到 likely() 和 unlikely() 的身影,那么为什么要用它们?它们之间有什么区别? 首先要明确: if(likely(value)) 等价于 if(value) if(unlikely(value)) 也等价于 if(value)也就是说 likely() 和 unlikely() 从阅读和理解代码的角度来看,是一样的!!!#define原创 2015-07-14 20:46:13 · 1169 阅读 · 0 评论 -
Linux中 ps aux 命令
$ ps auxUSER PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMAND root 11 100.0 0.0 0 16 ?? RL 4Dec09 98403:03.48 [idle: cpu root 12 100.0 0.0原创 2015-07-14 20:37:08 · 2226 阅读 · 0 评论 -
dma_alloc_coherent (建立一致性 DMA 映射函数)
A: 内存的虚拟起始地址,在内核要用此地址来操作所分配的内存B: struct device指针,可以平台初始化里指定,主要是dma_mask之类,可参考framebufferC: 实际分配大小,传入dma_map_size即可D: 返回的内存物理地址,dma就可以用。所以,A和D是一一对应的,只不过,A是虚拟地址,而D是物理地址。对任意一个操作都将改变缓冲区内容。当然要注意操作环境。原创 2015-07-25 19:24:31 · 19232 阅读 · 1 评论 -
嵌入式 Linux 对内存的直接读写(devmem)
【摘要】这个工具的原理也比较简单,就是应用程序通过mmap函数实现对/dev/mem驱动中mmap方法的使用,映射了设备的内存到用户空间,实现对这些物理地址的读写操作。原创 2015-07-23 21:03:36 · 25343 阅读 · 2 评论 -
GNU C - 一个别致的 HelloWorld 程序 (__attribute__机制)
对[ __attribute__ ] 很感兴趣,下面来看一个不一样的HelloWorld程序:12345678910111213141516171819#include #include原创 2015-08-03 21:31:52 · 1028 阅读 · 0 评论 -
__attribute__((constructor))
gcc为函数提供了几种类型的属性,其中包含:构造函数(constructors)和析构函数(destructors)。 程序员应当使用类似下面的方式来指定这些属性:__attribute__((constructor)) // 在main函数被调用之前调用__attribute__((destructor)) // 在main函数被调用之后调#include<stdio.h> __attrib原创 2015-08-03 21:31:06 · 6106 阅读 · 0 评论 -
dlopen Linux 动态库失败原因与解决办法总结
1、dlopen 动态库失败原因,我碰到主要是以下几点(碰到新问题之后再完善,先打个点) ①动态库位置没有放对地方,dlopen 时候找不到你想操作的动态库 解决办法:放到指定目录。 ②头文件没有包全,有不能识别的函数或者标识符 解决办法:加一条打印信息,程序运行到这里,会输出不能识别标识符。if((handle = dlopen(myso, RTLD_NOW)) == NULL) {原创 2015-08-27 22:10:15 · 43416 阅读 · 0 评论 -
dlopen 方式调用 Linux 的动态链接库
在dlopen()函数以指定模式打开指定的动态链接库文件,并返回一个句柄给 dlsym()的调用进程。使用 dlclose()来卸载打开的库。/*功能:打开一个动态链接库,并返回动态链接库的句柄包含头文件:#include 函数定义:*/void * dlopen( const char * pathname, int mode);/*函数描述:mode是打开方式,其值有多原创 2015-08-02 09:49:22 · 3092 阅读 · 0 评论 -
Linux 下动态链接库 *.so(生成、调用)
【摘要】动态库*.so在linux下用c和c++编程时经常会碰到,最近在网站找了几篇文章介绍动态库的编译和链接,这里做个笔记。1、动态库的编译下面通过一个例子来介绍如何生成一个动态库。这里有一个头文件:so_test.h,三个.c文件:test_a.c、test_b.c、test_c.c,我们将这几个文件编译成一个动态库:libtest.so。//so_test.h:#include "stdio原创 2015-08-02 09:34:12 · 3174 阅读 · 0 评论