test2

  1. Linux中的用户模式和内核模式是什么含意?

MS-DOS等操作系统在单一的CPU模式下运行,但是一些类Unix的操作系统则使用了双模式,可以有效地实现时间共享。在Linux机器上,CPU要么处于受信任的内核模式,要么处于受限制的用户模式。除了内核本身处于内核模式以外,所有的用户进程都运行在用户模式之中。

内核模式的代码可以无限制地访问所有处理器指令集以及全部内存和I/O空间。如果用户模式的进程要享有此特权,它必须通过系统调用向设备驱动程序或其他内核模式的代码发出请求。另外,用户模式的代码允许发生缺页,而内核模式的代码则不允许。

在2.4和更早的内核中,仅仅用户模式的进程可以被上下文切换出局,由其他进程抢占。除非发生以下两种情况,否则内核模式代码可以一直独占CPU:

(1) 它自愿放弃CPU;

(2) 发生中断或异常。

2.6内核引入了内核抢占,大多数内核模式的代码也可以被抢占。

3.大块内存
vmalloc 虚拟连续,物理不连续
kmalloc 不 32*pagesize-16基于slab实现。

  1. 用户进程间通信主要哪几种方式?

1)管道Pipe):管道可用于具有亲缘关系进程间的通信,允许一个进程和另一个与它有共同祖先的进程之间进行通信。

2)命名管道named pipe):命名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信。命名管道在文件系统中有对应的文件名。命名管道通过命令mkfifo或系统调用mkfifo来创建。

3)信号Signal):信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身;linux除了支持Unix早期信号语义函数sigal外,还支持语义符合Posix.1标准的信号函数sigaction实际上,该函数是基于BSD的,BSD为了实现可靠信号机制,又能够统一对外接口,用sigaction函数重新实现了signal函数)。

4)消息Message)队列:消息队列是消息的链接表,包括Posix消息队列system V消息队列。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺

5)共享内存:使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。是针对其他通信机制运行效率较低而设计的。往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。

6)信号量semaphore):主要作为进程间以及同一进程不同线程之间的同步手段。

  1. 伙伴系统算法:按1 ,2,4 —- 1024页框分配
    找相近的找
    alloc_page()
    get_free_page()

slab分配器分配内存(经常申请小内存用)
1.kmem_cache_create 初始分配 1<<5*4K = 128K
kmem_cache_alloc 在分配中申请

大于128分出错

Linux内核中采 用了一种同时适用于32位和64位系统的内 存分页模型,对于32位系统来说,两级页表足够用了,而在x86_64系 统中,用到了四级页表。

  • 页全局目录(Page Global Directory)

  • 页上级目录(Page Upper Directory)

  • 页中间目录(Page Middle Directory)

  • 页表(Page Table)

页全局目录包含若干页上级目录的地址,页上级目录又依次包含若干页中间目录的地址,而页中间目录又包含若干页表的地址,每一个页表项指 向一个页框。Linux中采用4KB大小的 页框作为标准的内存分配单元。

多级分页目录结构
1.2.slab分配器
常用的申请和释放,都在slab已申请的,不回到伙伴系统中

.__get_free_pages
kmem_cache_alloc
void *kmalloc(size_t size, gfp_t flags)
void *vmalloc(unsigned long size)
dma_alloc_coherent

void * ioremap (unsigned long offset, unsigned long size)

ioremap是一种更直接的内存“分配”方式,使用时直接指定物理起始地址和需要分配内存的大小,然后将该段 物理地址映射到内核地址空间。ioremap用到的物理地址空间都是事先确定的,和上面的几种内存 分配方式并不太一样,并不是分配一段新的物理内存。ioremap多用于设备驱动,可以让CPU直接访问外部设备的IO空间。ioremap能映射的内存由原有的物理内存空间决定,所以没有进行测试。

配原理最大内存其他

__get_free_pages直接对页框进行操作4MB适用于分配较大量的连续物理内存

kmem_cache_alloc基于slab机制实现128KB适合需要频繁申请释放相同大小内存块时使用

kmalloc基于kmem_cache_alloc实现128KB最常见的分配方式,需要小于页框大小的内存时可以使用

vmalloc建立非连续物理内存到虚拟地址的映射物理不连续,适合需要大内存,但是对地址连续性没有要求的场合

dma_alloc_coherent基于__alloc_pages实现4MB适用于DMA操 作

ioremap实现已知物理地址到虚拟地址的映射适用于物理地址已知的场合,如设备驱动

alloc_bootmem在启动kernel时,预留一段内存,内核看不见小于物理内存大小,内存管理要求较高


linux 虚拟文件系统vfs

1.数据结构
struct super_block
struct inode
struct file
struct file_operation

linux

执行,目录,普通,链接,设备,管道

创建进程系统调用
clone 可以同vfork,生成线程。也可以生成兄弟进程
fork 不同的物理空间

vfork 同父进程的物理空间

scedule 进程调度,上下文切换
do_fork()
do_timer()
wake_up_process()
setsceduler
sys_scedule_yield()


scedules 动态优先级,防止低优先级饿死


struct runqueue

insmod rmmod


TLB 页表缓存,存与cpu中,虚-》实转换


字符,块设备,mknod建设备文件


struct cdev
cdev_alloc
cdev_add
sctruct kobject


open,close.write ,ioctrl,release,llseek

dev 分主次 32bit 前12bit 主 20bit 次

系统调用,int产生软中断,产生异常跳到内核指定地点执行。


软中断不睡眠,不阻塞
工作队列睡眠,阻塞。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值