Linux kernel

文件系统

  1. 文件
  2. 目录
  3. 链接
  4. 块设备
  5. 字符设备
  6. 管道
  7. 套接字

文件

inode惟一索引

文件属性

1
2
3
4
5
6
7
8
9
[Fri Nov 01 talen@tp hexo.blog]$ stat yarn.lock
File: yarn.lock
Size: 97141 Blocks: 192 IO Block: 4096 regular file
Device: 803h/2051d Inode: 42116468 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 1000/ talen) Gid: ( 985/ users)
Access: 2019-09-16 17:39:57.848034466 +0800
Modify: 2019-07-24 20:51:25.073555443 +0800
Change: 2019-07-24 20:51:25.073555443 +0800
Birth: 2019-07-24 20:51:25.073555443 +0800

文件权限

用户类型
  1. owner
  2. group
  3. other
权限
  1. 读r
  2. 写w
  3. 执行x
  4. suid : 进程执行时获取文件拥有者uid的权限
  5. sgid: 进行执行时获取文件拥有者用户组gid的权限
  6. sticky: 向kernel发送一个请求,进程结束后保留在内存中.

文件内核系统调用

创建一个文件对象,包含文件指针(使用lseek()改变文件指针位置)

  1. 打开
    1. fd = open(path, flag, mode) # 参数分别对应 路径,操作,权限
  2. 创建
  3. 访问
    1. 顺序
      1. 设备文件
      2. 管道
    2. 随机
      1. 普通文件
    3. read() and write()
      1. nread = read(fd, buf, count)
      2. nwrite = write(fd, buf, count)
    4. close
      1. res = close(fd)
  4. 文件指针
    1. newoffset=lseek(fd, offset, whence)
  5. 删除,生命名文件不需要打开
    1. res = rename(oldpath, newpath)
    2. res = unlink(pathname)

文件描述符FD

是进程->文件描述符FD->文件对象

  1. 同一进程可有多个FD
  2. 多个进程可以同时操作一个文件,系统不提供同步

进程

内核模式

单处理器,同一时间只有一个进程在运行,用户态的进程调用系统调用后切换到内核态

  1. 用户态
    1. |用户态进程调用系统调用切换到内核态
    2. 进程CPU发出异常信号,内核代表产生异常的进程处理异常
    3. 外围设备发出中断请求
    4. 内核进程被执行
  2. 内核态

进程实现

进程描述符

进程暂停时,几个相关的处理器寄存器保存在进程描述符中

进程间通信

system V ipc

  1. 信号量
  2. 消息队列 POSIX消息队列
  3. 共享内存

进程管理

  1. fork() 父创建新进程
    1. wait4()等待子进程退出,返回子进程pid
    2. init特殊进程管理所有子进程
  2. _exit() 退出进程
  3. exec() 装入一个新程序

mmap

允许存放在块设备上的文件或信息的一部分映射到进程的部分地址空间.

可用于进程间共享数据

内存管理

虚拟内存

硬件->虚拟内存->进程

随机访问存储器RAM

内核映像+虚拟内存

平衡每个内存请求,并在达到阀值时调用页框回收(page frame reclaiming)算法释放其它内存

  1. 内核映像:
    1. 内核代码
    2. 内核静态数据结构
  2. 虚拟内存:
    1. 内核缓冲区,描述符,动态数据结构
    2. 进程内存请求
    3. 高速缓存

内核内存分配器KMA

虚拟内存系统一个主要问题是内存碎片

  1. 利用率高,浪费少,碎片少
  2. 与其它内存管理子系统配合

linux在众多算法中选择了solaris的slab分配算法

进程的虚拟地址空间处理

内核使用一组内存区描述符描述虚拟地址空间.进程通过exec()系统调用开始执行.

描述符区:

  1. 代码区
  2. 初始化数据
  3. 未初始化数据
  4. 程序栈
  5. 共享库代码及数据
  6. 堆(动态内存)

请求调页,写时复制

高速缓存 sync()将脏数据写回磁盘

驱动

kernel->驱动->I/O设备

坚持原创技术分享,您的支持将鼓励我继续创作!