用于在Linux内核上进行实时调试的最常见和不常见的方法和工具是什么?我知道Linus比如说.为防止这种调试Linux内核,或者至少是,因此什么都没有在这个意义上在这些年已经完成,但老实说,自2000年以来大量的时间已经过去了,我很感兴趣,如果这种心态已经改变了有关Linux的项目以及目前使用哪些方法在Linux内核上进行实时调试(本地或远程)?
欢迎参考有关所提及的技术和工具的演练和教程.
我在Windows 7上运行Vagrant(1.8.1)+ VirtualBox(5.0.12)并尝试启动Windows 7映像(modernIE/w7-ie8).但是,我收到此错误:
---------------------------
VirtualBox - Error In supR3HardenedWinReSpawn
---------------------------
<html><b>NtCreateFile(\Device\VBoxDrvStub) failed: 0xc0000034 STATUS_OBJECT_NAME_NOT_FOUND (0 retries) (rc=-101)</b><br/><br/>Make sure the kernel module has been loaded successfully.<br><br><!--EOM-->where: supR3HardenedWinReSpawn
what: 3
VERR_OPEN_FAILED (-101) - File/Device open failed.
Driver is probably stuck stopping/starting. Try 'sc.exe query vboxdrv' to get more information about its state. Rebooting may actually help.</html>
---------------------------
OK
---------------------------
Run Code Online (Sandbox Code Playgroud)
我运行了查询命令,但服务"找不到".
> sc.exe query vboxdrv
[SC] EnumQueryServicesStatus:OpenService FAILED 1060:
The specified service does not exist as an installed service.
Run Code Online (Sandbox Code Playgroud)
我也试过重启.没有.
我正在学习linux内核的内部结构,在阅读"理解Linux内核"时,有很多与内存相关的问题让我感到震惊.其中之一是,如果我的系统上安装了仅512 MB的物理内存,Linux内核如何处理内存映射.
正如我所读到的,内核将0(或16)MB-896MB物理RAM 映射到0xC0000000线性地址并可直接对其进行寻址.所以,在上面描述的情况下,我只有512 MB:
内核如何从512 MB映射896 MB?在所描述的方案中,内核进行设置,以便每个进程的页表将虚拟地址从0xC0000000映射到0xFFFFFFFF(1GB),直接映射到0x00000000到0x3FFFFFFF(1GB)的物理地址.但是当我只有512 MB物理RAM时,如何将虚拟地址从0xC0000000-0xFFFFFFFF映射到物理0x00000000-0x3FFFFFFF?点是我的物理范围只有0x00000000-0x20000000.
在这种情况下用户模式进程怎么样?
每篇文章都只解释了这种情况,当你安装了4 GB内存并且内核将1 GB映射到内核空间时,用户进程使用剩余的RAM量.
我很感激任何帮助,以提高我的理解.
谢谢..!
我想学习lLinux内核编程.
那个起点是什么?什么可能是一些更简单的问题?
有意义的是像操作系统这样的东西会用C编写.但它有多少,以及什么样的C?我的意思是,在C中,如果你需要一些堆内存,你可以调用malloc.但是,操作系统甚至有堆吗?据我所知,malloc 向操作系统询问内存,然后将其添加到链表,二叉树或其他内容.调用堆栈怎么样?操作系统负责设置其他应用程序使用的所有内容,但它是如何做到的?如果要在C中打开或创建文件,相应的函数会向操作系统询问该文件.所以...那个电话的另一边有什么样的C?或者在内存分配的另一端?
另外,实际上用C编写了多少操作系统?所有的?架构相关代码怎么样?那些更高级别的抽象怎么样?是否用高级语言编写,比如C++?
我的意思是,我只是出于纯粹的好奇而问这个问题.我现在正在下载最新的Linux内核,但这需要永远.我不确定我是否能够遵循代码 - 或者我是否会陷入一个我从未见过的不可避免的复杂网络中.
我正在尝试在启动时加载内核模块.
如果我跑insmod /path/to/module.ko,它运作正常.但每次重新启动时都必须重复此操作.
如果我跑modprobe /path/to/module.ko,它找不到模块.我知道modprobe使用配置文件,但即使将/path/to/module.ko添加到/ etc/modules之后我也无法加载模块.
什么是正确的配置?
我读到Mac OS X和bsd是相关的.他们有多紧密相关.可以在BSD上调整和安装Mac OS X软件吗?
看着linux内核源代码,我发现了这个:
static struct tty_operations serial_ops = {
.open = tiny_open,
.close = tiny_close,
.write = tiny_write,
.write_room = tiny_write_room,
.set_termios = tiny_set_termios,
};
Run Code Online (Sandbox Code Playgroud)
我在C中从未见过这样的符号.为什么在变量名之前有一个点?
我想以编程方式禁用硬件预取.
从使用硬件实现的预取程序优化英特尔®酷睿™微体系结构上的应用程序性能以及 如何在32位英特尔®架构上选择硬件和软件预取,我需要更新MSR以禁用硬件预取.
这是一个相关的片段:
"DPL预取和L2流预取设置也可以通过编写设备驱动程序实用程序来更改
IA32_MISC_ENABLE寄存器中的位来以编程方式进行更改MSR 0x1A0.这样的实用程序可以启用或禁用预取机制,而无需任何服务器停机.
下表显示了IA32_MISC_ENABLE MSR为了控制DPL和L2流预取而必须更改的位:
Prefetcher Type MSR (0x1A0) Bit Value
DPL (Hardware Prefetch) Bit 9 0 = Enable 1 = Disable
L2 Streamer (Adjacent Cache Line Prefetch) Bit 19 0 = Enable 1 = Disable"
Run Code Online (Sandbox Code Playgroud)
我尝试使用http://etallen.com/msr.html,但这不起作用.我使用也试图wrmsr在asm/msr.h直接但段错误.我尝试在内核模块中执行此操作...并杀死了计算机.
顺便说一句 - 我使用的是内核2.6.18-92.el5并且它已MSR在内核中链接:
$ grep -i msr /boot/config-$(uname -r)
CONFIG_X86_MSR=y
...
Run Code Online (Sandbox Code Playgroud) 我想许多开发人员喜欢在帮助下调查来源git gui blame.正如在Linux-2.6.12-rc2的提交中所解释的那样(也在Github上镜像),它需要有专门的历史Linux存储库用于此目的.
Linux的2.6.12-RC2
最初的git存储库构建.即使我们拥有它,我也不会厌倦完整的历史.如果我们想要的话,我们可以创建一个单独的"历史"git存档,同时当导入到git时它大约是3.2GB - 这会让早期的git日不必要地变得复杂,当我们没有很多良好的基础设施.
让它撕裂!
我已经查看了很多准备好的历史存储库但是我没有找到包含更改的版本返回到零版本,所以我放弃了,我在这里问这个问题.