gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 17:55:40 25 4
gpt4 key购买 nike

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

/* 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。正如你所看到的,我必须在这里定义函数,原型(prototype)位于 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
.
.

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

enter image description here

我确定问题出在 sched_init() 函数中,但我找不到它。如果您能提供帮助,我将不胜感激,无论如何,谢谢您。

最佳答案

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

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

显然,如果你太早了,内核本身还没有启动,并且 printk 可能不可用,那么你将需要使用串行端口来调试 -

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

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

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

但是,虚拟内存处理不会立即启动,事实上,您可能会发现它直到调度之后并且“kswaapper”进程启动后才开始工作 - 这意味着您不能在调度程序 - 我不确定,因为这不是我很了解的 Linux 内核的一部分 - 但可能值得看看 kmalloc,它是一个较低级别的内核功能。请注意,它们并不是完全的替代品,因此您需要查看参数及其含义以及如何翻译。我认为我从未在内核中使用过 vmalloc() - 您确定这是正确的函数吗?

关于c - 在 sched.c 中初始化全局结构后,2.4.20 版本的新编译内核无法启动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14096055/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com