标签: kernel

Linux内核 - 通过模块动态添加系统调用

有没有办法添加系统调用动态,比如通过模块?我找到了可以用模块覆盖现有系统调用的地方,只需更改sys_call_table[]数组以获取我的重写函数而不是安装我的模块时的本机,但是你可以用新的系统调用和模块吗?

linux kernel kernel-module linux-kernel

16
推荐指数
2
解决办法
4906
查看次数

如何编写hello world内核?

我正在编写一个内核,所以我开始在内核中使用hello world程序.

我用c ++编写了一个hello world内核,并且编译成功.

但是,当我启动它时,它不会在屏幕上显示任何内容.

这段代码出了什么问题?

link.ld

OUTPUT_FORMAT("binary")
ENTRY(start)
SECTIONS{
. = 0x00100000;

.text :{
    *(.text)
}

.rodata ALIGN (0x1000) : {
    *(.rodata)
}

.data ALIGN (0x1000) : {
    *(.data)
}

.bss : {
    sbss = .;
    *(COMMON)
    *(.bss)
    ebss = .;
}
}
Run Code Online (Sandbox Code Playgroud)

loader.asm

[BITS 32]

global start
extern _main

start:
    call _main
    cli 
    hlt
Run Code Online (Sandbox Code Playgroud)

video.h

#ifndef VIDEO_H
#define VIDEO_H

class Video{
    public:
        Video();
        ~Video();
        void clear();
        void write(char *cp);
        void put(char c);
    private:
        unsigned short *videomem;
        unsigned …
Run Code Online (Sandbox Code Playgroud)

c c++ assembly operating-system kernel

16
推荐指数
3
解决办法
4629
查看次数

ARM中的原子操作

我一直在为ARM的嵌入式操作系统工作,但是即使在引用ARMARM和linux源代码之后,我仍然对架构有一些了解.

原子操作.

ARM ARM表示加载和存储指令是原子的,并且在执行中断处理程序之前保证其执行完整.通过查看验证

arch/arm/include/asm/atomic.h :
    #define atomic_read(v)  (*(volatile int *)&(v)->counter)
    #define atomic_set(v,i) (((v)->counter) = (i))
Run Code Online (Sandbox Code Playgroud)

但是,当我想使用对于ARMv7(我的目标)使用LDREX和STREX的cpu指令(atomic_inc,atomic_dec,atomic_cmpxchg等...)原子地操作此值时,问题就出现了.

ARMARM没有说明在本节中阻止中断的任何内容,因此我假设在LDREX和STREX之间可能发生中断.它提到的事情是关于锁定内存总线,我猜这只对MP系统有帮助,因为MP系统可能有更多的CPU试图同时访问同一个位置.但对于UP(可能还有MP),如果在LDREX和STREX的这个小窗口中触发定时器中断(或SMP的IPI),异常处理程序执行可能会更改cpu上下文并返回到新任务,但是令人震惊的部分现在进入,它执行'CLREX',因此删除前一个线程持有的任何独占锁.那么在UP系统上使用LDREX和STREX比LDR和STR在原子性方面有多好?

我确实读过一些关于独占锁监视器的东西,所以我有一个可能的理论,当线程恢复并执行STREX时,os监视器会导致此调用失败,可以检测到并且可以使用new重新执行循环过程中的价值(分支回LDREX),我在这里吗?

kernel arm atomic thread-safety

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

在C内核模块中的数组初始化中的省略号

我正在检查github上的一些代码https://github.com/umlaeute/v4l2loopback/blob/master/v4l2loopback.c并遇到了这一行,令我感到困惑.这是一些我不知道的非常酷的内核宏或gcc功能吗?怎么= -1办?

static int video_nr[MAX_DEVICES] = { [0 ... (MAX_DEVICES-1)] = -1 };
module_param_array(video_nr, int, NULL, 0444);
MODULE_PARM_DESC(video_nr, "video device numbers (-1=auto, 0=/dev/video0, etc.)");
Run Code Online (Sandbox Code Playgroud)

有问题的行是第一个,后两个用于上下文(这是使用内核宏创建cmdline可指定的参数http://lxr.free-electrons.com/source/include/linux/moduleparam.h#L103)

无论如何,数组初始化发生了什么?该语法如何工作?

c kernel

16
推荐指数
1
解决办法
2212
查看次数

从用户模式切换到内核模式

在我的操作系统类中,我被问到从用户切换到内核模式是否具有特权.这不是特定于操作系统的.起初我想是的,但它似乎是一个很大的Catch 22.我提到了我的教科书:

硬件允许特权指令仅在内核模式下执行....

切换到内核模式的指令是特权指令的示例.

Gagne,Greg; Abraham Silberschatz; Peter B. Galvin(2010-01-26).操作系统概念(第22页).Wiley Higher Ed.Kindle版.

所以我们从用户模式开始.要切换到内核模式,需要特权指令.必须在内核模式下执行特权指令,因此我们必须切换到内核模式以启用切换到内核模式.

我认为系统不允许用户直接切换到内核模式,但是当用户试图执行另一个特权指令时,它由内核完成.那是对的吗?

operating-system kernel

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

用Python绘制二维核密度估计

我想绘制2D核密度估计.我发现seaborn包在这里非常有用.但是,经过长时间的搜索,我无法弄清楚如何使y轴和x轴不透明.另外,如何在轮廓上显示密度值?如果有人可以帮助我,我将非常感激.下面请看我的代码和图表.在此输入图像描述

import numpy as np
import seaborn as sns
import matplotlib.pyplot as pl

Y = np.random.multivariate_normal((0, 0), [[0.8, 0.05], [0.05, 0.7]], 100)
ax = sns.kdeplot(Y, shade = True, cmap = "PuBu")
ax.patch.set_facecolor('white')
ax.collections[0].set_alpha(0)
ax.set_xlabel('$Y_1$', fontsize = 15)
ax.set_ylabel('$Y_0$', fontsize = 15)
pl.xlim(-3, 3)
pl.ylim(-3, 3)
pl.plot([-3, 3], [-3, 3], color = "black", linewidth = 1)
pl.show()
Run Code Online (Sandbox Code Playgroud)

python plot kernel matplotlib seaborn

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

x86组件上的保护模式键盘访问

我正在为键盘输入工作,我正在开发一个非常基本的内核,而且我完全卡住了.我似乎无法在网上找到任何可以向我显示我需要知道的信息.

我的内核现在正在保护模式下运行,所以我无法使用实模式键盘例程而不会跳转到实模式和后退,这是我试图避免的.我希望能够从保护模式访问我的键盘.有谁知道如何做到这一点?到目前为止我唯一发现的是它涉及使用输入/输出端口直接与控制器通信,但除此之外我感到难过.当然,这不是经常出现的事情.通常,Assembly教程假设您正在运行下面的操作系统.

我是x86程序集的新手,所以我只是在寻找一些好的资源来处理来自保护模式的标准硬件.我正在用NASM编译汇编源代码并将其链接到用DJGPP编译的C源代码.有什么建议?

keyboard x86 kernel protected-mode osdev

15
推荐指数
1
解决办法
6623
查看次数

Amazon EC2实例如何选择其内核?

我有一个使用亚马逊提供的Fedora 8 64位AMI的Amazon EC2实例,我想升级到Fedora 10.

我尝试通过运行"yum update"来升级内核和所有软件包.这似乎工作正常,我看到我现在安装了fc10内核,并且我所有已安装的软件包也已更新到Fedora 10版本.

但是,我也注意到仍然安装了fc8内核,当我重启我的映像时,它返回运行fc8内核,而不是fc10内核(我从"uname -a"的输出中推断出来).

我需要采取一些额外的步骤来使我的映像在fc10内核下启动,或者这是否可能?亚马逊文档没有找到对我有用的东西.

kernel fedora amazon-ec2 amazon-web-services

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

中断和异常上下文有什么区别?

两者之间有什么重大区别吗?是否可以在一个而不是另一个中完成任何事情?修改例如页面错误处理程序而不是计时器处理程序时是否需要更加小心?

kernel linux-kernel

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

SYSCALL/SYSRET指令如何跨x86 CPU执行?

SYSCALLSYSRET(和它们的32位唯一英特尔同行SYSENTERSYSEXIT)通常被描述为"普遍较快"的方式进入和在比呼叫门或软件中断x86处理器退出管理程序模式,但是这要求基本准确的数字在很大程度上仍然无证.特别是,我能够找到的所有英特尔或AMD优化指南都没有提及这些指令.所以:

  • 多少个时钟周期(估计)做SYSCALLSYSRET采取跨最近英特尔微体系结构64?这可能通过直接实验来衡量,但是有很多不同的CPU需要测试.

根据此数字的数量级,更详细的问题可能是相关的:

  • 他们是否会产生完整的管道摊位或任何其他类型的摊位?
  • 如果有的话,它们如何与分支预测(例如返回堆栈缓冲区)和获取逻辑交互?
  • 那么延迟,数据依赖,序列化呢?
  • &TC.

假设用户空间一侧有64位代码,没有额外的地址空间切换(写入CR3),甚至匹配SYSCALLSYSRET配对(如果重要).

performance x86 kernel system-calls

15
推荐指数
1
解决办法
1372
查看次数