
linux kernel
oscube
这个作者很懒,什么都没留下…
展开
-
为什么不建议nfs客户端与nfs服务端部署在一台机器上
nfs客户端使用过程中会申请大量页缓存nfs服务端在申请内存时设置的标记不会触发页缓存的回收在某一时刻nfs服务端申请不到内存(内存被客户端占用)无法继续处理请求,nfs客户端的请求得不到响应,整个系统可能出现卡死的现象,比如df操作...原创 2020-12-29 22:01:21 · 583 阅读 · 0 评论 -
linux设备驱动八(分配内存)
kmalloc函数内幕特定:运行很快,但是可能被阻塞,不对分配的内存空间清零,分配区域在物理上是连续的flags参数GFP前缀的含义,最终会调用get_free_pages来实现GFP_KERNEL,调用它的函数正代表某个进程进行系统调用,GFP_KERNEL允许休眠来等待一个页面,所有调用的函数必须可重入的GFP_ATOMIC,调用函数是原子的,例如中断处理,使用内核预留的一些页面,可能失败,不会休眠GFP_USER,用于用户空间页面分配,可能会休眠GFP_HIGHUSER,类似GFP_US原创 2020-12-29 21:55:54 · 2199 阅读 · 0 评论 -
ceph内核rbd源码
rbd_sysfs_init 函数先调用device_register函数注册一个设备到内核中 在注册一个总线类型到内核中。do_rbd_add-->rbd_dev_device_setup-->rbd_init_diskrbd_init_disk中设置fops 为rbd_bd_ops原创 2020-10-21 19:48:46 · 349 阅读 · 0 评论 -
ceph内核模块编译
以linux-4.4.77为例(要求编译rbd.ko的内核源码与当前内核一致)cdlinux-4.4.77/net/ceph/makeCONFIG_CEPH_LIB=m-C/lib/modules/`uname-r`/buildM=`pwd`modulescplinux-4.4.77/net/ceph/Module.symverslinux-4.4.77/drivers/block/cddrivers/block/makeCONFIG_BLK_DEV_RBD=m-C/...原创 2020-10-21 19:47:20 · 410 阅读 · 0 评论 -
目录项高速缓存
缓存状态缓存管理原创 2020-10-21 19:36:55 · 647 阅读 · 0 评论 -
文件系统open操作流程
sys_open-->open_namei-->path_walk -->(vfs_create) -->(error = -EISDIR;if (S_ISDIR(inode->i_mode) && (flag & FMODE_WRITE))) -->...原创 2020-10-21 19:34:57 · 471 阅读 · 0 评论 -
inode缓存的生命周期
destroy_inode 释放inode内存对象put_inode 减少索引节点引用计数时调用drop_inodedelete_inode 删除索引节点在硬盘上的数据(包括修改所在块组的位图)clear_inode 重置inode内存对象中的数据,重置状态,解除和buffer_head的关联等等。iput-->put_inode -->(drop_inode 2.4内核没找到) -->delete_inode | clear_ino...原创 2020-10-21 19:27:18 · 601 阅读 · 0 评论 -
linux设备驱动七(时间、延迟及延缓操作)
知识点:如何度量时间差,如何比较时间 如何获得当前时间 如何将操作延迟指定一段时间 如何调度异步函数到指定时间之后执行度量时间差 HZ指一秒内产生的时钟中断次数,即时钟中断频率 jiffies_64记录自上一次操作系统引导以来的时钟滴答数。即使在32位架构上也是64位。 驱动程序通常访问jiffies变量。它是unsigned long类型,要么和jiffies_64相同,要么仅仅是jiffies_64的低32位.使用它的原因是访问快,而对6...原创 2020-08-03 08:02:05 · 2790 阅读 · 0 评论 -
ext2磁盘数据结构
只使用块组0中的超级块和组描述符,其他块组中的超级块和组描述符可以在块组0损坏时进行恢复。其他块组中的超级块和组描述符是否需要按一定策略和块组0中的进行同步。如果需要,什么时机?// 根据文件inode获取文件索引节点所在的块组编号block_group = (inode->i_ino - 1) / EXT2_INODES_PER_GROUP(inode->i_sb); if (block_group >= inode->i_sb->u.ext2_sb.s_g.原创 2020-07-23 23:16:26 · 248 阅读 · 0 评论 -
linux设备驱动六(高级字符驱动程序操作)
知识点:进程休眠及唤醒,如何实现非阻塞IO,设备可读取或写入时通知用户空间。用户态函数int ioctl(int fd, unsigned long cmd, …);驱动程序ioctl原型int (*ioctl)(struct inode inode, struct file filp, unsigned int cmd, unsigned long arg);如果调用程序没有传递第三个参数,那么驱动程序所接收的arg参数就处于未定义状态。ioctl命令编码分为多个位段type 魔数 Doc原创 2020-07-23 22:24:39 · 1712 阅读 · 0 评论 -
linux设备驱动五(并发和竞态)
并发及管理竞态的产生:用户空间多线程访问SMP在不同处理器上同时执行内核代码抢占,驱动程序可能在任何时候丢失对处理器的独占设备中断内核延迟机制热插拔设备可能会在正在使用时消失避免竞态,使用内核的并发控制原语竞态通胀作为对资源共享访问结果而产生。设计驱动程序第一个原则,只要可能就应该避免资源的共享,最明显的应用时避免使用全局变量。但在实际过程中,共享是难以避免的,共享就是现实的生活。资源共享的硬原则:在单个执行线程之外共享硬件或者软件资源的任何时候,因为另外一个线程可能产生对该资源的不原创 2020-07-08 21:50:44 · 1711 阅读 · 0 评论 -
linux设备驱动四(调试技术)
内核中的调试支持安装自己的内核,发行版内核会关闭映像性能的调试功能,kernel hacking的配置:CONFIG_DEBUG_KERNEL,总开关,使其他调试选项可用CONFIG_DEBUG_SLAB,可以检查许多内存溢出及忘记初始化的错误,分配给每个字节设置为0xa5,释放设置为0x6bCONFIG_DEBUG_PAGEALLOC,可以快速定位内存损坏的位置CONFIG_DEBUG_SPINLOCK,捕获未初始化,或者重复解锁的错误CONFIG_DEBUG_SPINLOCK_SLEEP,原创 2020-07-07 00:18:51 · 902 阅读 · 0 评论 -
linux设备驱动三(字符设备驱动)
主设备号和次设备号主设备号标示设备对应的驱动程序,次设备号用来确定设备文件指向的设备。现代linux允许多个驱动程序共享主设备号,但是大多数设备仍延用一个主设备号对应一个驱动程序设备号内部表达2.6版本中以后的主设备12,次设备20,兼容性的做法是使用宏,而不对设备号的组织进行任何假定MAJOR(dev_t dev) MINOR(dev_t dev) MKDEV(int major, int minor)分配和释放设备号如果count非常大,则所请求的范围可能和下一个主设备号重叠,但只要原创 2020-07-03 08:59:05 · 1765 阅读 · 0 评论 -
linux设备驱动二(建立和运行模块)
测试系统准备使用主流内核,供应商内核可能会修改内核API在系统中配置好内核树,2.6版本之前只需要头文件即可,hello world模块应该最少包含module_init module_exit和MODULE_LICENSE内核模块对比应用程序应用程序从头至尾顺序处理,内核模块是提供了一些事件处理函数的集合,事件发生时调用模块中的函数退出函数不同,应用程序退出后会释放资源,内核模块在module_exit必须清理所有资源,不然会保留到系统重启应用程序可以使用其他库中的函数,而模块只能使原创 2020-07-02 09:06:38 · 1804 阅读 · 0 评论 -
linux设备驱动一(设备驱动简介)
用户的活动通过一套标准化的调用来进行,这些调用与特别的驱动是独立的;设备驱动的角色就是将这些调用映射到作用于实际硬件的和设备相关的操作上机制与策略机制:提供什么功能,策略:如何使用这些功能。我的理解:机制应该是提供的最小的基础功能集合,策略是在机制之上的组合和扩展。编写内核代码来存取硬件,但是不能强加特别的策略给用户。驱动只保证硬件可用,把如何使用硬件交给应用程序。驱动是存在于应用程序和实际设备间的软件层。对策略透明的驱动一些典型的特征:支持同步和异步操作可以多次打开利用硬件全部能力没原创 2020-07-01 08:52:01 · 238 阅读 · 0 评论 -
kvm虚拟化原理
名词描述如果把操作系统共及其提供的系统调用作为资源,那么虚拟化就表现为操作系统虚拟化。linux容器虚拟化就是一个操作系统上,虚拟化出了多个同样的操作系统。如果把物理平台,包括CPU,内存,外设作为资源,那么对应的虚拟化技术就是平台虚拟化。VMM(virtual machine monitor) 虚拟机监视器,也叫hypervisor。虚拟机监视器运行的环境叫做host,而虚拟出来的虚拟机成为guest虚拟化重要一步,就是截取计算元件对物理资源的访问,并重定向到虚拟化资源池中。如果是使用纯软件的方式原创 2020-06-14 09:51:22 · 1442 阅读 · 0 评论 -
kvm虚拟化资料汇总
kvm虚拟机源码分析http://wenku.baidu.com/view/850929de7f1922791688e81f.htmlKVM 源码解读http://blog.chinaunix.net/uid-27062906-id-3407358.htmlQemu Detailed Studyhttp://lists.gnu.org/archive/html/qemu-devel/2011-04/pdfhC5rVdz7U8.pdfLinux KVM as a learning toolhtt原创 2020-06-14 09:51:09 · 275 阅读 · 0 评论 -
什么是边缘触发和水平触发
水平触发(level-triggered,也被称为条件触发)LT: 只要满足条件,就触发一个事件(只要有数据没有被获取,内核就不断通知你)边缘触发(edge-triggered)ET: 每当状态变化时,触发一个事件“举个读socket的例子,假定经过长时间的沉默后,现在来了100个字节,这时无论边缘触发和条件触发都会产生一个read ready notification通知应用程序可读。应用程序读了50个字节,然后重新调用api等待io事件。这时条件触发的api会因为还有50个字节可读从 而立即返回用户原创 2020-06-14 09:50:55 · 3446 阅读 · 0 评论 -
内核调试资料汇总
内核调试资料http://blog.youkuaiyun.com/su_ocean16/article/details/7843533http://www.longene.org/forum/viewtopic.php?p=11688http://hi.baidu.com/widebright/item/a08ce435ea5eb299b80c03achttp://hanez.org/howto-user-mode-linux.htmlhttp://blog.youkuaiyun.com/iamljj/article/d原创 2020-06-14 09:49:31 · 255 阅读 · 0 评论 -
一步一步编译安装内核
下载内核源码解压 tar -xvf linux-3.15.2.tar --directory=/usr/src/kernels(如果下载下来的是tar.xz文件,用xz -d linux-3.15.2.tar.xz解压出linux-3.15.2.tar)配置内核配置make menuconfig保存退出生产“.config”文件(在/usr/src/kernels下用make menuconfig,不必自己配置,用默认的就行,直接保存退出)编译内核 make bzI.原创 2020-06-14 09:50:39 · 256 阅读 · 0 评论 -
ubuntu升级内核步骤
uname -rcd /tmp/wget http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.1.6-unstable/linux-headers-4.1.6-040106_4.1.6-040106.201508170230_all.debwget http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.1.6-unstable/linux-headers-4.1.6-040106-generic_4.1.6-04原创 2020-06-13 23:09:35 · 485 阅读 · 0 评论 -
为什么磁盘裸容量不等于可用容量
为了方便用户或应用访问,磁盘在使用之前都会格式化为文件系统,例如:ext4、btrfs、xfs等等。每种文件系统会按照自己特有的方式来组织文件、管理磁盘空间的分配和回收以及保证原子性、这就需要元数据和日志,必然会导致一些额外的存储空间开销。所以每个磁盘的容量并不能完全被应用使用。在分布式存储容量估算的时候,这一点更加重要。每个文件系统都实现statvfs接口,来统计存储空间的使用情况。应用可以通过系统调用的方式来获取这一统计信息。下面是简单的代码样例:#include <stdio.h>原创 2020-06-13 22:19:26 · 1620 阅读 · 1 评论 -
linux为什么不允许创建文件夹的硬链接
使用方面考虑,会产生递归黑洞,举例:文件夹 a,b,在a下面创建b文件夹得硬链接c,在b下面创建a文件夹的硬链接d,ls a ,会看到c,ls c,看到b下的文件夹d,再ls d又看到c,这样可以无限ls下去软连接在访问时readlink有递归次数的限制,硬链接就是普通inode,所以没办法记录递归次数代码实现角度代码实现方面应该是可以做到的。首先pwd不是由文件系统拼接路径的,而是记录在一个全局变量中,所以cd 。。 的时候只是需要获得上一级目录inode的属性来检查权...原创 2020-06-13 21:02:50 · 836 阅读 · 0 评论 -
i_rdev i_bdev i_mapping 关系
i_bdev只有块设备文件系统的inode会设置该属性,对应的是块设备的数据结构i_rdev 通过mknod创建的inode都会指定设备号一个块设备可以通过mknod创建多个具有相同i_rdev的inode,那么在访问这些inode的时候,具体对应的块设备是i_bdev指定的,这和普通的文件系统是不一样的,普通文件系统只使用sb中记录的s_bdev。所有使用相同设备号创建的inode的i_...原创 2018-06-04 14:43:04 · 2601 阅读 · 0 评论 -
nfsclient 源码笔记
此处会设置xprt的锁标记-&gt;rpc_xdr_encode-&gt;xprt_transmit-&gt;xprt-&gt;ops-&gt;send_request ,此处可能会因为发送缓冲区满而无法继续发送,但是会记录已经发送的长度,不会全部从头开始-&gt;rpc_sleep_on 在call_transimit,将task在等待队列上,此处不是立即挂起,而是在call_transmi调结...原创 2018-06-04 14:40:24 · 5407 阅读 · 0 评论 -
bcache
参考https://blog.youkuaiyun.com/liumangxiong/article/details/18090043https://blog.youkuaiyun.com/liuaigui/article/details/54882935https://blog.youkuaiyun.com/column/details/flashcache.htmlhttps://blog.youkuaiyun.com/colu...原创 2018-06-08 10:42:41 · 3531 阅读 · 0 评论