こんにちは、カーネル バージョン 2.4.20 から新しいカーネルをコンパイルしようとしています。さらに、構造の定義 (リンクされたリストとリスト構造で使用されるノードを定義するためのもの) と、新しいシステムコール ファイルで定義された 2 つの関数プロトタイプを含むヘッダー ファイルがあります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
2つの system_call ファイルによって呼び出され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
.
.
これは、カーネルが開始される前の私の現在の状況のスナップショットです
問題は機能にあると確信していますが、sched_init()
見つけることができません。とにかく助けてくれてありがとう。