저는 부팅할 때마다 매우 추악하고 불운한 외계인 얼굴을 보이는 Dell PC를 가지고 있습니다. 이를 변경하거나 영구적으로 비활성화하고 싶지만 Bios에는 옵션이 없습니다.
현재 실행 중인 Linux Fedora 또는 ArchLinux에서 이를 어떻게 변경할 수 있습니까?
다음을 시도해도 작동하지 않습니다. (http://www.pixelbeat.org/docs/bios/)
./flashrom -r firmware.old #save current flash ROM just in case
./flashrom -wv firmware.new #write and verify new flash ROM image
또한 시도했습니다:
$ 고양이 참조
#include <stdio.h>
#include <inttypes.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#define lengthof(x) (sizeof(x)/sizeof(x[0]))
uint16_t checksum(const uint8_t* data, int len)
{
uint16_t sum = 0;
int i;
for (i=0; i<len; i++)
sum+=*(data+i);
return htons(sum);
}
void usage(void)
{
fprintf(stderr,"Usage: therm_limit [0,50,53,56,60,63,66,70]\n");
fprintf(stderr,"Report therm limit of terminal in BIOS\n");
fprintf(stderr,"If temp specifed, it is changed if required.\n");
exit(EXIT_FAILURE);
}
#define CHKSUM_START 51
#define CHKSUM_END 109
#define THERM_OFFSET 67
#define THERM_SHIFT 0
#define THERM_MASK (0x7 << THERM_SHIFT)
#define THERM_OFF 0
uint8_t thermal_limits[]={0,50,53,56,60,63,66,70};
#define THERM_MAX (lengthof(thermal_limits)-1)
#define DEV_NVRAM "/dev/nvram"
#define NVRAM_MAX 114
uint8_t nvram[NVRAM_MAX];
int main(int argc, char* argv[])
{
int therm_request = -1;
if (argc>2) usage();
if (argc==2) {
if (*argv[1]=='-') usage();
therm_request=atoi(argv[1]);
int i;
for (i=0; i<lengthof(thermal_limits); i++)
if (thermal_limits[i]==therm_request)
break;
if (i==lengthof(thermal_limits))
usage();
else
therm_request=i;
}
int fd_nvram=open(DEV_NVRAM, O_RDWR);
if (fd_nvram < 0) {
fprintf(stderr,"Error opening %s [%m]\n", DEV_NVRAM);
exit(EXIT_FAILURE);
}
if (read(fd_nvram, nvram, sizeof(nvram))==-1) {
fprintf(stderr,"Error reading %s [%m]\n", DEV_NVRAM);
close(fd_nvram);
exit(EXIT_FAILURE);
}
uint16_t chksum = *(uint16_t*)(nvram+CHKSUM_END);
printf("%04X\n",chksum); exit(0);
if (chksum == checksum(nvram+CHKSUM_START, CHKSUM_END-CHKSUM_START)) {
uint8_t therm_byte = *(uint16_t*)(nvram+THERM_OFFSET);
uint8_t therm_status=(therm_byte & THERM_MASK) >> THERM_SHIFT;
printf("Current thermal limit: %d°C\n", thermal_limits[therm_status]);
if (
(therm_status == therm_request)
) therm_request=-1;
if (therm_request != -1) {
if (therm_status != therm_request)
printf("Setting thermal limit to %d°C\n", thermal_limits[therm_request]);
uint8_t new_therm_byte = (therm_byte & ~THERM_MASK) | (therm_request << THERM_SHIFT);
*(uint8_t*)(nvram+THERM_OFFSET) = new_therm_byte;
*(uint16_t*)(nvram+CHKSUM_END) = checksum(nvram+CHKSUM_START, CHKSUM_END-CHKSUM_START);
(void) lseek(fd_nvram,0,SEEK_SET);
if (write(fd_nvram, nvram, sizeof(nvram))!=sizeof(nvram)) {
fprintf(stderr,"Error writing %s [%m]\n", DEV_NVRAM);
close(fd_nvram);
exit(EXIT_FAILURE);
}
}
} else {
fprintf(stderr,"checksum failed. Aborting\n");
close(fd_nvram);
exit(EXIT_FAILURE);
}
return EXIT_SUCCESS;
}
$ gcc c.c -o bios
# ./bios
16DB
답변1
귀하가 게시한 코드는 BIOS 스플래시 변경과 전혀 관련이 없습니다(특정 BIOS의 열 재부팅 설정 변경용). 실제로 특정 BIOS를 제외하고는 어떤 경우에도 시스템이 매우 불행해질 것입니다.
일반적으로 하드웨어 공급자가 허용한 경우에만 BIOS 스플래시 이미지를 변경할 수 있습니다. 제가 구입한 많은 마더보드에는 BIOS 이미지 파일과 선택한 이미지를 가져와서 정상적으로 플래시하는 새 BIOS 이미지를 생성하는 유틸리티가 함께 제공된다는 것을 알고 있습니다. 그러나 이것은 일반적으로 OEM에서 제공하는 것입니다.
답변2
Dell의 Command|Configure 유틸리티를 사용하여 이 작업을 수행할 수 있지만 확실하지 않습니다. 그것을 사용하려고 할 때마다 내 시스템에서 충돌이 발생합니다. http://en.community.dell.com/techcenter/enterprise-client/w/wiki/7532.dell-command-configure/
Dell 시스템에 대해 이 작업을 수행하는 데 도움이 되는 유틸리티가 있었지만(Dell에서 발행했는지 아니면 다른 사람이 발행했는지 확실하지 않음) 더 이상 좋은 링크를 찾을 수 없습니다.