12 土豆西瓜大芝麻

尚未进行身份认证

我要认证

暂无相关简介

等级
TA的排名 1w+

linux文件读写过程--各种层级结构

在《linux内核虚拟文件系统浅析》这篇文章中,我们看到文件是如何被打开、文件的读写是如何被触发的。对一个已打开的文件fd进行read/write系统调用时,内核中该文件所对应的file结构的f_op->read/f_op->write被调用。本文将顺着这条路走下去,大致看看普通磁盘文件的读写是怎样实现的。linux内核响应一个块设备文件读写的层次结构如图(摘自ULK3):1、VFS,虚拟文件系统。之前我们已经看到f_op->read/f_op->write如何被调用,这就

2020-06-02 16:17:48

linux内核中的address_space 结构解析

在阅读Linux2.6的内核内存管理这一部分时,我看到page结构中的一个mapping成员,我感到很迷惑,这个成员的属性太复杂了,我们来看看:struct address_space *mapping;表示该页所在地址空间描述结构指针,用于内容为文件的页帧(1)如果page->mapping等于0,说明该页属于交换告诉缓存swap cache(2)如果page->mapping不等于0,但第0位为0,说明该页为匿名也,此时mapping指向一个struc...

2020-06-02 15:13:01

iov_iter结构体

《存储技术原理分析》上讲到了结构体iovec的由来,概括起来就是我们通常用的系统调用read/write用于读取或写入文件,比如read用于读取数据到一个用户态缓冲区,readv读取数据到多个用户态缓冲区,那么为了兼容这两种syscall,引入了数据结构iovec,而iov_iter又是对iovec的迭代。故使用iov_iter结构体的本质是用于协助处理用户态缓冲区数据和页缓存之间的映射关系。以下内容是翻译过来的,原文内容链接:https://lwn.net/Articles/625077/1.

2020-06-01 16:23:58

为啥C语言中的void *被称作万能指针

在进行c语言开发过程中,有时候会遇到void *这种数据类型。比如:void * memcpy(void * dest, const void * src, size_t n);void * memmove(void * dest, const void * src, size_t n);对于指针类型来说,不管是int *,char * 还是void*,亦或是struct stru*,这种类型都是值一个地址,在32位环境下,都是一个32位的无符号整形数值,表示一个地址。既然都是一个地址,为啥还

2020-05-29 16:41:48

numpy中sum函数求和时参数axis=0和axis=1的含义

简单来说,对于一个m*n的矩阵,如果sum()的参数中没有指定axis,就是将所有的数值加到一起,得到1*1的标量。如果是axis=0,就是按照列进行加,得到一个1*n的行向量;如果axis=1,表示矩阵每一个行相加,得到一个m*1的列向量。例如:import numpy as npnp.sum([[0,1,2],[2,1,3],axis=1)结果就是:array([3,6])a = np.array([[0, 2, 1]])print a.sum()print a.sum(axi

2020-05-27 11:29:54

linux 内核时间打印

struct timespec ts;ts = current_kernel_time();printk(KERN_ALERT "i=%d, channel=%d, %ld %ld\n", i, channel, ts.tv_sec, ts.tv_nsec); struct timeval tv;/*获取时间*/do_gettimeofday(&tv);printk(KERN_ALERT "now: %ld %ld\n", tv.tv_sec, tv.tv_usec); /*设置.

2020-05-22 14:35:11

linux内核模块call trace格式解析

今天测试编写的内核模块进行文件读写,结果失败。通过dmesg查看内核输出,结果如下:[37725.645804] I am here! and the user buf size is 1024[37725.645812] The last data record position: 4096 current postion:0[37725.645818] buff size 8[37725.647660] BUG: unable to handle kernel

2020-05-20 14:06:36

linux下写C程序编译出现 function declaration isnot a prototype问题和for loop initial declarations 的解决方案

今天在编译自己写的linux 内核模块的时候,报错如标题所示,指向我在episode.h文件中声明的函数extern int getCurrentTime();查过资料后发现,对于没有参数的函数,需要在函数的声明的时候,在参数列表里加上一个void,而在函数实现的地方却不需要。于是,改成extern int getCurrentTime(void);就可以编译通过啦。另一个错误是关于for语句的,也就是我们经常在for循环后面的控制条件里写的临时变量的定义的问题'for' loop initia

2020-05-19 14:52:42

vs code中项目的基本配置--include路径、运行参数、debug配置

1.安装C/C++ for Visual Studio Code点击左边扩展栏图标—>搜索C/C++ -> 安装->Reload:安装完成之后,打开你的包含c++的文件夹,将会生成一个.vscode文件夹,所有的配置将在这个文件夹中进行配置。2.配置IntelliSense扩展程序会根据当前系统环境配置基本信息,因此有可能配置不完整,这时需要通过生成c_cpp_properties.json文件来配置缺少的信息:ctrl+shift+P打开Command Palette

2020-05-18 09:44:03

红黑树的插入操作过程详细图解

说在前面对于文章中提到的左旋右旋等旋转详细过程请参考我的上一篇博客平衡二叉树插入操作的详细过程中的解决失衡的口诀方法,其中有旋转的详细图解过程红黑树 定义与性质 红黑树是一种含有红黑结点并能自平衡的二叉查找树 任意结点都有颜色,红色或者黑色 红黑树中根节点一定是黑色的 红黑树中的 null 位置看作是黑色 红黑树中红色不能与红色相邻 从根到所有 null 的路径上黑色结点的个数相同 红黑树中,最长的路径的长度,不会超过最短的路径的长度的2倍 时间复杂度:Olog

2020-05-09 15:30:04

HashMap中 get 和 put 操作的具体过程

说在前面本文包含手写泛型HashMap<K,V>为简化版,仅为理解 HashMap 的 get() 和put() 方法的工作过程,非Java源码。get(K key) 原理先计算出key对应的hash值 int hash = key.hashCode();//此处的 hashCode() 方法为 Object对象 所属方法,默认都有//自定义的类需要覆写该方法 对超出数组范围的hash值进行处理 hash = (hash >>> 16)^hash;

2020-05-09 15:16:42

平衡二叉树插入操作的详细过程图解

二叉搜索树/二叉排序树/二叉查找树是二叉树、任意结点的左子树的值均小于根节点的值,右子树均大于根节点的值 没有键值相等 平衡二叉树(AVL树) 定义 左右字数的高度差的绝对值不超过1,并且两子树都是平衡二叉树 没有键值相等 高度差,又名平衡因子,范围为[-1,0,1],在此规定==平衡因子 bf = 右子树的高度-左子树的高度== 插入操作 当有新的结点...

2020-05-08 08:22:53

linux内存管理之PAE(物理地址扩展)解决内存大于4G的问题

Intel处理器从80386到Pentium使用32位物理地址,理论上,这样可以访问4GB的RAM。然而,大型服务器需要大于4GB的RAM来同时运行数以千计的进程,所以必须扩展32位80x86所支持的RAM容量。(这里是不是了解了为啥叫x86啊,这个x代表1个数字,最小为3,表示早期的386系列CPU以及之后的系列,只不过最新的系列不再按照x86命名了) Intel通过在它...

2020-04-29 11:03:52

linux分段内存管理中的GDT,LDT,GDTR,LDTR

本文是对上一篇文章《逻辑地址、线性地址、物理地址的关系以及段寄存器在不同位数CPU中的用途演变以及GDT LDT PGD PT的关系》的补充。一. 寻址方式:实地址模式和保护地址模式我们知道,内存寻址模式在早期是采用的实地址模式(intel 80286之前),后面发展到了保护模式(80286开始)。在8086的时候,也就是16位cpu的时候,CPU配备了4个16位段寄存器(CS代码段寄存器...

2020-04-29 10:04:25

逻辑地址、线性地址、物理地址的关系以及段寄存器在不同位数CPU中的用途演变以及GDT LDT PGD PT的关系

历史 许多年以前,当人们还在使用DOS或是更古老的操作系统的时候,计算机的内存还非常小,一般都是以K为单位进行计算,相应的,当时的程序规模也不大,所以内存容量虽然小,但还是可以容纳当时的程序。但随着图形界面的兴起还有用户需求的不断增大,应用程序的规模也随之膨胀起来,终于一个难题出现在程序员的面前,那就是应用程序太大以至于内存容纳不下该程序,通常解决的办法是把程序分割成许多称为覆...

2020-04-28 15:47:09

使用dd命令读取linux文件系统指定block的数据

1.通过debugfs查看指定文件的块号①df -h 查看文件系统列表,找到对应的设备;或者在要查看的文件目录执行df ./②debugfs 文件系统通过 blocks 文件路径 看文件的块号。一个文件占据的块号并不一定连续。2. dd命令读指定块号的内容dd if=文件系统路径 of=输出路径 bs=4096 count=1 skip=块号例如:dd if...

2020-04-27 11:26:31

如何查看linux上一个文件系统的超级块superblock的信息

#命令行的方式:先用df命令查看一下各个分区的挂载找到是linux的ext*文件系统后,找到设备名(如/dev/*)注意如果不是linux文件系统,使用dumpe2fs命令会报错使用sudo dumpe2fs /dev/*即可查看到superblock内容展示(可能会非常长哦)dumpe2fs 1.42.13 (17-May-2015)Filesystem volume nam...

2020-04-27 11:16:36

linux access_ok 用户指针检查确保系统调用传给kernel的指针是用户空间而非内核空间的地址

copy_from_user 与 copy_to_user 函数在使用使用user space指针的时候都会用access_ok 函数检查检查的内容:#define access_ok(type, addr, size) (__range_ok(addr, size) == 0)#define __range_ok(addr, size) ({ \ unsigned lo...

2020-04-27 09:05:03

linux中与文件相关的一些常量--文件类型

st_mode以及inode中的i_mode是用特征位来表示文件类型的,特征位的定义如下(8进制):S_IFMT 0170000 文件类型的位遮罩,也就是mask共18位,换成2进制00 1111 0000 0000 0000,S_IFSOCK 0140000 socketS_IFLNK 0120000 符号链接(symbolic link)S_IFREG...

2020-04-26 16:17:51

linux的mount结构与原理

这是一个关于 mount(挂载)的故事。在 Kernel 世界里,挂载是一项很了不起的特性,它可以将不同类型的文件系统组合成一个有机的整体,从使用者角度来看不同的文件系统并没有什么区别,那么 Kernel 是怎么做到呢?首先,Kernel 会为每个文件系统准备一个 mount 结构,然后再把这个结构加入到 vfs 这颗大树上就好了。这么一个小小的 mount 结构就这么神奇?请看...

2020-04-22 15:48:51

查看更多

勋章 我的勋章
  • 签到新秀
    签到新秀
    累计签到获取,不积跬步,无以至千里,继续坚持!
  • 新人勋章
    新人勋章
    用户发布第一条blink获赞超过3个即可获得
  • 阅读者勋章Lv1
    阅读者勋章Lv1
    授予在CSDN APP累计阅读博文达到3天的你,是你的坚持与努力,使你超越了昨天的自己。
  • 持之以恒
    持之以恒
    授予每个自然月内发布4篇或4篇以上原创或翻译IT博文的用户。不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
  • 1024勋章
    1024勋章
    #1024程序员节#活动勋章,当日发布原创博客即可获得
  • 勤写标兵Lv4
    勤写标兵Lv4
    授予每个自然周发布9篇以上(包括9篇)原创IT博文的用户。本勋章将于次周周三上午根据用户上周的博文发布情况由系统自动颁发。