0

您好,我正在尝试从内核版本 2.4.20 编译我的新内核。此外,我有一个头文件,其中包括结构的定义(一个用于定义链表和列表结构使用的节点)和两个在我的新系统调用文件中定义的函数原型sample.c。但是,当我在全局范围内定义一个列表并尝试sched.c在函数中进行分配时,sched_init()我的新内核版本没有打开。它在开始之前就卡住了。在这里你可以看到我的头文件和系统调用文件。

/* project_header.h */

#ifndef __LINUX_PROJECT_HEADER_H

#define __LINUX_PROJECT_HEADER_H

#include <linux/linkage.h>
#include <linux/vmalloc.h>

#endif

typedef struct node{

        struct node* next;
    struct node* prev;
        long project_pid;
    long project_ticket_number;

}PROJECT_NODE;

typedef struct{

        PROJECT_NODE* head;
        PROJECT_NODE* tail;
        int list_size;

}PROJECT_LIST;

PROJECT_LIST* project_init_list(void);
void project_add_node(PROJECT_LIST*, long);

这是我实现的系统调用sample。如您所见,我必须在这里定义函数,原型在project_header.h其中,由两个 system_call 文件调用,它们是fork.csched.c

/* sample.c */

#include <linux/sample.h>
#include <linux/project_header.h>

long int maximum_ticket_number=0;
extern PROJECT_LIST* project_list;

PROJECT_LIST* project_init_list(void){

    PROJECT_LIST* list = vmalloc(sizeof(*list));

        list->list_size=0;
        list->head = NULL;
        list->tail = NULL;

    return list;
}

void project_add_node(PROJECT_LIST* list, long id){

     PROJECT_NODE* pnew;

     pnew = vmalloc(sizeof(*pnew));

     pnew->project_pid=id;

    maximum_ticket_number++;
    pnew->project_ticket_number=maximum_ticket_number;

    if(list->list_size==0){ // Assume list is empty

                   list->head = pnew;
                   list->tail = pnew;

                   list->list_size++;
    }
    else {

         list->tail->next = pnew;
         pnew->prev = list->tail;
         list->tail = pnew;

         list->list_size++;
         }

}

asmlinkage void sys_sample(void){ //System call does print the inital list size

        printk("LIST->SIZE = %d\n", project_list->list_size);

    return;
}

这是添加到的部分sched.c

/* sched.c */
.
.

#include <linux/project_header.h>
#include <linux/sample.h>

PROJECT_LIST* project_list; // Create a list globally

extern PROJECT_LIST* project_init_list(void); // Provide to call project_init_list function which returns a list properly

.
.

void __init sched_init(void){

.
.
project_list = vmalloc(sizeof(*project_list)); //Allocate space and initialize the variables of main list
.
.

这是内核启动之前我当前情况的快照

在此处输入图像描述

我确定问题出在sched_init()功能上,但我找不到。如果您能提供帮助和感谢,我将不胜感激。

4

1 回答 1

0

这不是一个真正的答案,因为这不是一个可以用给出的信息回答的问题。但它是“关于如何找出内核不启动原因的指导,以及关于内核如何启动的一些指导”。

printk() 是内核外 printf() 对应的内核函数。在你认为你要到达的地方添加它,以及你认为它可能失败的地方,例如,如果你有“myptr = vmalloc(...);”,那么

显然,如果您太早以至于内核还没有启动并且 printk 可能不可用,那么您将需要使用 out 的串行端口将是调试的方式 -

  mov $0x3fc, dx
  mov $65, al
  out al, dx

将打印一个“A”(ascii 代码 65)到串行端口。不要一次敲出超过 16 个字符,它们只会以 9600 bps 或类似的速度输出。

顺便说一句,内核中唯一不处于保护模式的部分是几十条左右的指令。

但是,虚拟内存处理不会立即开始,事实上,您可能会发现它直到 AFTER THE SCHEDULING 并且“kswapper”进程开始后才起作用 - 这意味着您不能在调度程序中使用 vmalloc -我不确定,因为这不是我熟悉的 Linux 内核的一部分——但可能值得看一下 kmalloc,它是一个较低级别的内核功能。请注意,它们不是精确的替代品,因此您需要查看参数及其含义以及如何翻译。我不认为我曾经在内核中使用过 vmalloc() - 你确定这是正确的函数吗?

于 2012-12-31T08:03:22.807 回答