嗨,我正在尝试从内核版本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.h
和fork.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
这是我在内核启动之前的当前情况的快照
我确定问题出在/* 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
.
.
函数中,但我无法找到它。如果你能提供帮助和感谢,我将非常感激。
答案 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() - 你确定使用的是正确的函数吗?