linux 2.6 添加系统调用,Arm Linux 2.6.24 添加系统调用

# gedit arch/arm/kernel/sys_arm.c-----------------------------------------------------------asmlinkage long sys_arm_fad

# gedit  arch/arm/kernel/sys_arm.c

-----------------------------------------------------------

asmlinkage long sys_arm_fadvise64_64(int fd, int advice,

loff_t offset, loff_t len)

{

return sys_fadvise64_64(fd, offset, len, advice);

}

asmlinkage int sys_kmd(unsigned int p_addr)

{

printk("p_addr = 0x%x\n", p_addr);

return p_addr;

}

# gedit  include/asm-arm/unistd.h

-----------------------------------------------------------

#define __NR_fallocate            (__NR_SYSCALL_BASE+352)

#define __NR_kmd                 (__NR_SYSCALL_BASE+353)

# gedit arch/arm/kernel/calls.S

-----------------------------------------------------------

CALL(sys_fallocate)

CALL(sys_kmd)

测试提供调用

-----------------------------------------------------------

#define _GNU_SOURCE        /* or _BSD_SOURCE or _SVID_SOURCE */

#include

#include    /* For SYS_xxx definitions */

#define __NR_kmd                 (__NR_SYSCALL_BASE+353)

int kmd (unsigned int p_addr)

{

syscall (__NR_kmd, p_addr);

return 0;

}

int main ()

{

kmd (0x100000);

}

# arm-linux-gcc kmd.c -static

# cp a.out /tftpboot/

# tftp -g -r a.out 192.168.1.160

# ./a.out

p_addr = 0x100000

#if 1

#define DISP_LINE_LEN              (16)

#define MAX_LINE_LENGTH_BYTES     (64)

#define DEFAULT_LINE_LENGTH_BYTES (16)

#define int8_t      char

#define int16_t     short

#define int32_t     long

#define int64_t     long long

#define uint8_t     u_char

#define uint16_t    u_short

#define uint32_t    u_long

#define uint64_t    unsigned long long

#define t_scalar_t  int

#define t_uscalar_t unsigned int

#define uintptr_t   unsigned long

/*

* Print data buffer in hex and ascii form to the terminal.

*

* data reads are buffered so that each memory address is only read once.

* Useful when displaying the contents of volatile registers.

*

* parameters:

*    addr: Starting address to display at start of line

*    data: pointer to data buffer

*    width: data value width.  May be 1, 2, or 4.

*    count: number of values to display

*    linelen: Number of values to print per line; specify 0 for default length

*/

int print_buffer (ulong addr, void *data, uint width, uint count, uint linelen)

{

uint8_t linebuf[MAX_LINE_LENGTH_BYTES];

uint32_t *uip = (void *) linebuf;

uint16_t *usp = (void *) linebuf;

uint8_t  *ucp = (void *) linebuf;

int i;

if (linelen * width > MAX_LINE_LENGTH_BYTES)

linelen = MAX_LINE_LENGTH_BYTES / width;

if (linelen < 1)

linelen = DEFAULT_LINE_LENGTH_BYTES / width;

while (count)

{

printk ("%08lx:", addr);

/* check for overflow condition */

if (count < linelen)

linelen = count;

/* Copy from memory into linebuf and print hex values */

for (i = 0; i < linelen; i++)

{

if (width == 4)

{

uip[i] = *(volatile uint32_t *) data;

printk (" %08x", (unsigned int)uip[i]);

}

else if (width == 2)

{

usp[i] = *(volatile uint16_t *) data;

printk (" %04x", usp[i]);

}

else

{

ucp[i] = *(volatile uint8_t *) data;

printk (" %02x", ucp[i]);

} data += width;

}

#if 0

/* Print data in ASCII characters */

printk ("    ");

for (i = 0; i < linelen * width; i++)

fputc (isprint (ucp[i]) && (ucp[i] < 0x80) ? ucp[i] : '.', stdout);

fputc ('\n', stdout);

#endif

printk("\n");

/* update references */

addr += linelen * width;

count -= linelen;

}

return 0;

}

asmlinkage int sys_kmd(unsigned int v_addr)

{

ulong length = 64, p_addr = 0, size = 4;

if (0 == v_addr)

{

printk("v_addr = %x\n", (unsigned int)v_addr);

return -1;

}

p_addr = virt_to_phys((void *)v_addr);

printk("v_addr   p_addr\n");

printk("%08x %08x\n", (unsigned int)v_addr,

(unsigned int)p_addr);

print_buffer (v_addr, (void *) v_addr, size, length,

DISP_LINE_LEN / size);

return 0;

}

#endif

logo.gif

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值