我无法在任何地方找到这些信息.无论我到哪里,我都会发现,一旦你点击"主"(无论你的入口点是什么),这将是程序参数和环境,看起来堆栈的外观,但我正在寻找的是系统如何设置堆栈与switch_to宏配合.第一次切换到任务时,需要有EFLAGS,EBP,GCC保存的寄存器,以及来自"tsk-> thread-> esp"指向的堆栈上schedule()函数的返回地址,但是我无法弄清楚内核是如何设置这个堆栈的,因为它允许GCC保存通用寄存器(使用内联汇编的输出参数).
我指的是x86个人电脑.我正在为我自己的(尝试)编写的小内核研究Linux调度程序/进程系统,而我无法理解我所缺少的内容.我知道我遗漏了一些东西,因为Slackware在我的计算机上运行这一事实证明了调度程序的工作原理:P
编辑:我似乎措辞严厉.我正在寻找有关如何设置任务内核堆栈而不是如何设置任务用户任务的信息.更具体地说,tsk-> thread-> esp指向的堆栈,以及"switch_to"切换到的堆栈.
我去编译我的一个项目,它使用SDL,SDL_ttf,OpenAL和GTK.所有这些都输出如下错误:
TxtFunc.cpp:(.text+0x61): undefined reference to `TTF_OpenFont'
TxtFunc.cpp:(.text+0x8c): undefined reference to `TTF_RenderText_Solid'
TxtFunc.cpp:(.text+0xf6): undefined reference to `SDL_UpperBlit'
TxtFunc.cpp:(.text+0x108): undefined reference to `TTF_CloseFont'
TxtFunc.cpp:(.text+0x114): undefined reference to `SDL_FreeSurface'
Run Code Online (Sandbox Code Playgroud)
为每个图书馆电话.我正在使用以下链接选项进行编译:
sdl-config --libs pkg-config gtk+-2.0 --libs pkg-config openal --libs -lalut -lSDL_ttf
我安装了所有这些软件包,并且没有"找不到文件"错误.只是很多未定义的引用......它没有意义,所以我写了一个快速测试应用程序:
#include "SDL/SDL.h"
int main()
{
SDL_Init(SDL_INIT_VIDEO);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
并编译如下:
g++ `sdl-config --libs --cflags` -o sdl-test ./sdl-test.cpp
Run Code Online (Sandbox Code Playgroud)
我甚至尝试直接链接到"/usr/lib/libSDL-1.2.so.0"或"/usr/lib/libSDL.a"
所有这些选项最终都具有相同的输出:
/tmp/cc05XT8U.o: In function `main':
sdl-test.cpp:(.text+0xa): undefined reference to `SDL_Init'
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
有人有什么想法吗?
我正在尝试为我的业余爱好内核构建一个工具链,但是在构建Newlib时我遇到了问题.每当我尝试autoreconf在newlib/libc/sys /下的kernels目录中运行时,我都会收到错误:
configure.in:5: error: support for Cygnus-style trees has been removed
Run Code Online (Sandbox Code Playgroud)
这是configure.in的内容(基本上,取自以下教程):
AC_PREREQ(2.59)
AC_INIT([newlib], [NEWLIB_VERSION])
AC_CONFIG_SRCDIR([crt0.S])
AC_CONFIG_AUX_DIR(../../../..)
NEWLIB_CONFIGURE(../../..)
AC_CONFIG_FILES([Makefile])
AC_OUTPUT
Run Code Online (Sandbox Code Playgroud)
和Makefile.am的源代码(再次主要来自教程):
AUTOMAKE_OPTIONS = cygnus
INCLUDES = $(NEWLIB_CFLAGS) $(CROSS_CFLAGS) $(TARGET_CFLAGS)
AM_CCASFLAGS = $(INCLUDES)
noinst_LIBRARIES = lib.a
if MAY_SUPPLY_SYSCALLS
extra_objs = $(lpfx)syscalls.o
else
extra_objs =
endif
lib_a_SOURCES =
lib_a_LIBADD = $(extra_objs)
EXTRA_lib_a_SOURCES = syscalls.c crt0.S
lib_a_DEPENDENCIES = $(extra_objs)
lib_a_CCASFLAGS = $(AM_CCASFLAGS)
lib_a_CFLAGS = $(AM_CFLAGS)
if MAY_SUPPLY_SYSCALLS
all: crt0.o
endif
ACLOCAL_AMFLAGS = -I ../../..
CONFIG_STATUS_DEPENDENCIES = $(newlib_basedir)/configure.host
Run Code Online (Sandbox Code Playgroud)
是的,我试过删除AUTOMAKE_OPTIONS=cygnus.
我用Google搜索并试图理解这一点,据我所知,这是因为我正在使用的autotools的版本.根据我最初使用的教程( …
我觉得这是一个相当普遍的问题,但我无法在任何地方找到答案.我有一个这样的目标:
initfs.tar: $(INITFS_FILES)
rm -f ./initfs.tar
cd initfs_root
tar --format ustar --exclude-vcs -cf ../initfs.tar ./
Run Code Online (Sandbox Code Playgroud)
INITFS_FILES定义为:
INITFS_FILES:=$(shell find ./initfs_root/ -not -path '*/.*/*' -not -name '.*' -type f)
Run Code Online (Sandbox Code Playgroud)
每次打电话make initfs.tar,都会运行此目标.在initfs_root目录中没有触及任何文件(并且使用该find命令找到所有文件).确实创建了initfs.tar.
有没有人知道为什么会这样?这对我来说没有意义,根据我在互联网上遇到的所有其他帖子以及我目前的专业知识,我认为一切都是正确的(尽管显然,我的专业知识在Makefile领域缺乏;)