小编red*_*0ct的帖子

Linux 内核模块中未执行 CLI 指令

我正在Intel Atom处理器(带有 2 个内核的x86_64)上编写Linux v3.2内核模块。我想禁用特定的 IRQ 编号,但在 Linux 上执行此操作时遇到问题。

我是双引导MS-DOS,通过直接与8259 PIC芯片通信,我可以轻松禁用 Intel 语法 x86 程序集中的中断:

CLI                ; disable all interrupts
MOV    DX, 0x21    ; set 8259 ioport address
IN     AL, DX      ; store current interrupt mask in AL
AND    AL, 0xDF    ; modify mask to disable IRQ 5
OUT    DX, AL      ; send new mask to 8259
STI                ; reenable interrupts
Run Code Online (Sandbox Code Playgroud)

这很有效,我成功地禁用了特定的 IRQ 号码。

Linux 中,我知道我必须使用disable_irq宏来禁用中断,但它似乎没有效果。 …

c x86 assembly interrupt linux-kernel

4
推荐指数
1
解决办法
2193
查看次数

工作队列的这些标志是什么意思?

在研究工作队列时,我遇到了内核中定义的工作队列标志和常量。我有以下疑问,我无法理解。

  1. 排水和救援人员在这里到底是什么意思?

    WQ_DRAINING             = 1 << 6, /* internal: workqueue is draining */
    WQ_RESCUER              = 1 << 7, /* internal: workqueue has rescuer */
    
    Run Code Online (Sandbox Code Playgroud)
  2. 为未绑定工作队列定义的 CPU 数量是 4。如果我有一个八核处理器会怎样。无界 wq 将如何绑定到 cpus。他们如何决定运行哪些 CPU,因为他们现在有 8 个 cpu 而不是 4 个 cpu。是这样,它们可以在 8 个或仅 4 个特定 cpu 中的任何一个上运行吗?

    WQ_MAX_UNBOUND_PER_CPU = 4, /* 4 * #cpus for unbound wq */

c scheduled-tasks linux-kernel interrupt-handling workqueue

3
推荐指数
1
解决办法
1542
查看次数

是否确认紧急tcp数据?

在带有URG标志的tcp段中,也可能存在正常数据。接收主机如何处理紧急数据包?如果紧急数据不是数据流的一部分,它将如何确认?它是否承认其余的内容?

我知道它通常不使用,但是如果两个主机都支持有关URG标志的相同RFC,那么它们如何处理带外数据?

如果紧急数据是中止消息,则接收方将丢弃所有其他数据,但是发送方仍将希望确认已收到该消息。

networking tcp out-of-band

3
推荐指数
1
解决办法
810
查看次数

多个 UART 上的 Linux 控制台输出

我的嵌入式板有 2 个 UART。我想在两个 UART 上都有控制台输出。

kernel/Documentation/console/console.txt中提到:

您只能为每种设备类型(串行、视频)定义一个控制台。

这是否意味着我只能使用一个 UART 作为控制台?或者,是否可以将控制台输出重定向到这两个 UART?

linux linux-kernel embedded-linux

3
推荐指数
1
解决办法
4075
查看次数

Linux 内核错误:标记“(”之前缺少二元运算符

Linux 内核模块中的一些简单预处理器代码会出现以下错误:

标记“(”之前缺少二元运算符

代码:

#if defined(AAA) || defined(BBB)

#if LINUX_VERSION_CODE <= KERNEL_VERSION(3,13,0)
#define SOME 111
#else
#define SOME 222
#endif

#define OTHER 999

#else

#define SOME 1
#define OTHER 9

#endif /* AAA || BBB */
Run Code Online (Sandbox Code Playgroud)

那个帖子没有帮助。

c kernel-module linux-kernel c-preprocessor

3
推荐指数
1
解决办法
1698
查看次数

Linuxarm64如何在AArch32和AArch64之间切换

Linux支持运行32位应用程序,只要

  1. 内核启用CONFIG_COMPAT
  2. 硬件支持AArch32

我假设32位应用程序必须在arm AArch32执行状态下运行,并且如果环境有32位应用程序和64位应用程序。

32位应用程序进程->arm状态为AArch32

64位应用进程和内核->arm状态是AArch64

这是对的吗?

如果是这样,
Linux 如何处理 AArch32 和 AArch64 切换?
内核是否知道正在运行的进程是32位还是64位?

linux arm linux-kernel embedded-linux

3
推荐指数
1
解决办法
3379
查看次数

我们需要在调用 schedule 之前调用 set_current_state(TASK_INTERRUPTIBLE) 吗?

我是否需要在调用set_current_state()之前调用schedule()以安排运行队列中的下一个进程?

我看过很多代码,其中内核线程函数set_current_state()用于将状态设置为TASK_RUNNINGTASK_UNINTERRUPTIBLE

set_current_state(TASK_INTERRUPTIBLE);

while (!kthread_should_stop()) {
        ....
        schedule();
        .....
}
__set_current_state(TASK_RUNNING);
Run Code Online (Sandbox Code Playgroud)

是否有必要调用set_current_state()TASK_INTERRUPTIBLE调用之前schedule()

在这个示例代码中,将状态设置为TASK_RUNNING退出kthread_should_stop()循环后有什么用?

c scheduling linux-device-driver linux-kernel

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

为什么 Linux NETLINK 手册页提供 C++ 示例而不提供 C?

我处理了 API 并检查了它的手册页netlink(3)netlink(7)
突然我面临这样的构造:

struct msghdr msg;

msg = { &sa, sizeof(sa), &iov, 1, NULL, 0, 0 };
Run Code Online (Sandbox Code Playgroud)

我在 C 中尝试过,但它给出了错误:

错误:'{' 标记前的预期表达式

显然它是(我不知道什么标准)。
当然,很明显,Netlink 是一个 API,没有特定的语言绑定。但这是 C 实现,我见过的关于 C API 的所有 MAN 页面都有纯 C 示例。为什么没有关于示例中使用的语言的注释?这种做法是为了什么,为什么这不是 Python 或其他什么东西?


UPD:我不认为这是 MAN 页面中的拼写错误或无意错误。还有一些其他地方使用了这个 C++ 特性,例如:

struct iovec iov = { buf, sizeof(buf) };
struct sockaddr_nl sa;
struct msghdr msg;
struct nlmsghdr *nh;

msg = { &sa, sizeof(sa), &iov, 1, NULL, 0, 0 };
len = …
Run Code Online (Sandbox Code Playgroud)

c c++ linux manpage netlink

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

当按下 ctrl+c、tty 驱动程序或 shell 时,谁将 SIGINT 发送到前台进程

当我在登录 shell 执行命令时按 ctrl+c 时,前台进程被杀死。
谁发出信号?

TTY 驱动程序是否直接将 SIGINT 发送到前台进程组?
或者 TTY 驱动程序是否将 SIGINT 发送到 shell,然后 shell 将信号重定向到前台进程组?

linux bash signals linux-kernel sigint

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

AF_PACKET 套接字在 Linux 中如何工作?

我正在尝试为 Linux 编写一个 C 嗅探器,并了解嗅探时内核中发生的操作。

我无法找到以下问题的答案:如果我按以下方式初始化套接字:

sock_raw = socket(AF_PACKET , SOCK_RAW , htons(ETH_P_ALL));
Run Code Online (Sandbox Code Playgroud)

内核中发生了什么?我如何看到所有传入和传出的数据包,但不“劫持”它们?因为我到目前为止所理解的是,当内核接收到数据包时,它将其发送到相关的协议处理函数。因此我无法理解 - 除了我打开的套接字之外,内核是否还会克隆数据包并发送它?

c sockets linux linux-kernel

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