标签: kernel

启用GRUB以从内核自动启动

我正在为操作系统开发内核.为了执行它,我决定使用GRUB.目前,我已经连接到GRUB的脚本stage1,stage2,垫文件,这使得它可引导内核本身一起.唯一的问题是,当我运行它时,你必须让GRUB知道内核的位置和手动的大小然后启动它,如下所示:

kernel 200+KERNELSIZE
boot

KERNELSIZE是块中内核的大小.这很好,一开始就没问题,但是可以在二进制文件中获取这些值并使GRUB自动启动内核吗?有关如何实现这一目标的任何建议?

operating-system kernel grub osdev

13
推荐指数
1
解决办法
1881
查看次数

有人可以指向我的bitbake或openembedded教程吗?

我一直在为BeagleBoard 的Angstrom Linux发行版工作.任何人都可以指点我的bitbake和OpenEmbedded如何实际工作的教程或参考?例如,当我像这样调用bitbake时:

bitbake virtual/kernel
Run Code Online (Sandbox Code Playgroud)

实际发生了什么?我已经研究了Angstrom的配方并搜索了Angstrom文件系统,但我似乎无法找到对虚拟或内核的引用.我觉得使用这个工具链并制作内核补丁并没有真正了解bitbake的工作方式,我感到有点沮丧.

linux kernel beagleboard openembedded angstrom-linux

13
推荐指数
1
解决办法
5157
查看次数

Linux内核如何知道在启动时加载哪些驱动程序?

我想知道第一次启动和后续启动时的情况.

我正在编译自己的内核,并希望它尽可能精简.我想手工构建.config文件(主要是作为学习经验),所以我需要知道可以排除的所有内容.我知道一个可能的解决方案是查看我当前的发行版加载驱动程序列表.但是,我很好奇我的发行版如何发现最初要加载的驱动程序.

TIA.

linux kernel module

13
推荐指数
2
解决办法
2万
查看次数

(编写内核)如何修改中断描述符表?

我正在编写一个小内核,只是为了解决一些低级别的问题.现在,它在Virtual Box中启动,我可以在屏幕上显示文本,分配一些内存,以及其他非常基本的东西.它是用C++和一点点asm编写的.

我想探索的一件事是多任务背后的机制.据我了解,它是这样的:

  1. 内核初始化中断描述符表,以便定期发出中断(例如毫秒)并调用内核中定义的例程.
  2. 调用例程时,它可以决定将代码/数据段和堆栈指针设置为另一个程序上下文的指针,即"上下文切换".

因此,它在概念上似乎很简单,但我知道细节会变得更加毛茸茸.我发现了一些在线的东西,但术语变化很大,而且这些例子似乎来自我没有的上下文(比如Linux内核中的内容).

但是,设置描述符表的方式似乎是这样的:

  1. 将一些数据发送到PIC(outb以及什么不是)以初始化它.
  2. 在内存中准备一个中断表,其中包含指向所需例程的函数指针,注意这些函数可以作为信号处理程序.
  3. 用表加载表lidt.

但是,我找不到具体做这些事情,或者这是否正确.有没有人有一个困惑的内核作家的资源?

x86 kernel osdev context-switch interrupt-handling

13
推荐指数
1
解决办法
2583
查看次数

用于android和未知重定位的Hello world内核模块:27当insmod时

我正在尝试创建一个简单的内核模块.我正在尝试将消息打印到dmesg,但我一直在努力

insmod:init_module'hello.ko'在android中失败(Exec格式错误)

之后:dmesg:未知搬迁:27

#include <linux/module.h>
#include <linux/kdb.h>
int init_module(void)
{
    printk(KERN_ALERT "Hello world!\n");
    return 1;
}

void cleanup_module(void)
{
    printk(KERN_INFO "Goodbye world 1.\n");
}
MODULE_AUTHOR("Robert P. J. Day");
MODULE_LICENSE("Dual BSD/GPL");
MODULE_VERSION("2:1.0") ;
MODULE_DESCRIPTION("You have to start somewhere.");
Run Code Online (Sandbox Code Playgroud)

make文件

    obj-m +=hello.o


KERNELDIR ?= ~/android/kernel/common
#KERNELDIR ?= /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
CROSS_COMPILE=~/android-ndk-r8/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-

ARCH=arm
default:
$(MAKE) -C $(KERNELDIR) M=$(PWD) ARCH=arm CROSS_COMPILE=$(CROSS_COMPILE) modules

clean:
$(MAKE) -C $(KERNELDIR) M=$(PWD) clean
rm *.symvers
Run Code Online (Sandbox Code Playgroud)

有谁知道为什么?以及如何使它工作?

我在做了一个readelf之后发现,当它被编译时,重定位部分指向了错误的方向.

Offset     Info    Type            Sym.Value  Sym. Name
00000008  0000171b …
Run Code Online (Sandbox Code Playgroud)

android kernel module kernel-module linux-kernel

13
推荐指数
1
解决办法
7344
查看次数

为什么内核称为内核?

所以这个问题的标题几乎总结了我的问题.为了清楚起见,我理解内核是什么以及为什么我们制作它们.我想知道它名字的由来.到目前为止,我所有的goggling和维基百科只发现了内核是什么,它的形式各不相同.

kernel definition

13
推荐指数
2
解决办法
8205
查看次数

编译错误:内核模块

我在内核编程新手和我要运行这个内核模块(贴在下面)......我跑了生成文件(贴在下面),但我收到以下错误:可有人请帮助我了解如何克服这一点:内核程序应该没有错误运行,因为它来自英特尔的实现:

obj-m += hello-1.o

all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
Run Code Online (Sandbox Code Playgroud)

这是错误:

snehil@ubuntu:~/Desktop/measure$ make
make -C /lib/modules/3.0.0-12-generic/build M=/home/snehil/Desktop/measure modules
make[1]: Entering directory `/usr/src/linux-headers-3.0.0-12-generic'
CC [M]  /home/snehil/Desktop/measure/measure1.o
/home/snehil/Desktop/measure/measure1.c: In function ‘hello_start’:
/home/snehil/Desktop/measure/measure1.c:108:2: error: implicit declaration of function
  ‘kmalloc’ [-Werror=implicit-function-declaration]
/home/snehil/Desktop/measure/measure1.c:108:8: warning: assignment makes pointer from  
 integer without a cast [enabled by default]
/home/snehil/Desktop/measure/measure1.c:115:11: warning: assignment makes pointer from
 integer without a cast [enabled by default]
/home/snehil/Desktop/measure/measure1.c:124:12: warning: assignment makes pointer …
Run Code Online (Sandbox Code Playgroud)

kernel makefile kernel-module linux-kernel

13
推荐指数
2
解决办法
2万
查看次数

如何获取侦听套接字的BACKLOG

我在ubuntu linux上的端口80上有一个监听套接字.

tcp    0  0 0.0.0.0:80      0.0.0.0:*   LISTEN  12248/nginx
Run Code Online (Sandbox Code Playgroud)

有没有办法获得该套接字的backlog值(发送给listen()调用的backlog值)?

我知道我可以查看nginx配置,但配置文件可以更改而无需使用新配置重新加载nginx,因此配置和实际LISTEN调用中的backlog参数可能不同.

linux performance kernel tcp nginx

13
推荐指数
2
解决办法
7704
查看次数

在x86上,当操作系统禁用中断时,它们是否会消失,或者它们是否排队并"等待"中断重新开启?

在Windows上,我的平台是x86和x86-64.

中断优先级系统的要点是让最高优先级的中断超过其他中断.为了强制执行此操作,我猜测Windows将完全禁用所有较低级别的中断,直到更高级别中断的ISR完成为止.

但如果CPU没有收听中断,会发生什么?他们只是默默地消失了吗?或者他们是否在硬件中排队,等待中断再次启用?如果存放,在哪里?有多少人可以排队?如果有太多中断没有被处理,会发生什么?如果存在中断处理积压的罕见情况,检测问题的工具是什么?

kernel driver interrupt interrupt-handling kmdf

13
推荐指数
1
解决办法
1869
查看次数

更新android时区数据

我在我的设备上运行Android 4.4.3,当然它已经过时了,我正在尝试更新/ system/usr/share/zoneinfo中tzdata.但是,立即替换文件不会更新时区.

由于ICU保留了自己的时区数据副本,我们也必须更换它(根据谷歌AOSP团队).更新后的数据文件更新ICU更新仿生

但是,当我构建并替换icu4c库(libicui18n.so和libicuuc.so)并将icudt51l.dat替换为icudt53l.dat时,系统无法初始化ICU.

我已经尝试解压缩icudt53l.dat并在旧的icudt51l.dat中推送其*.res文件但是也失败了因为ICUPKG工具在打包之前检查res文件的校验和.

我按照XDA链接更新了tzdata,但是这种方法失败了,因为他们使用tzdata 创建了zoneinfo.dat,zoneinfo.idx,zoneinfo.version文件.但是系统在/ system/usr/share/zoneinfo中查找tzdata本身

我不是时区或ICU专家,如果我朝错误的方向寻求帮助,请指点我.

timezone android kernel icu android-4.4-kitkat

13
推荐指数
1
解决办法
5732
查看次数