Robert Love 在 quora 上关于 Linux Kernel 的问答摘录之三

(11)可以在一个程序中同时使用malloc()和brk()吗?这样做会有什么后果?

不安全,别这样做。因为malloc()内部可能会用到brk()或者sbrk(),混合调用会导致malloc()混乱。即便看上去是非常安全的改动,比如通过sbrk()改变数据段的大小,也不是100%安全的。

不要同时使用malloc()和brk()。


(12)当一个不可抢占的内核运行在内核态时,如何处理定时器中断?内核是会忽略这个中断还是在定时器中断完成后重新进入原先的进程?

只要你不是在一个所有中断都被禁用的临界区,当定时器中断到来时,定时器中断处理函数都会执行,不管当前系统是处于内核态还是用户态。

当中断返回后,内核把控制权交还给被打断的线程,这个线程可能是内核本身或者是某些进程。

不管内核是不是可以被抢占的,都不会改变上述过程。内核的可抢占性仅仅保证一个用户进程可以打断另一个用户进程,即便被打断的用户进程(通过系统调用)进入了内核态。


(13)Linux内核有防止mlock()的滥用吗?如果有,是怎么做到的呢?

如果允许不加节制的使用mlock(),用户可能会锁住非常多的物理内存,从而导致本地机器资源耗尽,拒绝服务。因此,Linux内核限制了非特权进程可以锁住的内存大小。这个限度叫RLIMIT_MEMLOCK,可以通过setrlimit()来设定。

在目前的Linux内核中,这个值默认为64K:

$ulimit -l

64

具有CAP_IPC_LOCK权限的的用户(比如说root)可以锁住不限数量的内存。这个特性是在2.6内核中新加入的,之前的内核要求具有CAP_IPC_LOCK权限,才能锁住RLIMIT_MEMLOCK大小的内存。2.6内核的改变允许非特权进程可以锁住一小块内存,比如64K大小,足够把一些敏感信息锁在内存当中。mlock()可以阻止内存被交换到磁盘的swap分区,否则攻击者在程序结束后可能从交换分区中恢复这些数据。


(14)用户态访问原始块设备的最佳途径是什么?

“最佳”途径是别从用户态直接访问,而是通过直接(direct)I/O。直接I/O可以像普通I/O一样访问常规文件,但是它绕过了VM和所有缓存,给了你直接访问文件系统的能力。连原始I/O的主要用户Oracle都开始转向使用直接I/O了。要想使用直接I/O,只需要在打开文件时指定O_DIRECT标志就可以了。当然,更好的访问方法还是使用普通I/O,毕竟内核给普通I/O提供了很多辅助,你大部分情况下没必要放弃这些。

如果你坚持使用原始I/O,那么你需要使用raw命令和/dev/raw:

raw /dev/raw/raw1 /dev/hdc

上述命令将块设备/dev/hdc映射到原始设备/dev/raw/raw1。这样就可以像访问其他文件一样访问这个原始设备,对硬盘进行直接的I/O操作。


(15)为什么Linux内核的中断处理函数不可睡眠?所有的OS内核都是这样的吗?

Linux中的中断处理函数不可睡眠是因为他们不支持线程化的执行,换句话说,它们是不可以被调度的实体。(现在Linux有了线程化的中断处理函数了,不过这是另外一回事了。)

大多数但不是所有操作系统都是这样。大部分操作系统将中断处理分为两块,一般称为上半部和下半部。上半部执行的非常快。当中断发生的时候,上半部会打断当前执行的一切程序去执行自己,但是上半部自身是没有线程的。结果就是上半部是不可睡眠的,因为在睡眠结束后没办法再把它调度回来。



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值