小编Mir*_*chi的帖子

netcat与UDP的奇怪行为

我注意到一个使用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行为吗?

networking udp netcat

32
推荐指数
2
解决办法
2万
查看次数

Linux中进程的行走页表

我正在尝试浏览页面表以获取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)

linux kernel linux-kernel

21
推荐指数
2
解决办法
1万
查看次数

如何正确使用简单的链接描述文件?可执行文件在运行时获取SIGKILL

我正在尝试了解更深层次的链接过程和链接器脚本...查看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)

但如果我尝试运行progSIGKILL在启动期间收到一个.我知道当编译程序并与命令链接时:

gcc prog.c -o prog
Run Code Online (Sandbox Code Playgroud)

最终的可执行文件是该产品也像其他的目标文件crt1.o,crti.ocrtn.o但对于我的情况?使用此链接描述文件的正确方法是什么?

linker gcc linker-scripts

19
推荐指数
1
解决办法
2万
查看次数

在Raspberry Pi上的armv6中使用log10数学函数导致错误的结果

我有这个非常简单的代码:

#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 ++, …

c arm raspberry-pi

15
推荐指数
1
解决办法
1379
查看次数

mmap:在用户空间中映射一个用kmalloc分配的内核缓冲区

在用户空间进程中映射使用kmalloc分配的缓冲区的正确方法是什么?也许我还没有理解内存映射......我编写了一个内核模块来分配这个缓冲区(例如120字节),我会在用户空间进程中读取和写入它.显然我创建了一个char设备并mmapfile_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).一切正常,但我认为这段代码有问题:

  1. kmalloc可以返回一个非页面对齐的指针,在这种情况下,我认为不正确的第三个参数的值remap_pfn_range实际上在用户空间中我读错了值.相反,如果我使用__get_free_page(因为该函数总是返回kmalloc页面对齐的指针)或返回页面对齐指针时所有工作.内存映射适用于多个内存区域PAGE_SIZE,如果我分配整个页面而不是使用kmalloc

  2. 什么时候my_mmap调用,内核已经分配了一些页面呢?我问这个,因为我发现定制的一些实现 …

linux mmap linux-device-driver linux-kernel

11
推荐指数
1
解决办法
1万
查看次数

警告构建使用导出符号的内核模块

我有两个内核模块(比如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可重定位的,为什么编译器会发出此警告?怎么可以删除?

linux gcc kernel-module

8
推荐指数
1
解决办法
8778
查看次数

注册新的net_device的正确方法是什么?

我正在尝试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 linux-kernel

7
推荐指数
1
解决办法
4377
查看次数

定义内部枚举

在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)

这是什么原因?我无法弄清楚这是如何使用的.

谢谢

c linux enums

7
推荐指数
2
解决办法
1584
查看次数

在linux中获取指向结构设备指针的更简洁方法是什么?

我需要获取指向linux中注册的特定设备的指针.简而言之,该设备代表一个mii_bus对象.问题是这个设备似乎不属于总线(它dev->busNULL)所以我不能使用例如功能bus_for_each_dev.然而,该设备由Open Firmware层注册,我可以看到相对of_device(我感兴趣的设备的父亲)/sys/bus/of_platform.我的设备也注册了,class所以我可以找到它/sys/class/mdio_bus.现在的问题是:

  1. 可以使用指向of_device我们想要的设备的父指针来获取指针吗?

  2. 如何通过仅使用名称来获取指向已经实例化的类的指针?如果有可能,我可以迭代该类的设备.

任何其他建议都非常有用!谢谢你们.

device linux-device-driver linux-kernel device-tree

4
推荐指数
1
解决办法
2762
查看次数

将动态链接的可执行文件与ld链接

我正在尝试创建一个没有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 linker ld

3
推荐指数
1
解决办法
6706
查看次数