2.4.20版本的新编译内核在sched.c中初始化全局结构后无法启动

时间:2012-12-31 00:10:20

标签: c memory-management linux-kernel kernel scheduler

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

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中,由两个system_call文件调用project_header.hfork.c

sched.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

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

enter image description here

我确定问题出在/* 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 . . 函数中,但我无法找到它。如果你能提供帮助和感谢,我将非常感激。

1 个答案:

答案 0 :(得分:0)

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

printk()是内核之外的printf()的相应内核函数。在您认为可以到达的点以及您认为可能发生故障的位置添加该值,例如:如果你有“myptr = vmalloc(...);”,那么

显然,如果你这么早,内核本身没有启动并且printk可能无法使用,那么你将需要使用out to串口来调试 -

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

将打印'A'(ascii代码65)到串行端口。不要同时敲击超过16个字符,它们只会以9600 bps或其他一些字符出现。

顺便说一句,你不在保护模式的内核的唯一部分是几十个指令左右。

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