标签: linux-kernel

Linux上的POSIX AIO和libaio之间的区别?

似乎明白了:

POSIX AIOAPI是原型<aio.h>并且您将程序与librt(-lrt)链接,而libaioAPI <libaio.h>和您的程序中的API 与libaio(-laio)链接.

我无法弄清楚:

1.内核是否以不同的方式处理这两种方法中的任何一种?

2. O_DIRECT使用其中任何一个标志是强制性的吗?

正如在这篇文章中提到,libaio 在没有O_DIRECT使用的情况下工作正常libaio.但是,理解但是:

根据R.Love的Linux系统编程书,Linux只支持常规文件上的aio(我假设它是POSIX AIO).只有在打开O_DIRECT的小程序(使用aio.h,与-lrt链接)调用aio_write时没有O_DIRECT标志打开的文件没有问题.

linux io asynchronous aio linux-kernel

50
推荐指数
1
解决办法
2万
查看次数

整个核心致力于单一流程

在Linux中是否有任何方法可以将一个CPU内核分配给特定的给定进程,并且不应该在此内核上安排任何其他进程或中断处理程序?

我已经阅读了Linux 绑定进程中使用taskset实用程序对CPU的进程关联,但这并没有解决我的问题,因为它只是试图将给定的进程关注到该核心,但是可能可以在此核心上安排其他进程,这是我想避免的.

我们应该更改内核代码以进行调度吗?

c linux cpu scheduling linux-kernel

49
推荐指数
4
解决办法
4万
查看次数

如何编写简单的Linux设备驱动程序?

我需要从头开始为omap4编写SPI Linux字符设备驱动程序.我知道编写设备驱动程序的一些基础知识.但是,我不知道如何从头开始编写平台特定的设备驱动程序.

我写了一些基本的char驱动程序,我认为编写SPI设备驱动程序与它类似.Char驱动程序具有file_operations包含驱动程序中实现的功能的结构.

struct file_operations Fops = {
    .read = device_read,
    .write = device_write,
    .ioctl = device_ioctl,
    .open = device_open,
    .release = device_release,  /* a.k.a. close */
};
Run Code Online (Sandbox Code Playgroud)

现在,我将通过spi-omap2-mcspi.c代码作为参考,以便从头开始开始开发SPI驱动程序.

但是,我没有看到打开,读取,写入等功能.不知道程序从哪里开始.

c linux linux-device-driver linux-kernel embedded-linux

49
推荐指数
4
解决办法
7万
查看次数

为什么在中断上下文中执行的内核代码/线程无法休眠?

我正在阅读Robert Love的以下文章

http://www.linuxjournal.com/article/6916

说的是

"...让我们讨论工作队列在进程上下文中运行的事实.这与其他下半部机制形成对比,后者都在中断上下文中运行.在中断上下文中运行的代码无法休眠或阻塞,因为中断上下文没有重新安排的后台进程.因此,由于中断处理程序与进程没有关联,调度程序没有任何东西可以进入休眠状态,更重要的是,调度程序无需唤醒..."

我不明白.AFAIK,内核中的调度程序是O(1),它是通过位图实现的.那么什么阻止了scehduler将中断上下文置于睡眠状态并采取下一个可调度进程并将其传递给控件?

linux-kernel

48
推荐指数
3
解决办法
3万
查看次数

linux内核如何管理不到1GB的物理内存?

我正在学习linux内核的内部结构,在阅读"理解Linux内核"时,有很多与内存相关的问题让我感到震惊.其中之一是,如果我的系统上安装了仅512 MB的物理内存,Linux内核如何处理内存映射.

正如我所读到的,内核将0(或16)MB-896MB物理RAM 映射到0xC0000000线性地址并可直接对其进行寻址.所以,在上面描述的情况下,我只有512 MB:

  • 内核如何从512 MB映射896 MB?在所描述的方案中,内核进行设置,以便每个进程的页表将虚拟地址从0xC0000000映射到0xFFFFFFFF(1GB),直接映射到0x00000000到0x3FFFFFFF(1GB)的物理地址.但是当我只有512 MB物理RAM时,如何将虚拟地址从0xC0000000-0xFFFFFFFF映射到物理0x00000000-0x3FFFFFFF?点是我的物理范围只有0x00000000-0x20000000.

  • 在这种情况下用户模式进程怎么样?

  • 每篇文章都只解释了这种情况,当你安装了4 GB内存并且内核将1 GB映射到内核空间时,用户进程使用剩余的RAM量.

我很感激任何帮助,以提高我的理解.

谢谢..!

kernel arm linux-device-driver linux-kernel embedded-linux

48
推荐指数
2
解决办法
1万
查看次数

如何重新编译单个内核模块?

通常内核源存储在/usr/src/linux-2.6.x/.如果我修改模块的源代码,为了避免重新编译整个内核,我该如何重新编译该模块?

linux makefile gnu-make kernel-module linux-kernel

48
推荐指数
4
解决办法
4万
查看次数

如何查看正在运行线程的CPU核心?

在Linux中,假设线程的pid是[pid],从目录/ proc/[pid]我们可以获得许多有用的信息.例如,这些proc文件,/ proc/[pid]/status,/ proc/[pid]/stat和/ proc/[pid]/schedstat都很有用.但是,如何获取运行线程的CPU核心编号?如果一个线程处于睡眠状态,我怎么知道它再次被调度后会运行哪个核心?

BTW,有没有办法为每个CPU核心转储运行和休眠任务的进程(线程)列表?

linux scheduling scheduler scheduled-tasks linux-kernel

47
推荐指数
6
解决办法
8万
查看次数

Mac OS X和BSD有多紧密相关?

我读到Mac OS X和bsd是相关的.他们有多紧密相关.可以在BSD上调整和安装Mac OS X软件吗?

unix macos operating-system kernel linux-kernel

46
推荐指数
4
解决办法
5万
查看次数

除了init之外,为什么Linux设备驱动程序中需要探测方法?

在linux内核中,probe()驱动程序提供的方法是做什么的?它与驱动程序的init功能有何不同,即为什么不能probe()在驱动程序的init功能中执行功能操作?

linux operating-system linux-kernel

46
推荐指数
3
解决办法
6万
查看次数

redis bgsave失败,因为fork无法分配内存

all:这是我的服务器内存信息'free -m'

              total       used       free     shared    buffers     cached
 Mem:         64433       49259      15174          0          3         31
 -/+ buffers/cache:      49224      15209
 Swap:         8197        184       8012
Run Code Online (Sandbox Code Playgroud)

我的redis-server使用了46G内存,剩下几乎15G的内存空闲

据我所知,fork是写入时的副本,当有15G可用内存时它不应该失败,这足以malloc必要的内核结构.

此外,当redis-server使用42G内存时,bgsave还可以,fork也可以.

是否有任何vm参数我可以调整以使fork返回成功?

谢谢.

fork linux-kernel redis

46
推荐指数
3
解决办法
2万
查看次数