标签: kernel

了解linux或BSD内核的最佳方法是什么?

我想更好地了解操作系统内部.流程管理,内存管理等等.
我想通过了解linux或BSD内核来学习.
哪一个内核更适合学习目的?
什么是最好的起点?
你能推荐一本好书吗?

linux bsd operating-system kernel osdev

21
推荐指数
5
解决办法
4931
查看次数

多核/多浦机器中的中断如何工作?

我最近开始深入研究低级OS编程.我(非常慢)目前正在编写两本较旧的书籍,XINU和构建自己的32位操作系统,以及我之前的问题,如何开始操作系统开发中的优秀SO人员建议的一些资源.

它可能只是我还没有在任何这些资源中遇到它,但可能是因为大多数这些资源是在无处不在的多核系统之前编写的,但我想知道的是中断如何在多核/多处理器系统中工作.

例如,假设DMA想要发出文件读取操作完成的信号.哪个处理器/内核确认发出中断信号?它是启动文件读取的处理器/核心吗?它是首先获得它的处理器/核心?

operating-system kernel multicore

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

当前的Linux内核调试技术

Linux机器在启动和运行软件(包括自定义驱动程序)几小时后冻结.我正在寻找一种方法来调试这样的问题.最近,Linux内核调试技术有了很大的进步,不是吗?

我恳请分享一些关于这个主题的经验.

linux debugging kernel core linux-kernel

21
推荐指数
2
解决办法
4069
查看次数

Linux内核/驱动程序开发新手

最近,我开始开发运行linux的嵌入式设备的驱动程序.

到目前为止,我只阅读了关于linux内部的内容.
没有先前的驾驶员开发经验,我发现我的第一步很难落地.

  • 我已经下载了内核源代码(v2.6.32).
  • 我读过(吝啬)Linux设备驱动程序(3e)
  • 我在StackOverflow上阅读了一些相关的帖子.
  • 我知道linux有一个"单片"的方法.
  • 我已经构建了内核(在menuconfig中包含现有的驱动程序等)
  • 我知道kconfig和makefile文件的基础知识,所以这不应该是一个问题.

有人可以描述
内核源代码中各种目录的结构(即链接间).

换句话说,给定一个源代码文件,
它将引用相关代码的其他文件

("#include"-s提供了部分想法)

有人可以帮助我获得一个更好的主意吗?
任何帮助将不胜感激

谢谢.

linux kernel linux-device-driver linux-kernel

21
推荐指数
2
解决办法
8768
查看次数

为支持向量机(XOR)设计内核

我的问题的核心是"如何为学习问题设计内核函数?"

作为一个快速的背景,我正在阅读关于支持向量机和内核机器的书籍,我看到作者给出了内核的例子(多项式内核均匀和非均匀,高斯内核,以及基于文本的内核的暗示等等)但是,所有这些都提供了结果的图片而没有指定内核,或者模糊地宣称"可以构造一个有效的内核".我对为新问题设计内核时的过程感兴趣.

可能最简单的例子是学习XOR,这是一个嵌入真实平面的最小(4点)非线性数据集.如何能够提出一个自然(和非平凡)内核来线性分离这些数据?

作为一个更复杂的例子(参见Cristianini,SVM简介,图6.2),如何设计内核来学习棋盘图案?Cristianini声称图片是"使用高斯内核"得出的,但似乎他使用了多个,并且它们以未指定的方式组合和修改.

如果这个问题太宽泛而无法在这里回答,我会理解一个这样的内核函数的构造,尽管我更喜欢这个例子有点简单.

kernel machine-learning svm

21
推荐指数
2
解决办法
8027
查看次数

Linux中进程的行走页表

我正在尝试浏览页面表以获取linux中的进程.在内核模块中,我实现了以下功能:

static struct page *walk_page_table(unsigned long addr)
{
    pgd_t *pgd;
    pte_t *ptep, pte;
    pud_t *pud;
    pmd_t *pmd;

    struct page *page = NULL;
    struct mm_struct *mm = current->mm;

    pgd = pgd_offset(mm, addr);
    if (pgd_none(*pgd) || pgd_bad(*pgd))
        goto out;
    printk(KERN_NOTICE "Valid pgd");

    pud = pud_offset(pgd, addr);
    if (pud_none(*pud) || pud_bad(*pud))
        goto out;
    printk(KERN_NOTICE "Valid pud");

    pmd = pmd_offset(pud, addr);
    if (pmd_none(*pmd) || pmd_bad(*pmd))
        goto out;
    printk(KERN_NOTICE "Valid pmd");

    ptep = pte_offset_map(pmd, addr);
    if (!ptep)
        goto out;
    pte = *ptep;

    page = pte_page(pte); …
Run Code Online (Sandbox Code Playgroud)

linux kernel linux-kernel

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

Linux中的实时调度

今天早上我读到了Linux实时调度.根据Robert Love的"Linux系统编程"一书,有两个主要的调度.一个是SCHED_FIFO,fifo,第二个是循环法SCHED_RR.我理解了fifo和rr算法是如何工作的.但是,由于我们有系统调用,

sched_setscheduler (pid_t pid, int policy, const struct sched_parem *sp)
Run Code Online (Sandbox Code Playgroud)

我们可以为我们的流程明确设置调度策略.所以在某些情况下,由root运行的两个进程可以有不同的调度策略.作为一个具有SCHED_FIFO和另一个具有SCHED_RR并具有相同优先级的进程.在那种情况下,将首先选择哪个流程?FIFO分类过程或RR分类过程?为什么?

考虑这种情况.有三个过程A,B,C.所有人都有同样的优先权.A和B是RR分类过程,C是FIFO分类过程.A和B是可运行的(因此两者都在一段时间内交替运行).目前A正在运行.现在C变得可运行了.在这种情况下,是否

1. A will preempt for C, or
2. A will run until its timeslice goes zero and let C run. Or
3. A will run until its timeslice goes zero and let B run.
   a) here after B runs till its timeslice becomes zero and let C run or
   b) after B runs till its timeslice becomes zero and let A run again (then C will starve …
Run Code Online (Sandbox Code Playgroud)

linux kernel scheduling fifo round-robin

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

了解file_operations的loff_t*offp

我正在设计一个只读取和写入字符缓冲区的设备驱动程序.然而,我的问题是file_operations结构read和结构中的两个功能write.我真的不明白究竟loff_t *offp是什么.我知道对于*offp文件偏移的读取和写入操作都意味着文件的当前读/写位置,但是我甚至不确定写入或读取设备文件意味着什么.

从我收集的内容来看,这就是我写作和从我的设备中读取的方式是我创建了一个代表我所称的设备的结构,my_char_struct如下所示.

struct my_char_structure{
    struct cdev my_cdev;
    struct semaphore sem;
    char *data;
    ssize_t data_size;
    unsigned int access_key;
    unsigned long size;
};
Run Code Online (Sandbox Code Playgroud)

这是一个静态结构,在我的驱动程序是insmod这样的时候初始化并指向它.

static dev_t dev_num;
static struct my_char_structure Dev;

int start_mod(void){
    //Because we are dealing with a fictitious device, I want
    //the driver to create my two devices with arbitrarily 
    //assigned major numbers.
    struct my_char_structure *my_dev = &Dev;
    int err;

    alloc_chrdev_region(&dev_num, FIRST_MINOR, COUNT, DEVICE_NAME);

    sema_init(&(my_dev->sem),1); …
Run Code Online (Sandbox Code Playgroud)

c linux kernel linux-device-driver linux-kernel

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

为什么这个0((类型*)0) - >成员在C?

container_of()Linux内核中的宏定义为:

#define container_of(ptr, type, member) ({ \
        const typeof( ((type*)0)->member) * __mptr =(ptr);\
        (type*)( (char*)__mptr - offsetof(type,member) );})
Run Code Online (Sandbox Code Playgroud)

为什么这样使用((type*)0)->member,不是(type*)->member吗?

c kernel

21
推荐指数
2
解决办法
3079
查看次数

perf:无法记录内核引用重定位符号

我编译perf了我的内核(3.11.10).在编译期间,一些库丢失了,所以我安装了这些库.

但是现在当我跑步时perf,我得到以下信息:

Couldn't record kernel reference relocation symbol
Symbol resolution may be skewed if relocation was used (e.g. kexec).
Check /proc/kallsyms permission or run as root.

Kernel address maps (/proc/{kallsyms,modules}) were restricted.
Check /proc/sys/kernel/kptr_restrict before running 'perf record'
If some relocation was applied (e.g. kexec) symbols may be misresolved.
Samples in kernel modules can't be resolved as well.
Run Code Online (Sandbox Code Playgroud)

由于我使用的是自定义构建内核,对我来说最明显的解释是,我的内核缺少某些选项.如果是这样,我怎样才能找出遗漏的内容?

我不确定到底perf在抱怨什么.我怎样才能解决这个问题?

编辑:

/proc/kallsyms不存在并/proc/sys/kernel/kptr_restrict包含0:

$ cat /proc/sys/kernel/kptr_restrict
0
Run Code Online (Sandbox Code Playgroud)

我自己编译了内核,它可能缺少一些选项.这是什么/proc/kallsyms?如何在我的内核中启用它?

kernel perf

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