我注意到一个使用netcat和UDP的奇怪行为.我启动一个侦听UDP端口的netcat实例(实例1):
nc -lu -p 10000
Run Code Online (Sandbox Code Playgroud)
所以我启动另一个netcat实例(实例2)并尝试将数据报发送到我的进程:
nc -u 127.0.0.1 10000
Run Code Online (Sandbox Code Playgroud)
我看到了数据报.但是,如果我关闭实例2并重新启动netcat(实例3):
nc -u 127.0.0.1 10000
Run Code Online (Sandbox Code Playgroud)
我无法在实例1的终端上看到数据报.实际上,操作系统在实例3处为实例2分配了不同的UDP源端口,问题在于:如果我使用相同的instance2源端口(例如50000):
nc -u -p 50000 127.0.0.1 10000
Run Code Online (Sandbox Code Playgroud)
再次,netcat的实例1接收数据报.UDP是一种连接较少的协议,为什么呢?这是标准的netcat行为吗?
我正在尝试浏览页面表以获取linux中的进程.在内核模块中,我实现了以下功能:
static struct page *walk_page_table(unsigned long addr)
{
pgd_t *pgd;
pte_t *ptep, pte;
pud_t *pud;
pmd_t *pmd;
struct page *page = NULL;
struct mm_struct *mm = current->mm;
pgd = pgd_offset(mm, addr);
if (pgd_none(*pgd) || pgd_bad(*pgd))
goto out;
printk(KERN_NOTICE "Valid pgd");
pud = pud_offset(pgd, addr);
if (pud_none(*pud) || pud_bad(*pud))
goto out;
printk(KERN_NOTICE "Valid pud");
pmd = pmd_offset(pud, addr);
if (pmd_none(*pmd) || pmd_bad(*pmd))
goto out;
printk(KERN_NOTICE "Valid pmd");
ptep = pte_offset_map(pmd, addr);
if (!ptep)
goto out;
pte = *ptep;
page = pte_page(pte); …Run Code Online (Sandbox Code Playgroud) 我正在尝试了解更深层次的链接过程和链接器脚本...查看binutils文档我发现了一个简单的链接器脚本实现,我通过添加一些命令进行了改进:
OUTPUT_FORMAT("elf32-i386", "elf32-i386",
"elf32-i386")
OUTPUT_ARCH(i386)
ENTRY(mymain)
SECTIONS
{
. = 0x10000;
.text : { *(.text) }
. = 0x8000000;
.data : { *(.data) }
.bss : { *(.bss) }
}
Run Code Online (Sandbox Code Playgroud)
我的程序是一个非常简单的程序:
void mymain(void)
{
int a;
a++;
}
Run Code Online (Sandbox Code Playgroud)
现在我尝试构建一个可执行文件:
gcc -c main.c
ld -o prog -T my_script.lds main.o
Run Code Online (Sandbox Code Playgroud)
但如果我尝试运行prog它SIGKILL在启动期间收到一个.我知道当编译程序并与命令链接时:
gcc prog.c -o prog
Run Code Online (Sandbox Code Playgroud)
最终的可执行文件是该产品也像其他的目标文件crt1.o,crti.o并crtn.o但对于我的情况?使用此链接描述文件的正确方法是什么?
我有这个非常简单的代码:
#include <stdio.h>
#include <math.h>
int main()
{
long v = 35;
double app = (double)v;
app /= 100;
app = log10(app);
printf("Calculated log10 %lf\n", app);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
此代码在x86上完美运行,但在arm上不起作用,结果为0.00000.一些想法?
其他信息:
操作系统:linux 3.2.27
我使用ct-ng构建arm工具链:arm-unknown-linux-gnueabi-
libc版本2.13
产量gcc -v:
使用内置规格.COLLECT_GCC = arm-unknown-linux-gnueabi-gcc COLLECT_LTO_WRAPPER =/opt/x-tools/arm-unknown-linux-gnueabi/libexec/gcc/arm-unknown-linux-gnueabi/4.5.1/lto-wrapper目标:手臂-unknown-linux-gnueabi配置:/home/mirko/misc/rasppi-ct-ng-files/.build/src/gcc-4.5.1/configure --build = x86_64-build_unknown-linux-gnu --host = x86_64-build_unknown-linux-gnu --target = arm-unknown-linux-gnueabi --prefix =/opt/x-tools/arm-unknown-linux-gnueabi --with-sysroot =/opt/x-tools/arm-unknown-linux-gnueabi/arm-unknown-linux-gnueabi // sys-root --enable-languages = c --disable-multilib --with-pkgversion = crosstool-NG-1.9.3 --enable -__ cxa_atexit --disable-libmudflap --disable-libgomp --disable-libssp --with-host-libstdcxx =' - static-libgcc -Wl,-Bstatic,-lstdc ++, …
在用户空间进程中映射使用kmalloc分配的缓冲区的正确方法是什么?也许我还没有理解内存映射......我编写了一个内核模块来分配这个缓冲区(例如120字节),我会在用户空间进程中读取和写入它.显然我创建了一个char设备并mmap在file_operationsstruct中实现了一个方法.我的方法是:
static int my_mmap(struct file *filp, struct vm_area_struct *vma)
{
//printk(KERN_INFO "Allocated virtual memory length = %d", vma->vm_end - vma->vm_start);
long unsigned int size = vma->vm_end - vma->vm_start;
if (remap_pfn_range(vma, vma->vm_start,
__pa(mem_area) >> PAGE_SHIFT, //what about vma->vm_pgoff?
size,
vma->vm_page_prot) < 0)
return -EAGAIN;
vma->vm_flags |= VM_LOCKED;
vma->vm_ops = &vmops;
vma->vm_flags |= VM_RESERVED;
my_vm_open(vma);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
其中,mem_area在与分配的内存区域指向kmalloc在模块初始化.该区域填充相同的值(例如0x10).一切正常,但我认为这段代码有问题:
kmalloc可以返回一个非页面对齐的指针,在这种情况下,我认为不正确的第三个参数的值remap_pfn_range实际上在用户空间中我读错了值.相反,如果我使用__get_free_page(因为该函数总是返回kmalloc页面对齐的指针)或返回页面对齐指针时所有工作.内存映射适用于多个内存区域PAGE_SIZE,如果我分配整个页面而不是使用kmalloc?
什么时候my_mmap调用,内核已经分配了一些页面呢?我问这个,因为我发现定制的一些实现 …
我有两个内核模块(比如modA和modB).modA导出符号,EXPORT_SYMBOL(symA)modB使用它.我有modA.hmodA 的标题:
...
extern void symA(int param);
...
Run Code Online (Sandbox Code Playgroud)
并在modB.c:
#include "modA.h"
...
static int __init modB_init(void)
{
symA(10);
}
...
Run Code Online (Sandbox Code Playgroud)
如果我的insmodmodB一切正常,我的modB在内核中正确链接,并symA正确调用函数.但是当我构建modB时,编译器会发出警告:symA is undefined.LKM是ELF可重定位的,为什么编译器会发出此警告?怎么可以删除?
我正在尝试net_device在linux中注册一个新的...我可以正确分配和注册它并ifconfig显示它.当我尝试打开界面时,问题就出现了:
ifconfig my_dev up
Run Code Online (Sandbox Code Playgroud)
内核冻结发生......问题仅存在于x86机器上,我无法弄清楚原因......在pcc机器上运行良好.代码很简单:
static struct net_device *my_dev;
static int veth_dev_init(struct net_device *dev);
static int veth_open(struct net_device *dev);
static int veth_close(struct net_device *dev);
static int veth_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd);
static struct veth_priv
{
...
};
static struct net_device_ops veth_ops =
{
.ndo_init = veth_dev_init,
.ndo_open = veth_open,
.ndo_stop = veth_close,
.ndo_do_ioctl = veth_ioctl
};
static int __init veth_init()
{
my_dev = alloc_netdev(sizeof(struct veth_priv), "my_dev", ether_setup);
if (my_dev == NULL)
return -ENOMEM; …Run Code Online (Sandbox Code Playgroud) 在Linux内核源代码中,我看到,在枚举内部,还有一个与enum元素名称相同的定义.linux/rtnetlink.h我们的例子有:
enum {
RTM_BASE = 16,
#define RTM_BASE RTM_BASE
RTM_NEWLINK = 16,
#define RTM_NEWLINK RTM_NEWLINK
RTM_DELLINK,
#define RTM_DELLINK RTM_DELLINK
...
Run Code Online (Sandbox Code Playgroud)
这是什么原因?我无法弄清楚这是如何使用的.
谢谢
我需要获取指向linux中注册的特定设备的指针.简而言之,该设备代表一个mii_bus对象.问题是这个设备似乎不属于总线(它dev->bus是NULL)所以我不能使用例如功能bus_for_each_dev.然而,该设备由Open Firmware层注册,我可以看到相对of_device(我感兴趣的设备的父亲)/sys/bus/of_platform.我的设备也注册了,class所以我可以找到它/sys/class/mdio_bus.现在的问题是:
可以使用指向of_device我们想要的设备的父指针来获取指针吗?
如何通过仅使用名称来获取指向已经实例化的类的指针?如果有可能,我可以迭代该类的设备.
任何其他建议都非常有用!谢谢你们.
我正在尝试创建一个没有gcc的动态链接可执行文件(elf_i386).该程序非常简单(只有printf)...这里的命令:
$ gcc -c simple.c
$ ld -o simple -dynamic-linker /lib/ld-linux.so.2 --entry main /usr/lib/crt1.o /usr/lib/crti.o simple.o -lc /usr/lib/crtn.o
Run Code Online (Sandbox Code Playgroud)
可执行文件被创建,并且文件命令和ldd命令显示正确的输出...但是当我在调用printf后启动程序时我得到了分段错误...我用objdump检查了可执行文件,我认为问题是关于dtors ...似乎编译:
$gcc -o simple simple.c
Run Code Online (Sandbox Code Playgroud)
一个部分.dtors存在,而它不存在于直接用ld创建的可执行文件中:(
有任何想法吗?
linux ×6
linux-kernel ×4
c ×2
gcc ×2
linker ×2
arm ×1
device ×1
device-tree ×1
enums ×1
kernel ×1
ld ×1
mmap ×1
netcat ×1
networking ×1
raspberry-pi ×1
udp ×1