연결된 사서함 목록이 있고 해당 ID를 userspace 변수에 복사하려고하는데 mbxList
올바르게 인쇄되지 않습니다.
asmlinkage long sys_listMailboxes(unsigned long * mbxList,
unsigned long K)
{
int counter = 0;
MBOX * currentBox;
unsigned long * toUser;
list_for_each_entry(currentBox, &mailbox_list, list)
{
if(counter != K)
{
printk("The id is: %lu\n", currentBox->id);
toUser = ¤tBox->id;
copy_to_user(mbxList, toUser, sizeof toUser);
mbxList++;
counter++;
}
}
return counter;
}
커널에서 프린트를 dmesg
확인하면 올바른 출력을 볼 수 있습니다. The id is: 1111
하지만 출력을 시도 할 때 사용자 공간에서 출력을 얻습니다. The id is: 1474660693
이것은 잘못된 것입니다.
이 시스템 호출을 구현하는 C 코드 조각은 다음과 같습니다.
#include <stdio.h>
#include <unistd.h>
#include <syscall.h>
long listMbox(unsigned long * mbxList, unsigned long K)
{
return syscall(__NR_listMailboxes, mbxList, K);
}
int main(void)
{
unsigned long * mbxlist;
unsigned long K = 2;
listMailboxes(mbxlist, K);
int i;
for(i = 0; i < K; i++)
{
printf("Mailbox id is: %lu\n", *mbxList);
mbxList++;
}
}
1474660693
매번 같은 번호를 받기 때문에 메모리 주소라고 생각하지 않습니다. 나는 내가 copy_to_user
너무 큰 크기로 크기를 주장한다고 생각 했지만 그 이후로는 그렇지 않은 것 같습니다. 나는 무엇이 잘못되었는지 전혀 모른다. 어떤 도움을 주시면 감사하겠습니다. 감사합니다!
당신이 사용하고있는 것으로 보인다 sizeof toUser
커널 부분에서 실제로 데이터 복사 지적 에 의해를 toUser
.
그래서 그것은 잘못되었습니다. 포인터 바이트 크기의 int에서 복사하고 있습니다.
sizeof *toUser
괄호가 필요할 수도 있지만 사용하는 것이 좋습니다.sizeof(*toUser)
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다