我正在尝试将 sys exit 调用设置为一个变量
extern void *sys_call_table[];
real_sys_exit = sys_call_table[__NR_exit]
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试制作时,控制台给了我错误
error: ‘__NR_exit’ undeclared (first use in this function)
Run Code Online (Sandbox Code Playgroud)
任何提示将不胜感激:) 谢谢
这是关于void spin_lock_irqsave(spinlock_t *lock, unsigned long flags);函数调用。之前提到的中断状态存储在标志中,我们可以通过将其传递给spin_unlock_irqrestore函数来恢复它们。
但是我不知道值传递的标志如何在spin_lock_irqsave调用时捕获先前的中断状态。
我已经分配了一个指针
int *ptr = kmalloc(sizeof(int), GFP_ATOMIC);
Run Code Online (Sandbox Code Playgroud)
并且该指针在具有 5 秒超时值的计时器函数中被释放。
if( NULL != ptr )
{
kfree(ptr);
ptr = NULL;
}
Run Code Online (Sandbox Code Playgroud)
请告诉我这里有什么问题.. 提前致谢。
在 C 中,如果您尝试写入不属于您的内存,则可能发生的一种情况是段错误。(从技术上讲,当您尝试写入不属于您的内存时,行为是未定义的,但操作系统可以处理这种情况的方法之一是抛出段错误)。对于尝试非法内存访问的用户空间代码,内核是检测非法内存访问并抛出段错误的代码。
现在,我正在编写一个 Linux 内核模块。我的代码在内核空间中运行。我有两个相关的问题:
如果我超出数组范围,我的代码就会出现段错误。我想知道什么是检测这个段错误?对于用户空间应用程序,内核会检测段错误。内核代码本身呢?什么负责检测内核代码中的越界内存访问?
我编写的内核模块和 insmod 是否作为单独的进程运行?如果是,当我的模块出现段错误时,为什么整个内核都会出现段错误?为什么不只是我的模块段错误,而内核的其余部分继续运行?
我正在阅读本教程中的第 3.1.5 节:http : //www.tldp.org/LDP/lkmpg/2.6/html/lkmpg.html
Linux 64。英特尔酷睿 2 双核。
Linux 内核在哪里与 cpu 进行“通信”?我阅读了调度程序的源代码,但无法理解它们如何通信以及内核如何告诉 cpu 需要处理某些内容。
我知道有运行队列,但不是有什么东西可以让内核通过总线中断 CPU 吗?
它扩展了我最初的问题了一下:我们如何判断CPU在那里的任务队列?
因为 cpu 必须轮询某些东西,我想我们会在某个时候告诉它。错过了内核代码中的那一点。
就像CR3寄存器一样,它用于指向页面目录.Linux也使用分页并用C语言编写,但这些寄存器如何在C中使用(如何使用C选择特定的寄存器)?
最近我发现Linux内核中的Sleep系统调用会将当前调用线程挂起到挂起/阻塞状态,这意味着他们不会在上述时间过去之前使用CPU.- 完全理解.
现在来到互斥和信号量,
互斥锁:
acquire() {
while (!available)
; // busy wait --> my doubt
available = false;;
}
release() {
available = true;
}
Run Code Online (Sandbox Code Playgroud)
信号量锁定:
wait(S) {
while (S <= 0)
; // busy wait --> my doubt
S--;
}
signal(S) {
S++;
}
Run Code Online (Sandbox Code Playgroud)
PS:这些代码片段取自ABRAHAM SILBERSCHATZ的"操作系统概念-9版"
我的问题:
我知道忙等待不是解决同步问题的有效方法,但是从上面提到的代码片段我怀疑使用互斥和信号量会在忙碌的等待中结束?(尽管互斥体和信号量被广泛用于解决大多数系统问题).
这让我觉得使用互斥锁和信号量不是解决同步问题的有效方法, 因为它会占用CPU周期(因为它不会导致挂起状态而是在while循环中旋转).
简而言之: 互斥和信号量是否会等待而不是将等待的线程线程置于挂起状态?
提前致谢 !!.如果我的理解错了,请纠正我!
operating-system mutex semaphore linux-kernel thread-synchronization
通过查看内核源代码中的binfmt_elf.c,我无法弄清楚在生成32位进程与64位进程时内核(64位)的作用有何不同.
任何人都可以向我解释我错过了什么吗?
(这个问题与我关于在64位指令(链接)的同一过程中有32位指令的其他问题有关,但这可以作为一个单独的问题.)
我正在尝试使用ppc64(power pc)计算机上的自定义驱动程序在特定的pci设备上进行重置。
该驱动程序可在另一台ppc64计算机上使用。
这是负责执行此操作的功能。我删除了几行代码以强调重要的流程。
int reset_device(void)
{
pdev = g_reset_info.devs[ix];
err = pci_enable_device(pdev);
if (err) {
return err;
}
pci_set_master(pdev);
err = pci_save_state(pdev);
if (err) {
return err;
}
pdev = g_reset_info.devs[ix];
err = pci_set_pcie_reset_state(pdev, pcie_hot_reset);
if (err) {
return err;
}
msleep(jiffies_to_msecs(HZ/2));
msleep(jiffies_to_msecs(HZ/2));
pdev = g_reset_info.devs[ix];
err = pci_set_pcie_reset_state(pdev, pcie_deassert_reset);
if (err) {
return err;
}
pdev = g_reset_info.devs[ix];
pci_restore_state(pdev);
msleep(jiffies_to_msecs(HZ/2));
msleep(jiffies_to_msecs(HZ/2));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这是来自dmesg的输出:
mst_ppc_pci_reset_driver reset_device 63 Send hot reset to device: 0000:50:00.0
mst_ppc_pci_reset_driver reset_device 81 Deassert …Run Code Online (Sandbox Code Playgroud) linux-kernel ×10
c ×4
linux ×4
32bit-64bit ×1
manpage ×1
mutex ×1
pci ×1
powerpc ×1
scheduler ×1
semaphore ×1
system-calls ×1
x86-64 ×1