![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
linux内核
文章平均质量分 76
boring_111
这个作者很懒,什么都没留下…
展开
-
linux磁盘总结
linux读写磁盘,如果都是采用directIO的话,效率太低,所以我们在读写磁盘上加了一层缓存,page_cache。读的话,如果page_cache有的话,就不用向磁盘发出请求。写的话,也直接写入的page_cache就行了,异步刷回磁盘(操作系统不crash,不会丢失)。如果查看page_cache的大小:cat /proc/meminfo。原创 2024-01-11 12:03:58 · 1011 阅读 · 0 评论 -
linux内核分析:docker与隔离
在内核里面,对于任何一个进程 task_struct 来讲,里面都会有一个成员 struct nsproxy,用于保存 namespace 相关信息,里面有 struct uts_namespace、struct ipc_namespace、struct mnt_namespace、struct pid_namespace、struct net *net_ns 和 struct cgroup_namespace *cgroup_ns。如果你不相信任何一个云,怕被一个云绑定,怕一个云挂了自己的应用也就挂了。原创 2023-10-06 12:14:03 · 258 阅读 · 0 评论 -
linux内核分析:虚拟化
我知道我不是物理机内核,我知道我是虚拟机,我没那么高的权限,我很可能和很多虚拟机共享物理资源,所以我要学会排队,我写硬盘其实写的是一个物理机上的文件,那我的写文件的缓存方式是不是可以变一下。和用户态 qemu 对应的内核 KVM,对于虚拟机有一个结构 struct kvm 表示这个虚拟机,这个结构会指向一个数组的 struct kvm_memory_slot 表示这个虚拟机的多个内存条,kvm_memory_slot 中有起始页号,页面数目,表示这个虚拟机的物理内存空间。原创 2023-10-05 15:49:14 · 136 阅读 · 0 评论 -
linux内核分析:网络协议栈
接下来的调用链为:ip_route_output_ports->ip_route_output_flow->__ip_route_output_key->ip_route_output_key_hash->ip_route_output_key_hash_rcu。在 ip_rcv 中,得到 IP 头,然后又遇到了我们见过多次的 NF_HOOK,这次因为是接收网络包,第一个 hook 点是 NF_INET_PRE_ROUTING,也就是 iptables 的 PREROUTING 链。原创 2023-10-04 15:09:25 · 231 阅读 · 0 评论 -
守护进程解析
3、若父进程退出导致进程组成为孤儿进程组,且该进程组中有进程处于停止状态(收到SIGSTOP或SIGTSTP信号),该信号会被发送到该进程组中的每一个进程。1、终端关闭时,该信号被发送到session首进程以及作为job提交的进程(即用 & 符号提交的进程);2、session首进程退出时,该信号被发送到该session中的前台进程组中的每一个进程;,如果调用此函数的进程不是一个进程组的组长,则此函数创建一个新会话。会话:会话(session)是一个或多个进程组的集合,进程调用 setsid。原创 2023-10-02 17:22:04 · 123 阅读 · 0 评论 -
linux RCU文章汇总
浅析linux kernel RCU机制 - thinkycx.meLinux RCU机制深入理解 Linux 的 RCU 机制-腾讯云开发者社区-腾讯云原创 2023-09-28 16:46:48 · 35 阅读 · 0 评论 -
linux内核分析:进程通讯方式
我们知道,信号的到来时间是不可预期的,有可能程序正在调用某个漫长的系统调用的时候(你可以在一台 Linux 机器上运行 man 7 signal 命令,在这里找 Interruption of system calls and library functions by signal handlers 的部分,里面说得非常详细),这个时候一个信号来了,会中断这个系统调用,去执行信号处理函数,那执行完了以后呢?在 fifo_open 里面,创建 pipe_inode_info,这一点和匿名管道也是一样的。原创 2023-09-20 20:11:44 · 90 阅读 · 0 评论 -
Linux内核分析:输入输出,字符与块设备 31-35
所以,在 bdget 中,BDEV_I 就是通过 bdev 文件系统的 inode,获得整个 struct bdev_inode 结构的地址,然后取成员 bdev,得到 block_device。bd_part 指向的某个分区的 hd_struct,bd_contains 指向的是整个块设备的 block_device。上面的例子中,logibm_interrupt 这个中断处理函数,先是获取了 x 和 y 的移动坐标,以及左中右的按键,上报上去,然后返回 IRQ_HANDLED,这表示处理完毕。原创 2023-09-19 20:58:18 · 100 阅读 · 0 评论 -
linux内核分析:内存映射,文件系统
对于用户态的内存分配,或者直接调用 mmap 系统调用分配,或者调用 malloc。正常情况下,用户态的内存都是可以换出的,因而一旦发现内存中不存在,就会调用 do_page_fault。内核态中 vmalloc 分配的部分会被换出,因而当访问的时候,发现不在,就会调用 do_page_fault。对于内核态,kmalloc 在分配大内存的时候,以及 vmalloc 分配不连续物理页的时候,直接使用伙伴系统,分配后转换为虚拟地址,访问的时候需要通过内核页表进行映射。至此,内核态的内存映射也讲完了。原创 2023-09-18 10:16:52 · 90 阅读 · 0 评论 -
linux内核分析:线程和进程创建,内存管理
假设物理内存里面,896M 到 1.5G 之间已经被用户态进程占用了,并且映射关系放在了进程的页表中,内核 vmalloc 的时候,只能从分配物理内存 1.5G 开始,就需要使用这一段的虚拟地址进行映射,映射关系放在专门给内核自己用的页表里面。如果打开这个函数,看到的是对红黑树的查找,找到的是原堆顶所在的 vm_area_struct 的下一个 vm_area_struct,看当前的堆顶和下一个 vm_area_struct 之间还能不能分配一个完整的页。如果分成 4KB 一个页,那就是 1M 个页。原创 2023-09-17 12:52:26 · 373 阅读 · 0 评论 -
linux内核分析:进程与调度
这个时候,用户 A 再启动这个游戏的时候,创建的进程 uid 当然还是用户 A,但是 euid 和 fsuid 就不是用户 A 了,因为看到了 set-user-id 标识,就改为文件的所有者的 ID,也就是说,euid 和 fsuid 都改成用户 B 了,这样就能够将通关结果保存下来。在上面的例子中,A 切换到 B 的时候,运行到 __switch_to_asm 这一行的时候,是在 A 的内核栈上运行的,prev 是 A,next 是 B。如,用户 A 想玩一个游戏,这个游戏的程序是用户 B 安装的。原创 2023-09-16 13:26:58 · 162 阅读 · 0 评论 -
linux内核分析:探究x86
CPU工作模式:执行程序的三种模式 - 知乎一口气看完45个寄存器 ——x86/x64架构 - 知乎原创 2023-09-16 15:31:01 · 141 阅读 · 0 评论 -
linux内核分析:x86,BIOS到bootloader,内核初始化,syscall, 进程与线程
在代码里面的定义为 struct elf32_phdr 和 struct elf64_phdr,这里面除了有对于段的描述之外,最重要的是 p_vaddr,这个是这个段加载到内存的虚拟地址。在这之前,我们所有遇到过的程序都非常非常小,完全可以在实模式下运行,但是随着我们加载的东西越来越大,实模式这 1M 的地址空间实在放不下了,所以在真正的解压缩之前,lzma_decompress.img 做了一个重要的决定,就是调用 real_to_prot,切换到保护模式,这样就能在更大的寻址空间里面,加载更多的东西。原创 2023-09-15 16:29:45 · 157 阅读 · 0 评论 -
linux 堆探索
堆的虚拟地址是连续的,是brk来分配,brk是一个指针指向堆顶的指针,并且是可以复用的,但是只有在堆顶空闲128k时,才收缩,也就是说,为了减少page_fault,可重用,开销小的特点。但是会内存碎片,但是分配内存>128k时,就是mmap,可以unmmap立即释放虚拟内存。也不都是mmap来分配吧(原创 2023-09-10 16:52:08 · 73 阅读 · 0 评论