
linux内核
文章平均质量分 56
jasonLee_lijiaqi
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
filebench查看每个负载的参数特性
下面是filebench中fileserver的负载设置;通过观察负载设置,找到有用的设置信息;在readfile中,iosize=$iosize,表示读操作的IO size;在appendfile中,iosize = $meanappendsize,表示写操作的IO size;set $filesize=cvar(type=cvar-gamma,parameters=mean:1310...原创 2019-04-16 14:55:00 · 1728 阅读 · 0 评论 -
Linux IO子系统和文件系统读写流程
我们所有分析的,是基于2.6.32及其后的内核.我们在Linux上总是要保存数据,数据要么保存在文件系统里(如ext3),要么就保存在裸设备里。我们在使用这些数据的时候都是通过文件这个抽象来访问的,操作系统会把我们需要的数据提交给我们,而我们则无需和块设备打交道。从下图,我们可以清除的看到:I/O子系统是个层次很深的系统,数据请求从用户空间最终到达磁盘,经过了复杂的数据流动。对设驱开发人...原创 2018-09-25 09:30:58 · 1878 阅读 · 0 评论 -
struct file中f_mode和f_flags区别
mode_t f_mode:文件模式(FMODE_WRITE,FMODE_READ),用在创建文件时使用它通过FMODE_READ和FMODE_WRITE位来标识文件是否可读或可写,因为内核在调用驱动程序的read和write前已经检查了訪问权限。所以不必为这两个方法检查权限。在没有获得相应訪问权限而打开文件的情况下,对文件的读写操作将被内核拒绝,驱动程序无需为此而作额外的推断。unsig...原创 2018-09-14 10:52:24 · 3572 阅读 · 0 评论 -
container of()函数与拓展
container of原理其实,原理很简单: 已知结构体type的成员member的地址ptr,求解结构体type的起始地址。 type的起始地址 = ptr - size (这里需要都转换为char *,因为它为单位字节)。到此,该函数已经讲完,是不是很简单??? 其实也不是,这里并没有提到size如何计算,而令我们头晕的正是这里。好吧,先上c...原创 2018-09-19 09:51:25 · 454 阅读 · 1 评论 -
QEMU挂载磁盘
1、 建一個5G的raw格式的虛擬磁盤,大小根據自己的需要設定。 $ qemu-img create test.img 5G2、接着运行qemu并加载磁盘:$ qemu-system-x86_64 -kernel /usr/src/linux-4.6.2-x86_64/arch/x86/boot/bzImage -initrd ~/Downloads/initramfs.img...原创 2018-09-07 16:58:55 · 8901 阅读 · 0 评论 -
Linux内核链表原理和实例
深入分析Linux链表链表的实例原创 2018-09-07 09:25:05 · 1478 阅读 · 0 评论 -
Linux内核栈信息获取dump_stack()
参考下面这个博客:Linux内核栈信息获取与理解原创 2018-09-10 15:02:35 · 1112 阅读 · 0 评论 -
Linux C中struct的初始化允许部分初始化并且支持乱序
在阅读GNU/Linux内核代码时,我们会遇到一种特殊的结构初始化方式。该方式是某些C教材(如谭二版、K&R二版)中没有介绍过的。这种方式称为指定初始化(designated initializer)。 下面我们看一个例子,Linux-2.6.x/drivers/usb/storage/usb.c中有这样一个结构体初始化项目: static struct usb_driver usb...原创 2018-09-06 17:37:01 · 1826 阅读 · 2 评论 -
local_irq_save和 local_irq_restore关闭和打开中断
如果你要禁止所有的中断该怎么办?在2.6内核中,可以通过下面两个函数中的其中任何一个关闭当前处理器上的所有中断处理,这两个函数定义在 < asm/system.h >中: void local_irq_save(unsigned long flags); void local_irq_disable(void);对 local_irq_save的调用将把当前中...原创 2018-09-16 11:02:14 · 2856 阅读 · 0 评论 -
slab和slub分析
slab分配器slub分配器原创 2018-09-06 15:15:24 · 654 阅读 · 0 评论 -
从文件 I/O 看 Linux 的虚拟文件系统
1 引言Linux 中允许众多不同的文件系统共存,如 ext2, ext3, vfat 等。通过使用同一套文件 I/O 系统 调用即可对 Linux 中的任意文件进行操作而无需考虑其所在的具体文件系统格式;更进一步,对文件的 操作可以跨文件系统而执行。如图 1 所示,我们可以使用 cp 命令从 vfat 文件系统格式的硬盘拷贝数据到 ext3 文件系统格式的硬盘;而这样的操作涉及到两个不同的文件...原创 2018-09-25 10:19:41 · 419 阅读 · 0 评论 -
如何编译和更换Linux系统内核
step0 — 完成编译和安装Linux需要的基本条件内核源代码从http://www.kernel.org即可下载代码,注意你需要下载的是完整的源代码包(点击tarball即可下载),而不是patch或change log之类。编译需要的软件编译kernel需要一些基本的develop工具软件,比如make和编译器,当然还有其他一些重要的工具,Debian系列的系统可以用如下...原创 2018-09-11 11:00:29 · 20927 阅读 · 1 评论 -
bio,request,request_queue的关系
通用块层的核心数据结构称为bio描述符,它描述了块设备的io操作。每一个bio结构都包含一个磁盘存储区标识符(存储区中的起始扇区号和扇区数目)和一个或多个描述与IO操作相关的内存区段(bio_vec数组)bio结构中的字段/* * main unit of I/O for the block layer and lower layers (ie drivers and * stacking...原创 2018-09-26 11:13:50 · 2822 阅读 · 1 评论 -
编译内核出现:cc1: error: code model kernel does not support PIC mode
原创 2018-11-30 14:45:33 · 24213 阅读 · 16 评论 -
kmalloc和vmalloc的区别
kmalloc和vmalloc完全不同。kmallockmalloc申请一段物理地址和逻辑地址连续的内存空间。 /* 申请一段物理地址连续的内存空间 */static __always_inline void *kmalloc(size_t size, gfp_t flags){ if (__builtin_constant_p(size)) { if (size > KMA...原创 2018-11-02 09:39:05 · 2835 阅读 · 2 评论 -
内核模块中使用未导出的函数
一般我们在编写内核模块时,可以直接使用内核中使用EXPORT_SYMBOL或者EXPORT_SYMBOL_GPL导出的函数,没有导出的内核函数不能直接使用。否则会报错未定义:WARNING:“do_sys_open”[/home/tiany/paper/mod/mySdelNotEcrypt_success/hello.ko]undefined!那么我们到底能不能使用内核中没有导出的函数呢?答...原创 2018-10-16 15:39:07 · 3476 阅读 · 3 评论 -
内存管理---匿名页面管理
一、匿名页面这些内存页面保存了一些通常所说的机动性最强的内容,或者可以认为是银行的活期存款,这些内存可以随时被使用,随时被归还。例如用户通过malloc–>>mmap申请的内存,或者通过brk/sbrk扩大的堆空间。相对于mmap文件、文件系统元数据之类的内容,这些空间对用户来说最为顺手,也最为常见。但是管理起来也比较复杂,因为这里涉及到这些页面如果被同时使用了很多,系统内存负载将会...原创 2018-10-16 09:50:43 · 3538 阅读 · 0 评论 -
Linux swap详解
推荐一篇blog,写的十分详细。特别是里面的流程图对于理解整个swap有很大的帮助。http://tinylab.org/linux-swap-and-zramfs/简介内存管理基本概念内存管理区 Struct ZonePFN(Page Frame Number)页 Struct PagePTE 与 VMA内存回收匿名页的内存回收 - 交换Zram 交换技术...原创 2018-10-15 21:13:16 · 1863 阅读 · 0 评论 -
F2FS:struct curseg_info结构
F2FS在运行时,F2FS在“Main Area”区域管理6个活跃的log,分别是Hot/Warm/Cold node log和Hot/Warm/Cold data logs,每一个log对应着一个独立的segment。Hot node : contains direct node blocks of directories.Warm node : contains dir...原创 2018-10-08 21:10:38 · 1314 阅读 · 0 评论 -
f2fs读取磁盘block过程:do_read_inode
f2fs:依据inode的节点号,将inode对应的block读到页缓存f2fs_iget依据索引节点号,查找对应的inode,若没有,则创建一个新的inode,读取磁盘上的inode所在的block,生成f2f2_inode对象去初始化这个新inode。其中,当inode不存在时,需要创建新的inode,同时还要从磁盘上读取inode所在的block;因此,这次主要针对f2fs读取磁盘bl...原创 2018-10-08 17:16:00 · 2488 阅读 · 2 评论 -
inode_hashtable哈希表及f2fs查找inode过程
文件系统中的所有inode存放在一个名为inode_hashtable的全局哈希表中。另一方面,所有的inode还存放在超级块中的s_inode链表中。inode_hashtable哈希表加快了对索引节点对象的搜索。前提是必须知道索引节点号和文件所在文件系统对应的超级块对象。该inode_table位于fs/inode.c中:static unsigned int i_hash_mask ...原创 2018-10-08 16:50:31 · 1719 阅读 · 0 评论 -
普通文件和块设备文件的page cache问题
注:本文代码基于linux-3.18.31,此版本中块缓存已经合入页缓存。写在前面普通文件和块设备文件都有一个address_space对象,inode中分别维护两个成员指向这两个不同的address_space,分别是i_mapping和i_data。需要注意的是,这两个page cache中可能拥有磁盘上相同的数据(即拥有相同的页数据)。struct inode { ………… con...原创 2018-09-26 17:30:44 · 1394 阅读 · 0 评论 -
文件读写基本流程
读文件1、进程调用库函数向内核发起读文件请求;2、内核通过检查进程的文件描述符定位到虚拟文件系统的已打开文件列表表项;3、调用该文件可用的系统调用函数read()3、read()函数通过文件表项链接到目录项模块,根据传入的文件路径,在目录项模块中检索,找到该文件的inode;4、在inode中,通过文件内容偏移量计算出要读取的页;5、通过inode找到文件对应的addres...原创 2018-09-06 11:26:53 · 4677 阅读 · 0 评论 -
FTL详细资料
FTL产生过程如果仅仅是SSD的使用者,一定不会在意在SSD内部居然还存在一个复杂的软件层Flash Translation Layer(FTL)。其实就是这个FTL才是SSD固态硬盘的软件核心技术。正因为有了FTL,NAND Flash才能被当成硬盘来使用;文件系统才可以直接把SSD当成普通块设备来使用。由于FTL是SSD设计厂商最为重要的核心技术,因此,没有一家厂商愿意透露这方面的技术信息...原创 2018-09-04 17:10:58 · 11123 阅读 · 1 评论 -
编译内核出现:implicit declaration of function
修改内核,添加了一些函数,重新编译后,出现以下情况:经过查看源码:自定义的page_is_NVM的函数定义位置 在 使用位置 的后面,这在C语言的语法中是错误的;解决方法:在文件首部,添加该函数的声明即可。...原创 2018-08-24 16:57:22 · 4380 阅读 · 0 评论 -
pfn_to_page()和page_to_pfn()
pfn_to_page()和page_to_pfn()#define page_to_pfn(page) ((unsigned long)((page) - mem_map) + PHYS_PFN_OFFSET)根据给出页地址求出对应的页帧号。两个结构相减,得出的是两者之间的对象个数,加上起始帧号偏移,即给出页地址的相对绝对页号。#define pfn_to_page(pfn) (me...原创 2018-04-16 14:29:17 · 5770 阅读 · 0 评论 -
__SetPageBuddy & __ClearPageBuddy
__SetPageBuddystatic inline void set_page_order(struct page *page, unsigned int order) { set_page_private(page, order); __SetPageBuddy(page); }__ClearPageBuddystatic inline v...原创 2018-04-16 10:30:14 · 963 阅读 · 0 评论 -
likely()与unlikely()函数的意义
看内核时总遇到if(likely( )){}或是if(unlikely( ))这样的语句,最初不解其意,现在有所了解,所以也想介绍一下。likely() 与 unlikely()是内核中定义的两个宏。位于/include/linux/compiler.h中, 具体定义如下:#define likely(x) __builtin_expect(!!(x), 1)#define unl...原创 2018-04-09 11:47:19 · 1442 阅读 · 0 评论 -
Linux进程上下文
进程上下文和中断上下文是操作系统中很重要的两个概念,这两个概念在操作系统课程中不断被提及,是最经常接触、看上去很懂但又说不清楚到底怎么回事。造成这种局面的原因,可能是原来接触到的操作系统课程的教学总停留在一种浅层次的理论层面上,没有深入去研究。处理器总处于以下状态中的一种: 1、内核态,运行于进程上下文,内核代表进程运行于内核空间; 2、内核态,运行于中断上下文,内核代表...原创 2018-04-09 10:39:02 · 976 阅读 · 0 评论 -
Linux:伙伴系统buddy system
主要为了解决外碎片的问题。为了满足对连续大的页框的需求原创 2018-03-26 11:34:33 · 762 阅读 · 0 评论 -
Linux中的TLB小结
TLB(Translation Lookaside Buffer)转换检测缓冲区TLB是一个内存管理单元,用于改进虚拟地址到物理地址转换速度的缓存。 TLB是一个小的,虚拟寻址的缓存,其中每一行都保存着一个由单个PTE(Page Table Entry,页表项)组成的块。如果没有TLB,则每次取数据都需要两次访问内存,即查页表获得物理地址和取数据。重点:加快线性地址(逻辑地址...原创 2018-03-26 10:49:57 · 2694 阅读 · 0 评论 -
Hadoop总结
Hadoop分布式文件系统的要点总结0 引言Hadoop分布式文件系统(HDFS)被设计成适合运行在通用硬件(commodity hardware)上的分布式文件系统。它和现有的分布式文件系统有很多共同点。但同时,它和其他的分布式文件系统的区别也是很明显的。HDFS是一个高度容错性的系统,适合部署在廉价的机器上。HDFS能提供高吞吐量的数据访问,非常适合大规模数据集上的应用。HDFS放宽了一部分PO原创 2017-11-05 16:45:21 · 723 阅读 · 0 评论 -
挂载PramFS遇到的关于SELinux的问题
挂载PramFS遇到的关于SELinux的问题,SELinux没有配置标签原创 2017-04-21 15:05:14 · 477 阅读 · 2 评论 -
linux内存源码分析 - SLAB分配器概述
基于linux 2.6.34 之前说了管理区页框分配器,这里我们简称为页框分配器,在页框分配器中主要是管理物理内存,将物理内存的页框分配给申请者,而且我们知道也可页框大小为4K(也可设置为4M),这时候就会有个问题,如果我只需要1KB大小的内存,页框分配器也不得不分配一个4KB的页框给申请者,这样就会有3KB被白白浪费掉了。为了应对这种情况,在页框分配器上一层又做了一层SLAB层,SLAB分配...原创 2018-04-13 10:02:03 · 556 阅读 · 0 评论 -
内存泄漏检测kmemleak分析
转载自http://blog.chinaunix.net/uid-26859697-id-5758036.html原创 2018-04-23 09:58:29 · 845 阅读 · 0 评论 -
进程内核栈、用户栈
1.进程的堆栈 内核在创建进程的时候,在创建task_struct的同事,会为进程创建相应的堆栈。每个进程会有两个栈,一个用户栈,存在于用户空间,一个内核栈,存在于内核空间。当进程在用户空间运行时,cpu堆栈指针寄存器里面的内容是用户堆栈地址,使用用户栈;当进程在内核空间时,cpu堆栈指针寄存器里面的内容是内核栈空间地址,使用内核栈。2.进程用户栈和内核栈的切换 当进程因为中...原创 2018-05-03 16:01:38 · 5226 阅读 · 1 评论 -
浅谈哈希表(HashTable)——拉链法、哈希桶、Probing探测方法
概述 散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。 给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数f...原创 2018-08-31 10:31:33 · 4154 阅读 · 2 评论 -
内核调试出现value optimized out的问题
最近在用gdb调试内核的过程中经常会有< value optimized out>的提示,首先分析该提示出现的原因,我的理解是可能这些被优化的变量已从内存中被移到了寄存器中,所以会找不到。为了能在调试过程中看到所有的变量,不知道能不把内核编译为-O0?若可以的话,又需要在什么地方来改呢?在所有的CONFIG中,我只发现了一个CONFIG_CC_OPTIMIZE_FOR_SI...原创 2018-08-27 10:04:59 · 5870 阅读 · 2 评论 -
vim 分屏显示
水平切割::split :split xxx(要打开的文件名) :new(在新窗口创建文件) <CTRL+W>+ k:跳转到上面的窗口 (若为大写K,则是把当前窗口调至上方) <CTRL+W>+ j:跳转到下面的窗口 (类似于上)垂直切割::vsplit :vsplit xxx(要打开的文件名) :vnew(在新窗口创建文件) :only 取...原创 2018-08-01 15:01:56 · 877 阅读 · 0 评论 -
Ubuntu vimrc配置文件存放位置
Ubuntu如何设置VI 下文对Ubuntu vimrc的设置适用于Ubuntu与Fedora系统,其他系统没有得到验证。 在Ubuntu中vim的配置文件存放在/etc/vim目录中,配置文件名为Ubuntu vimrcUbuntu vimrc已被广泛应用但是也在不断的更新,这里介绍Ubuntu vimrc安装设置使用,帮助大家安装更新Ubuntu vimrc系统。Ubuntu如何设置VI ...原创 2018-08-01 10:53:42 · 9738 阅读 · 0 评论