我知道所有关于为什么不应该从内核读/写文件的讨论,而是如何使用/ proc或netlink来做到这一点.无论如何我想读/写.我也读过" 驾驶我的坚果 - 你应该在内核中做的事情".
但问题是2.6.30不能导出sys_read().相反,它包含在内SYSCALL_DEFINE3.因此,如果我在我的模块中使用它,我会收到以下警告:
WARNING: "sys_read" [xxx.ko] undefined!
WARNING: "sys_open" [xxx.ko] undefined!
Run Code Online (Sandbox Code Playgroud)
显然insmod无法加载模块,因为链接没有正确发生.
问题:
sys_read()/ sys_open()不导出)?SYSCALL_DEFINEn()内核中包含宏的系统调用?背景
我正在使用 docker 来做一个学校项目。具体来说,我提取了一个 ubuntu 映像,这是系统配置:
然后我登录到 docker 容器(ubuntu)并设置elasticsearch。当我尝试跑步时
./bin/elasticsearch
Run Code Online (Sandbox Code Playgroud)
我在 docker 容器的终端内收到以下错误
/lib64/ld-linux-x86-64.so.2: No such file or directory
Run Code Online (Sandbox Code Playgroud)
我主要有两个困惑:
我读到,通过写入/ sys/block/[disk]/queue/scheduler,可以在运行的内核上更改特定设备的I/O调度程序.例如,我可以在我的系统上看到:
anon@anon:~$ cat /sys/block/sda/queue/scheduler
noop anticipatory deadline [cfq]
Run Code Online (Sandbox Code Playgroud)
默认是完全公平的排队调度程序.我想知道的是,在我的自定义内核中包含所有四个调度程序是否有任何用处.除非内核足够智能为正确的硬件选择正确的调度程序,特别是基于闪存的驱动器的"noop"调度程序和传统的其他调度程序之一,似乎编译多个调度程序没有多大意义.硬盘.
是这样的吗?
我在gdb的目标可执行文件之外,我甚至没有与该目标对应的堆栈.无论如何我想单步执行,以便我可以验证汇编代码中发生了什么,因为我不是x86汇编的专家.不幸的是,gdb拒绝进行这种简单的汇编级调试.它允许我在适当的断点上设置和停止,但是一旦我尝试单步执行,gdb就会报告错误"找不到当前函数的边界"并且EIP不会改变.
额外细节:
机器代码是由gcc asm语句生成的,我将它从objdump -d的输出复制到它正在执行的内核内存位置.我不介意使用加载器将我的目标代码加载到重定位地址的简单方法,但请记住,加载必须在内核模块中完成.
我想另一个替代方法是生成一个伪内核模块或调试信息文件给gdb,使它相信这个区域在程序代码中.gdb在内核可执行文件本身上运行良好.
(对于那些真正想知道的人,我在运行时将代码插入到VMware VM内的Linux内核数据空间中,并通过VMware Workstation的内置gdb存根从gdb远程调试内核进行调试.注意我不是在编写内核利用;我是一名安全研究生,正在编写原型.)
(我可以在我的程序集中的每个指令上设置一个断点.这可以工作,但一段时间后会变得非常费力,因为x86汇编指令的大小会有所不同,每次重新启动时程序集的位置都会改变.)
我正在研究通过网络连接硬盘的驱动程序.有一个错误,如果我在计算机上启用两个或更多硬盘,只有第一个硬盘可以查看和识别分区.结果是,如果我在hda上有1个分区,在hdb上有1个分区,只要我连接hda,就会有一个可以挂载的分区.所以hda1一旦安装就会得到一个blkid xyz123.但是当我继续安装hdb1时,它也会出现相同的blkid,实际上,驱动程序是从hda而不是hdb读取它.
所以我想我找到了司机弄乱的地方.下面是一个调试输出,包括dump_stack,我把它放在第一个看似访问错误设备的地方.
这是代码部分:
/*basically, this is just the request_queue processor. In the log output that
follows, the second device, (hdb) has just been connected, right after hda
was connected and hda1 was mounted to the system. */
void nblk_request_proc(struct request_queue *q)
{
struct request *req;
ndas_error_t err = NDAS_OK;
dump_stack();
while((req = NBLK_NEXT_REQUEST(q)) != NULL)
{
dbgl_blk(8,"processing queue request from slot %d",SLOT_R(req));
if (test_bit(NDAS_FLAG_QUEUE_SUSPENDED, &(NDAS_GET_SLOT_DEV(SLOT_R(req))->queue_flags))) {
printk ("ndas: Queue is suspended\n");
/* Queue is suspended */
#if ( LINUX_VERSION_CODE …Run Code Online (Sandbox Code Playgroud) 我做到了 sudo cat /proc/1/maps -vv
我试图弄清楚输出.我可以看到很多共享库按预期映射到内存映射段.
7f3c00137000-7f3c00179000 r-xp 00000000 08:01 21233923 /lib/x86_64-linux-gnu/libdbus-1.so.3.5.8
7f3c00179000-7f3c00379000 ---p 00042000 08:01 21233923 /lib/x86_64-linux-gnu/libdbus-1.so.3.5.8
7f3c00379000-7f3c0037a000 r--p 00042000 08:01 21233923 /lib/x86_64-linux-gnu/libdbus-1.so.3.5.8
7f3c0037a000-7f3c0037b000 rw-p 00043000 08:01 21233923 /lib/x86_64-linux-gnu/libdbus-1.so.3.5.8
7f3c0037b000-7f3c00383000 r-xp 00000000 08:01 21237216 /lib/x86_64-linux-gnu/libnih-dbus.so.1.0.0
7f3c00383000-7f3c00583000 ---p 00008000 08:01 21237216 /lib/x86_64-linux-gnu/libnih-dbus.so.1.0.0
7f3c00583000-7f3c00584000 r--p 00008000 08:01 21237216 /lib/x86_64-linux-gnu/libnih-dbus.so.1.0.0
7f3c00584000-7f3c00585000 rw-p 00009000 08:01 21237216 /lib/x86_64-linux-gnu/libnih-dbus.so.1.0.0
7f3c00585000-7f3c0059b000 r-xp 00000000 08:01 21237220 /lib/x86_64-linux-gnu/libnih.so.1.0.0
7f3c0059b000-7f3c0079b000 ---p 00016000 08:01 21237220 /lib/x86_64-linux-gnu/libnih.so.1.0.0
7f3c0079b000-7f3c0079c000 r--p 00016000 08:01 21237220 /lib/x86_64-linux-gnu/libnih.so.1.0.0
Run Code Online (Sandbox Code Playgroud)
接近尾声有类似的东西
7f3c0165b000-7f3c0177e000 rw-p 00000000 00:00 0 [heap]
7fff97863000-7fff97884000 …Run Code Online (Sandbox Code Playgroud) 任何人都可以解释目标"oldconfig"在Linux内核makefile中的作用吗?我看到它在一些构建文档中引用但从未解释它究竟做了什么.
我正在阅读Robert Love的"Linux内核开发",我看到了以下段落:
没有(简单)使用浮点
当用户空间进程使用浮点指令时,内核管理从整数到浮点模式的转换.使用浮点指令时内核必须做的事情因架构而异,但内核通常会捕获陷阱,然后启动从整数到浮点模式的转换.
与用户空间不同,内核不具备对浮点的无缝支持,因为它无法轻易捕获自身.在内核中使用浮点需要手动保存和恢复浮点寄存器以及其他可能的杂务.简短的回答是:不要这样做!除极少数情况外,内核中没有浮点运算.
我从来没有听说过这些"整数"和"浮点"模式.究竟是什么,为什么需要它们?这种区别是否存在于主流硬件架构(例如x86)上,还是特定于某些更奇特的环境?从进程和内核的角度来看,从整数模式到浮点模式的转换到底需要什么?
当我浏览Linux内核时,我找到了一个container_of定义如下的宏:
#define container_of(ptr, type, member) ({ \
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
(type *)( (char *)__mptr - offsetof(type,member) );})
Run Code Online (Sandbox Code Playgroud)
我理解container_of做了什么,但我不明白的是最后一句,也就是说
(type *)( (char *)__mptr - offsetof(type,member) );})
Run Code Online (Sandbox Code Playgroud)
如果我们使用宏如下:
container_of(dev, struct wifi_device, dev);
Run Code Online (Sandbox Code Playgroud)
最后一句的相应部分是:
(struct wifi_device *)( (char *)__mptr - offset(struct wifi_device, dev);
Run Code Online (Sandbox Code Playgroud)
看起来什么都不做.有人可以在这里填补空白吗?
他们之间有什么区别?
我知道u-boot需要uImage格式的内核.
我使用的系统首先从第1阶段加载器启动,然后调用u-boot.我想丢弃u-boot并直接从第1阶段加载器启动.我必须使用哪种类型的内核映像?
linux-kernel ×10
linux ×7
c ×3
assembly ×1
block-device ×1
docker ×1
file-io ×1
gdb ×1
kernel ×1
makefile ×1
scheduling ×1
u-boot ×1
ubuntu ×1
vdso ×1
x86 ×1