我正在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宏来禁用中断,但它似乎没有效果。 …
在研究工作队列时,我遇到了内核中定义的工作队列标志和常量。我有以下疑问,我无法理解。
排水和救援人员在这里到底是什么意思?
WQ_DRAINING = 1 << 6, /* internal: workqueue is draining */
WQ_RESCUER = 1 << 7, /* internal: workqueue has rescuer */
Run Code Online (Sandbox Code Playgroud)为未绑定工作队列定义的 CPU 数量是 4。如果我有一个八核处理器会怎样。无界 wq 将如何绑定到 cpus。他们如何决定运行哪些 CPU,因为他们现在有 8 个 cpu 而不是 4 个 cpu。是这样,它们可以在 8 个或仅 4 个特定 cpu 中的任何一个上运行吗?
WQ_MAX_UNBOUND_PER_CPU = 4, /* 4 * #cpus for unbound wq */
在带有URG标志的tcp段中,也可能存在正常数据。接收主机如何处理紧急数据包?如果紧急数据不是数据流的一部分,它将如何确认?它是否承认其余的内容?
我知道它通常不使用,但是如果两个主机都支持有关URG标志的相同RFC,那么它们如何处理带外数据?
如果紧急数据是中止消息,则接收方将丢弃所有其他数据,但是发送方仍将希望确认已收到该消息。
我的嵌入式板有 2 个 UART。我想在两个 UART 上都有控制台输出。
在kernel/Documentation/console/console.txt中提到:
您只能为每种设备类型(串行、视频)定义一个控制台。
这是否意味着我只能使用一个 UART 作为控制台?或者,是否可以将控制台输出重定向到这两个 UART?
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)
那个帖子没有帮助。
Linux支持运行32位应用程序,只要
CONFIG_COMPAT我假设32位应用程序必须在arm AArch32执行状态下运行,并且如果环境有32位应用程序和64位应用程序。
32位应用程序进程->arm状态为AArch32
64位应用进程和内核->arm状态是AArch64
这是对的吗?
如果是这样,
Linux 如何处理 AArch32 和 AArch64 切换?
内核是否知道正在运行的进程是32位还是64位?
我是否需要在调用set_current_state()之前调用schedule()以安排运行队列中的下一个进程?
我看过很多代码,其中内核线程函数set_current_state()用于将状态设置为TASK_RUNNING或TASK_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()循环后有什么用?
我处理了netlink API 并检查了它的手册页netlink(3)和netlink(7)。
突然我面临这样的构造:
struct msghdr msg;
msg = { &sa, sizeof(sa), &iov, 1, NULL, 0, 0 };
Run Code Online (Sandbox Code Playgroud)
我在 C 中尝试过,但它给出了错误:
错误:'{' 标记前的预期表达式
显然它是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) 当我在登录 shell 执行命令时按 ctrl+c 时,前台进程被杀死。
谁发出信号?
TTY 驱动程序是否直接将 SIGINT 发送到前台进程组?
或者 TTY 驱动程序是否将 SIGINT 发送到 shell,然后 shell 将信号重定向到前台进程组?
我正在尝试为 Linux 编写一个 C 嗅探器,并了解嗅探时内核中发生的操作。
我无法找到以下问题的答案:如果我按以下方式初始化套接字:
sock_raw = socket(AF_PACKET , SOCK_RAW , htons(ETH_P_ALL));
Run Code Online (Sandbox Code Playgroud)
内核中发生了什么?我如何看到所有传入和传出的数据包,但不“劫持”它们?因为我到目前为止所理解的是,当内核接收到数据包时,它将其发送到相关的协议处理函数。因此我无法理解 - 除了我打开的套接字之外,内核是否还会克隆数据包并发送它?
linux-kernel ×8
c ×6
linux ×5
arm ×1
assembly ×1
bash ×1
c++ ×1
interrupt ×1
manpage ×1
netlink ×1
networking ×1
out-of-band ×1
scheduling ×1
sigint ×1
signals ×1
sockets ×1
tcp ×1
workqueue ×1
x86 ×1